前言
Bean定义配置文件在核心容器中提供了一种机制,允许在不同环境中注册不同的bean。
逻辑1:配置不同的bean的不同环境,激活激活环境
逻辑2:引入属性文件的三种方式
1.13.1。Bean定义配置文件
Bean定义配置文件在核心容器中提供了一种机制,允许在不同环境中注册不同的bean。“环境”这个词对不同的用户来说意味着不同的东西,这个功能可以帮助许多用例,在测试环境中,配置可能类似于以下内容:
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("my-schema.sql")
.addScript("my-test-data.sql")
.build();
}
此应用程序部署到QA或生产环境中
@Bean(destroyMethod="")
public DataSource dataSource() throws Exception {
Context ctx = new InitialContext();
return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
}
问题是如何根据当前环境在使用这两种变体之间切换。
运用 @Profile
通过@Profile 注释,您可以指示当一个或多个指定的配置文件处于活动状态时,组件符合注册条件。使用前面的示例,我们可以dataSource按如下方式重写配置:
@Configuration
@Profile("development")//开发时,使用该bean
public class StandaloneDataConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("classpath:com/bank/config/sql/schema.sql")
.addScript("classpath:com/bank/config/sql/test-data.sql")
.build();
}
}
@Configuration
@Profile("production")//生产中使用该bean
public class JndiDataConfig {
@Bean(destroyMethod="")
public DataSource dataSource() throws Exception {
Context ctx = new InitialContext();
return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
}
}
配置文件字符串可以包含简单的配置文件名称(例如production)或配置文件表达式。概要表达式允许表达更复杂的概要逻辑(例如,production & us-east)。配置文件表达式支持以下运算符:????????????????
- !:配置文件的逻辑“不”
- &:配置文件的逻辑“和”
- |:配置文件的逻辑“或”
可以将其@Profile用作元注释,以创建自定义组合注释<–将多个注释,组合成一个注释–>。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Profile("production")
public @interface Production {
}
@Profile 也可以在方法级别声明只包含配置类的一个特定bean
@Configuration
public class AppConfig {
@Bean("dataSource")
@Profile("development") //该方法仅在development配置文件中可用。
public DataSource standaloneDataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("classpath:com/bank/config/sql/schema.sql")
.addScript("classpath:com/bank/config/sql/test-data.sql")
.build();
}
@Bean("dataSource")
@Profile("production") //该方法仅在production配置文件中可用。
public DataSource jndiDataSource() throws Exception {
Context ctx = new InitialContext();
return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
}
}
XML Bean定义配置文件
XML对应profile属性的元素是<beans>
<beans profile="development"//适用于开发环境
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="...">
<jdbc:embedded-database id="dataSource">
<jdbc:script location="classpath:com/bank/config/sql/schema.sql"/>
<jdbc:script location="classpath:com/bank/config/sql/test-data.sql"/>
</jdbc:embedded-database>
</beans>
<beans profile="production" //适用于生产环境
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="...">
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/datasource"/>
</beans>
也可以将两个环境或者说<beans>
写在同一配置文件中:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="...">
<!-- other bean definitions -->
<beans profile="development">//适用于开发环境
<jdbc:embedded-database id="dataSource">
<jdbc:script location="classpath:com/bank/config/sql/schema.sql"/>
<jdbc:script location="classpath:com/bank/config/sql/test-data.sql"/>
</jdbc:embedded-database>
</beans>
<beans profile="production">//适用于生产环境
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/datasource"/>
</beans>
</beans>
激活配置的环境
激活配置文件可以通过多种方式完成,最直接的方法是以编程方式:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.getEnvironment().setActiveProfiles("development");//激活开发环境
ctx.register(SomeConfig.class, StandaloneDataConfig.class, JndiDataConfig.class);
ctx.refresh();
通过spring.profiles.active属性声明性地激活配置文件,在集成测试中,可以使用 模块中的@ActiveProfiles注释声明活动配置文件spring-test,可以同时激活多个环境:
ctx.getEnvironment().setActiveProfiles("profile1", "profile2");
声明性地,spring.profiles.active可以接受以逗号分隔的配置文件名称列表
-Dspring.profiles.active="profile1,profile2"
默认配置文件
@Configuration
@Profile("default")
public class DefaultDataConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("classpath:com/bank/config/sql/schema.sql")
.build();
}
}
1.13.2。PropertySource抽象化
解释:应该是属性文件的如何加入到配置的环境中!
运用@PropertySource
使用@PropertySource将属性文件加入到配置的环境中(配置文件中)
@Configuration
//加入属性文件
@PropertySource("classpath:/com/myco/app.properties")
//或者这样
@PropertySource("classpath:/com/${my.placeholder:default/path}/app.properties")
//或者在xml文件中,这样加入!!!!
/**
* <beans>
* <import resource="com/bank/service/${customer}-config.xml"/>
* </beans>
**/
public class AppConfig {
@Autowired
Environment env;
@Bean
public TestBean testBean() {
TestBean testBean = new TestBean();
testBean.setName(env.getProperty("testbean.name"));
return testBean;
}
}