在容器中如果存在同一类型的多个组件,也可以使用@Profile注解标识要获取的是哪一个bean,这在不同的环境使用不同的变量的情景特别有用。例如,开发环境、测试环境、生产环境使用不同的数据源,在不改变代码的情况下,可以使用这个注解来切换要连接的数据库。
 
 
步骤如下: 
1. 在bean上加@Profile注解,其value属性值为环境标识,可以自定义;
2. 使用无参构造方法创建容器
3. 设置容器环境,其值为第1步设置的环境标识
4. 设置容器的配置类
5. 刷新容器
 
注:2、4、5步其实是带参构造方法的步骤,相当于把带参构造方法拆开,在其中插入一条语句设置容器环境,详spring源码
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
this();
register(annotatedClasses);
refresh();
}
以下是在不同环境下不同的数据源组件的示例

/**
* 容器配置类
* 用于测试@Profile注解
*/
@Configuration
@PropertySource(value = {"classpath:/dbconfig.properties"})
public class ProfileBeanConfig implements EmbeddedValueResolverAware { //数据库连接用户名
@Value(value = "${jdbc.username}")
private String username;
//数据库连接密码
private String password; //开发环境数据源
@Bean(value = "dataSourceDev")
@Profile(value = "dev")
public DataSource dataSourceDev(@Value("${jdbc.driverClass}") String driverClass) throws PropertyVetoException {
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
comboPooledDataSource.setUser(this.username);
comboPooledDataSource.setPassword(this.password);
comboPooledDataSource.setDriverClass(driverClass);
comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/dev");
return comboPooledDataSource;
} //测试环境数据源
@Bean(value = "dataSourceTest")
@Profile("test")
public DataSource dataSourceTest(@Value("${jdbc.driverClass}") String driverClass) throws PropertyVetoException {
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
comboPooledDataSource.setUser(this.username);
comboPooledDataSource.setPassword(this.password);
comboPooledDataSource.setDriverClass(driverClass);
comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
return comboPooledDataSource;
} //生产环境数据源
@Bean(value = "dataSourceProduction")
@Profile("production")
public DataSource dataSourceProduction(@Value("${jdbc.driverClass}") String driverClass) throws PropertyVetoException {
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
comboPooledDataSource.setUser(this.username);
comboPooledDataSource.setPassword(this.password);
comboPooledDataSource.setDriverClass(driverClass);
comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/production");
return comboPooledDataSource;
} //获取字符串解析器
@Override
public void setEmbeddedValueResolver(StringValueResolver resolver) {
//解析配置文件,然后对数据库连接密码进行赋值
this.password = resolver.resolveStringValue("jdbc.password");
}
}
以下是切换数据源示例

//创建匿名容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
//设置环境,其值为@Profile注解的属性值
applicationContext.getEnvironment().setActiveProfiles("test");
//注册容器类
applicationContext.register(ProfileBeanConfig.class);
//刷新容器
applicationContext.refresh();

最新文章

  1. CentOS7安装docker
  2. http://www.sqlservercentral.com/articles/Failover+Clustered+Instance+(FCI)/92196/
  3. Android 异步消息处理机制解析
  4. 我的grub.cfg配置文件
  5. 003.ASP.NET MVC集中管理Session
  6. Jquery小东西收集
  7. Fragment的简单使用
  8. C / C++算法学习笔记(7)-双向冒泡
  9. Spring的bean管理(注解)
  10. Andrew Ng机器学习课程笔记--week2(多元线性回归&amp;正规公式)
  11. Python爬虫学习之使用beautifulsoup爬取招聘网站信息
  12. (NO.00001)iOS游戏SpeedBoy Lite成形记(一)
  13. Pytorch学习(一)基础语法篇
  14. 算法(第四版)C# 习题题解——2.2
  15. 浅谈基于Prism的软件系统的架构设计
  16. MySQL 命令(导出数据):mysqldump
  17. [java] 求2个集合的交 差 并集
  18. Linux 在文档中查找满足条件的行并输出到文件:
  19. 关于configure: error: no acceptable C compiler found in $PATH
  20. springbatch----&gt;springbatch的使用(六)

热门文章

  1. 剑指offer-两个链表的第一个公共结点-链表-python
  2. WPF拖拽文件(拖入拖出),监控拖拽到哪个位置,类似百度网盘拖拽
  3. GitHub入门使用
  4. EL&amp;JSTL笔记
  5. Redis怎么做持久化
  6. Win10 + Ubuntu 安装教程(痛苦踩坑)
  7. Flask 框架app = Flask(__name__) 解析
  8. pandas的数据统计函数
  9. 一、MyBatis基本使用,包括xml方式、注解方式、及动态SQL
  10. apache-2.4.x 编译安装方法