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)可以通过EnvironmentsetDefaultProfiles方法或者spring.profiles.default属性修改。

results matching ""

    No results matching ""