Spring注解学习_自动装配4_@Profile
@Profile:Spring为我们提供的可以根据当前环境,动态激活和切换一系列组件的功能
比如我们可以根据开发环境、测试环境、生产环境 切换不同的组件。
本例中我们用@Profile来决定运行时使用的数据源:
先新建配置类:MainConfigOfProfile.java:
@Configuration
@PropertySource("classpath:/dbconfig.properties")
public class MainConfigOfProfile {
@Value("${db.user}")
private String user;
@Value("${db.password}")
private String pwd;
@Value("${db.driverClass}")
private String driver;
@Bean("testDataSource")
public DataSource dataSourceTest() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(pwd);
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/labs");
dataSource.setDriverClass(driver);
return dataSource;
}
@Bean("devDataSource")
public DataSource dataSourceDev() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(pwd);
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/gmall");
dataSource.setDriverClass(driver);
return dataSource;
}
@Bean("prodDataSource")
public DataSource dataSourceProd() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(pwd);
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mybatis");
dataSource.setDriverClass(driver);
return dataSource;
}
}
对应地在resource目录下创建配置文件:dbconfig.properties:
db.user=root
db.password=123456
db.driverClass=com.mysql.cj.jdbc.Driver
测试一下:
public class IOCTest_Profile {
@Test
public void test1(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfigOfProfile.class);
String[] beanNamesForType = context.getBeanNamesForType(DataSource.class);
for (String s : beanNamesForType) {
System.out.println(s);
}
}
}
所有Bean都被正常加载:
¶@Profile
@Profile: 指定组件在哪个环境的情况下才能被注入到容器中。若不指定,该组件在任何环境下都能被注入到容器。
-
加了环境标识的bean,只有当这个环境被激活时才能注册到容器中。默认为@Profile(“default”)
-
如何激活对应环境:
-
使用命令行动态参数:在虚拟机参数位置加载 -Dspring.profiles.active=test
-
使用代码方式设置需要激活的环境:
//要指定环境,容器需要使用无参构造 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); //激活环境 context.getEnvironment().setActiveProfiles("dev","test"); //注册配置类 context.register(MainConfigOfProfile.class); //启动刷新容器 context.refresh();
-
-
@Profile也可以标注在配置类上,当指定的环境激活时,该配置类里的所有配置才能生效
-
没有标注@Profile的Bean,在任何环境下都是加载的。
为各个数据源标注环境:
@Configuration
@PropertySource("classpath:/dbconfig.properties")
public class MainConfigOfProfile {
...
@Profile("test")
@Bean("testDataSource")
public DataSource dataSourceTest() throws PropertyVetoException {
...
}
@Profile("dev")
@Bean("devDataSource")
public DataSource dataSourceDev() throws PropertyVetoException {
...
}
@Profile("prod")
@Bean("prodDataSource")
public DataSource dataSourceProd() throws PropertyVetoException {
...
}
}
不开启对应环境时无法加载指定的Bean:
1️⃣ 使用命令行参数激活test环境:
此时的测试结果:
2️⃣ 在代码中指定激活环境:
public class IOCTest_Profile {
@Test
public void test1(){
//要指定环境,容器需要使用无参构造
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
//激活环境
context.getEnvironment().setActiveProfiles("dev","test");
//注册配置类
context.register(MainConfigOfProfile.class);
//启动刷新容器
context.refresh();
String[] beanNamesForType = context.getBeanNamesForType(DataSource.class);
for (String s : beanNamesForType) {
System.out.println(s);
}
context.close();
}
}
运行测试,结果为:
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,邮件至 708801794@qq.com
文章标题:Spring注解学习_自动装配4_@Profile
文章字数:695
本文作者:梅罢葛
发布时间:2020-04-03, 16:47:50
最后更新:2020-04-03, 18:43:09
原始链接:https://qiurungeng.github.io/2020/04/03/Spring%E6%B3%A8%E8%A7%A3%E5%AD%A6%E4%B9%A0-%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D4-Profile/