@Profile:提供可以根据当前环境,动态激活和切换一系列组件的功能;
- 开发环境、测试环境、生产环境;
- 数据源:A/B/C;
@Profile:指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个组件;
- 加了环境标识的bean,只有这个环境被激活的时候才能注册到容器中。默认是default环境;
- 写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效;
- 没有标注环境标识的bean在,任何环境下都是加载的;
根据环境加载数据源
配置文件:dbconfig.properties
db.user=root
db.password=123456
db.driverClass=com.mysql.jdbc.Driver
@PropertySource("classpath:/dbconfig.properties")
@Configuration
public class MainConfigOfProfile {
@Value("${db.user}")
private String user;
@Value("${db.password}")
private String password;
@Value("${db.driverClass}")
private String driverClass;
//@Profile("default")
@Profile("test")
@Bean("dataSourceTest")
public DataSource dataSourceTest() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(password);
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/clouddb01");
dataSource.setDriverClass(driverClass);
return dataSource;
}
@Profile("dev")
@Bean("dataSourceDev")
public DataSource dataSourceDev() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(password);
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/clouddb02");
dataSource.setDriverClass(driverClass);
return dataSource;
}
@Profile("prod")
@Bean("dataSourceProd")
public DataSource dataSourceProd() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(password);
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/clouddb02");
dataSource.setDriverClass(driverClass);
return dataSource;
}
}
测试:
激活环境的两种方式:
1、使用命令行动态参数: 在虚拟机参数位置加载 -Dspring.profiles.active=test
2、代码的方式激活某种环境;
第一种:
public class IOCTest_Profile {
//1、使用命令行动态参数: 在虚拟机参数位置加载 -Dspring.profiles.active=test
@Test
public void test01(){
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfProfile.class);
System.out.println("创建容器完成!");
String[] names = applicationContext.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
}
//打印
dataSourceTest
第二种:
@Test
public void test02(){
//1、创建一个applicationContext
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
//2、设置需要激活的环境
applicationContext.getEnvironment().setActiveProfiles("dev");
//3、注册主配置类
applicationContext.register(MainConfigOfProfile.class);
//4、启动刷新容器
applicationContext.refresh();
System.out.println("创建容器完成!");
String[] names = applicationContext.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
//打印
dataSourceDev