3.13.2 XML bean定义profile
XML中的<beans>
元素有一个profile
属性。 上面的示例配置可以重写为两个XML文件,如下所示:
<beans profile="dev"
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>
也可以不用分开2个文件,在同一个XML中配置2个<beans/>
,<beans/>
元素也有profile
属性:
<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="dev">
<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>
The spring-bean.xsd has been constrained to allow such elements only as the last ones in the file. This should help provide flexibility without incurring clutter in the XML files.
spring-bean.xsd
强制允许将profile
元素定义在文件的最后面,这有助于在XML文件中提供灵活的方式而又不引起混乱。
启用 profile
现在我们已经更新了配置,我们仍然需要指定要激活哪个配置文件。 如果我们现在启动我们的示例程序,我们将看到一个NoSuchBeanDefinitionException
抛出,因为容器找不到名为dataSource
的Spring bean。
激活配置文件可以通过几种方式完成,但最直接的是通过ApplicationContext
以编程方式来处理'Environment'API:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.getEnvironment().setActiveProfiles("dev");
ctx.register(SomeConfig.class, StandaloneDataConfig.class, JndiDataConfig.class);
ctx.refresh();
此外,配置文件也可以通过spring.profiles.active
属性声明性地激活,可以通过系统环境变量,JVM系统属性,web.xml
中的servlet上下文参数指定,甚至作为JNDI中的一个条目来设置,参见第3.13.3节“PropertySource抽象” )。在集成测试中,可以通过spring-test
模块中的@ActiveProfiles
注解来声明活动配置文件(参见“使用环境配置文件的上下文配置”一节)。
注意,配置文件不是“二选一”的;你可以一次激活多个配置文件。以编程方式,只需要在setActiveProfiles()
方法提供多个配置文件的名字即可,这里接收的String...
可变参数:
ctx.getEnvironment().setActiveProfiles("profile1", "profile2");
声明式的使用spring.profiles.active
,值可以为逗号分隔的配置文件名列表:
-Dspring.profiles.active="profile1,profile2"
默认profile配置
default 配置文件表示默认开启的profile配置。 考虑以下:
@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();
}
}
如果没有配置文件激活,上面的dataSource
就会被创建。这提供了一种默认的方式。如果有任何一个配置文件启用,default配置就不会生效。
默认配置文件的名字(default
)可以通过Environment
的setDefaultProfiles
方法或者spring.profiles.default
属性修改。