Environment
在spring中, Environment
是对应用环境的抽象(即对Profile
和properties
的抽象).
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
属性.有以下几种方式:
- 系统环境变量
- JVM系统属性
命令行参数指定
-Dspring.profiles.active="profile1,profile2"
- web.xml定义servlet context参数
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</context-param>
- JNDI实体
- 默认定义
在没有指定spring.profiles.active
的情况下, spring会使用一个默认值,即default
.可以自定义这个值: 一是通过Environment
的setDefaultProfiles()
定义; 二是通过spring.profiles.default
定义. 具体使用方法同上.
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>
网友评论