本文知识点来源于尚硅谷,感谢尚硅谷为广大学子提供的优质教育资源,感谢各位老师热情指导,本文仅作为学习笔记使用,记录学习心得,如有不适,请联系作者。
Spring 为我们提供的可以根据当前环境,动态的激活和切换一系列bean的功能。
指定组件在哪个环境下才能被注册到容器中,不指定,任何环境下都能注册 。
加了环境标识的bean,只有这个环境被激活的时候才能注册到容器中 默认是default环境。
已切换数据源为例:
导包:
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
配置类如下:
/**
*@Profile
* 可加在类上,全局配置
* 也可加在方法上单独配置
*/
@Configuration
public class MainConfigOfProfile {
//@Profile("Test")
@Bean
public DataSource dataSourceTest() throws Exception {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser("root");
dataSource.setPassword("123456");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mmall");
dataSource.setDriverClass("com.mysql.jdbc.Driver");
return dataSource;
}
//@Profile("Dev")
@Bean
public DataSource dataSourceDev() throws Exception {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser("root");
dataSource.setPassword("123456");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/tedu_store");
dataSource.setDriverClass("com.mysql.jdbc.Driver");
return dataSource;
}
//@Profile("Prod")
@Bean
public DataSource dataSourceProd() throws Exception {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser("root");
dataSource.setPassword("123456");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/sso");
dataSource.setDriverClass("com.mysql.jdbc.Driver");
return dataSource;
}
}
测试方法如下:
@Test
public void test() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfProfile.class);
String[] beanNames = applicationContext.getBeanNamesForType(DataSource.class);
for (String beanName : beanNames) {
System.out.println(beanName);
}
}
没有加环境标识的bean,都会添加到容器管理
dataSourceTest
dataSourceDev
dataSourceProd
如何指定环境加载呢?
方式一:
可以启动的时候指定**-Dspring.profiles.active=Test**
输出:
dataSourceTest
方式二:
代码方式激活:
放开配置类中的@Profile注释,修改测试类:
@Test
public void test() {
// 1.创建IOC容器,使用无参构造器,防止refresh()刷新
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
// 2.设置需要激活的环境
applicationContext.getEnvironment().setActiveProfiles("Test", "Dev");
// 3.注册主配置类
applicationContext.register(MainConfigOfProfile.class);
// 4.启动刷新容器
applicationContext.refresh();
String[] beanNames = applicationContext.getBeanNamesForType(DataSource.class);
for (String beanName : beanNames) {
System.out.println(beanName);
}
}
输出:
dataSourceTest
dataSourceDev