@Profile
通常我们开发一个项目都要经过测试环境,UAT环境的测试后才能发布到生产环境。那就存在一个问题,每个环境的数据库连接地址都不一样,部署每个环境都要改配置,然后重新打包。很明显这样做非常不方便且不合理。Spring提供了一个非常强大的注解@Profile就解决了这种问题。
@Profile根据指定环境决定创建指定环境的bean。
使用
新建DBconfig类
public class DBConfig {
public DBConfig(String address) {
this.address = address;
}
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
使用@Profile注册各个环境的Bean
@Configuration
public class AppConfig {
@Profile("test")
@Bean
public DBConfig dbConfigTest() {
return new DBConfig("192.168.1.122");
}
@Profile("uat")
@Bean
public DBConfig dbConfigUat() {
return new DBConfig("10.11.2.49");
}
@Profile("prod")
@Bean
public DBConfig dbConfigProd() {
return new DBConfig("10.11.1.66");
}
}
初始化容器指定当前环境为uat,然后输出地址
public class Application {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
annotationConfigApplicationContext.getEnvironment().setActiveProfiles("uat");
annotationConfigApplicationContext.register(AppConfig.class);
annotationConfigApplicationContext.refresh();
DBConfig dbConfig = annotationConfigApplicationContext.getBean(DBConfig.class);
System.out.println(dbConfig.getAddress());
}
}
也可以使用idea VM options指定当前环境
注意事项:
- 当没指定当前环境时,所有被@Profile标识的Bean都不会被注册到容器中
- annotationConfigApplicationContext.getEnvironment().setActiveProfiles(“uat”);设置优先级高于VM options
- 如果@Profile标识在类上,那么类上的指定的环境不是当前环境,类里面所有@Profile标识的Bean无论是不是当前环境都不会注册到容器中。