spring之Environment

spring 的Environment包含两方便的抽象,profile和 property

前者是一组bean的定义,只有相应的profile被激活的情况下才会起作用。

后者是提供方便的抽象,应用程序可以方便的访问 system property 环境变量自定义属性等。

Profile

想象这样一种情况,在软件开发的过程中有开发环境和正式环境,他们使用的数据源不同,怎么才能做到无缝切换呢。也就是说怎么让Spring容器在不同的条件下注册不同的Bean。比如说生产环境和测试的环境的数据源。

传统做法

在spring3.0以前我们可以这么做,把这些不同环境的bean定义在不同的xml文件中,然后采用import标签配合PropertySourcesPlaceholderConfigurer导入不同的配置。

如下一个示例:

<import resource="com/test/dao/dao-${test}.xml" />

上面这个示例要使之工作,需要在spring容器启动之前在System property和环境变量中添加test. 不能使用PropertySourcesPlaceholderConfigurer,因为其在spring 容器加载bean定义后才加载。具体有以下几种方式:

1.     带参数启动。启动程序中传入property。如下:

-Dtest=test

2.     在程序中编码添加

// key 和value 均可以从配置文件读取

String key = "test";

String value = "test";

Properties pp = System.getProperties();

pp.put(key, value);

使用profile

以上的机制的好坏暂且不谈,但是有一点是不同的团队拥有不同的方案,而且配置文件分散,spring的profile提供统一的解决方案。

Profile是<beans>标签的一个属性,定义了一组bean属于同一个profile,如下定义了三组bean,隶属于不同的profile,可以看到beans标签可以嵌套,这样就可以把不同的配置放在一起。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd"
    >  

    <beans profile="qa">  

       <bean id="userDao" class="com.test.dao.UserDaoImp">
       </bean>  

       <bean id="userDao1" class="com.test.dao.UserDaoImp">
           <qualifier type="com.test.service.MyQualify" value="userMy" />
       </bean>
    </beans>  

    <beans profile="test">  

       <bean id="userDao" class="com.test.dao.UserDaoImp">
       </bean>  

       <bean id="userDao1" class="com.test.dao.UserDaoImp">
           <qualifier type="com.test.service.MyQualify" value="userMy" />
       </bean>
    </beans>  

    <beans profile="default">  

       <bean id="userDao" class="com.test.dao.UserDaoImp">
       </bean>  

       <bean id="userDao1" class="com.test.dao.UserDaoImp">
           <qualifier type="com.test.service.MyQualify" value="userMy" />
       </bean>
    </beans>
</beans>

启用profile

要启用一个profile,可以有以下几种方式:

1.   使用代码

context.getEnvironment().setActiveProfiles("test");

context.refresh();

2.     使用默认的

如上节配置的profile,最后一个名字是default。

3.     启动时传入参数。

-Dspring.profiles.active="profile1,profile2"

注解

有相关的注解@profile,,这也是一个元注解。用法见spring官方文档。

Property

Spring的Environment可以方便的访问property属性,包含系统属性,环境变量和自定义的。

并且是可配置的,可以加入自定义的property,这基于spring使用PropertySources 来管理不同的PropertySource

       ApplicationContext ctx = new GenericApplicationContext();
       Environment env = ctx.getEnvironment();
       boolean containsFoo = env.containsProperty("foo");
       System.out.println("Does my environment contain the ‘foo‘ property? " + containsFoo);  

       MutablePropertySources sources = context.getEnvironment().getPropertySources();
       sources.addFirst(new MypropertySource()); 

当然可以使用使用注解@PropertySource

时间: 2024-12-11 13:38:30

spring之Environment的相关文章

spring boot environment加载过程分析

environment是在printBanner之前就初始化好了, 更在context创建之前, 已经加载application-xxxx.properties, System.properties, System.environment ... 也可以自己监听应用启动 SpringApplicationRunListener事件, 完成自己的独特的配置加载方案 启动后调用listener.finished() 打印一些启动后的信息 prepareEnvironment()源码如下 1 priv

Spring Boot启动流程详解(一)

环境 本文基于Spring Boot版本1.3.3, 使用了spring-boot-starter-web. 配置完成后,编写了代码如下: @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } @RestController public class RootCont

翻译 Spring Boot How To

Spring Boot How To 1. 简介 本章节将回答一些常见的"我该怎么做"类型的问题,这些问题在我们使用Spring Boot时经常遇到.这绝不是一个详尽的列表,但它覆盖了很多方面. 如果遇到一个特殊的我们没有覆盖的问题,你可能想去查看stackoverflow.com 2. Spring Boot应用 2.1. 解决自动配置问题 Spring Boot自动配置总是尝试尽最大努力去做正确的事,但有时候会失败并且很难说出失败原因. 在每个Spring Boot Applica

Spring实战3:装配bean的进阶知识

主要内容: Environments and profiles Conditional bean declaration 处理自动装配的歧义 bean的作用域 The Spring Expression Language 在装配bean—依赖注入的本质一文中,我们探讨了Spring的三种管理bean的方式:自动装配.基于JavaConfig.基于XML文件.这篇文字将探讨一些Spring中关于bean的管理的高级知识,这些技能你可能不会每天都用,但是非常重要. 3.1 Environments

Spring中基于Java的容器配置(二)

使用@Configuration注解 @Configuration注解是一个类级别的注解,表明该对象是用来指定Bean的定义的.@Configuration注解的类通过@Bean注解的方法来声明Bean.通过调用注解了@Bean方法的返回的Bean可以用来构建Bean之间的相互依赖关系,可以通过前文来了解其基本概念. 注入inter-bean依赖 当@Bean方法依赖于其他的Bean的时候,可以通过在另一个方法中调用即可. @Configuration public class AppConfi

Spring Boot特性(转)

摘要: 1. SpringApplication SpringApplication 类是启动 Spring Boot 应用的入口类,你可以创建一个包含 main() 方法的类,来运行 SpringApplication.run 这个静态方法: public static void main(String... 1. SpringApplication SpringApplication 类是启动 Spring Boot 应用的入口类,你可以创建一个包含 main() 方法的类,来运行 Spri

Configure swagger with spring boot

If you haven’t starting working with spring boot yet, you will quickly find that it pulls out all the common configuration from across your applications. Recently I helped in an effort to modularize configuration and worked on creating a spring-boot-

Chapter 4: Spring and AOP:Spring&#39;s AOP Framework

Spring's AOP Framework Let's begin by looking at Spring's own AOP framework — a proxy-based framework that works in pure Java. You can use it in any application server and all the required classes are included in the Spring distribution. Although man

spring源码分析之&lt;context:property-placeholder/&gt;和&lt;property-override/&gt;

在一个spring xml配置文件中,NamespaceHandler是DefaultBeanDefinitionDocumentReader用来处理自定义命名空间的基础接口.其层次结构如下: <context>为开头的标签统一在ContextNamespaceHandler中进行解析,ContextNamespaceHandler继承了NamespaceHandlerSupport,实现了NamespaceHandler接口.其解析的标签有: @Override public void in