spring Profile定义

2019-06-20  本文已影响0人  xzz4632

Environment

在spring中, Environment是对应用环境的抽象(即对Profileproperties的抽象).

Profile

Profile定义了应用环境,即开发, 生产, 测试等部署环境的抽象.

定义容器当前的profile
编程式

通过Environment API:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); //ApplicationContext实现类
// Environment API, 参数为String可变数组
ctx.getEnvironment().setActiveProfiles("dev");
ctx.register(Config.class);
ctx.refresh();  
声明式

声明式方式是指配置spring.profiles.active属性.有以下几种方式:

-Dspring.profiles.active="profile1,profile2"
    <context-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>dev</param-value>
    </context-param>
profile配置

profile的配置方式有两种, 一是java注解配置, 二是xml配置

@Profile配置

@Profile可以用在上, 还可以用在方法上. 用于在不同的环境加载不同的配置.
示例

@Configuration
@Profile("development")
public class StandaloneDataConfig {

}
@Configuration
public class AppConfig {

    @Bean("dataSource")
    @Profile("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")
    public DataSource jndiDataSource() throws Exception {
        Context ctx = new InitialContext();
        return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
    }
}

注1: 用于方法上时, 可能是在不同环境对同一个bean的加载, 由于类中不允许存在签名完全相同的方法, 故可用@Bean("beanName")来定义不同的方法指向同一个bean.
注2: 如果一个配置类中有多个@Bean重载方法. 在所有的重载方法上定义的@Profile注解定义应当一致,否则只有第一个声明有效.

!符号使用
@Profile注解中还可以使用!符号, 如@Profile({"p1", "!p2"}), 表示在p1激活, p2没有激活时注册它们.

XML配置

通过<beans>元素的profile属性来定义, <beans>元素可嵌套, 即可将分开定义的xml定义在同一个xml文件中.但定义在同一个xml中最相关的<beans>元素放在xml文件最后.

<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">
      <!-- bean定义 -->
    </beans>

    <beans profile="production">
      <!-- bean定义 -->
    </beans>
</beans>
上一篇下一篇

猜你喜欢

热点阅读