Spring注解开发第十二讲--@Profile注解讲解

@Profile:
    Spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能;
我们以数据源为例,例如我们想在开发环境使用A数据源,测试环境使用B数据源,上线以后环境使用C数据源.
那么使用@Profile注解可以帮我们实现这个需求.
首先编写配置文件将我们的数据库配置添加到配置文件中,代码如下;
dbconfig.properties
db.user=root
db.password=123456
db.driverClass=com.mysql.jdbc.Driver

创建主配置类,代码如下:

@PropertySource("classpath:/dbconfig.properties")
@Configuration
public class MainConfigOfProfile implements EmbeddedValueResolverAware{
    
    @Value("${db.user}")
    private String user;
    
    private StringValueResolver valueResolver;
    
    private String  driverClass;
    
    
    @Bean//任何环境下都能加载
    public Yellow yellow(){
        return new Yellow();
    }
    
    @Profile("test")//测试环境才加载
    @Bean("testDataSource")
    public DataSource dataSourceTest(@Value("${db.password}")String pwd) throws Exception{
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setDriverClass(driverClass);
        return dataSource;
    }
    
    
    @Profile("dev")//开发环境标识
    @Bean("devDataSource")
    public DataSource dataSourceDev(@Value("${db.password}")String pwd) throws Exception{
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/ssm_crud");
        dataSource.setDriverClass(driverClass);
        return dataSource;
    }
    
    @Profile("prod")//生产环境标识
    @Bean("prodDataSource")
    public DataSource dataSourceProd(@Value("${db.password}")String pwd) throws Exception{
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/scw_0515");
        
        dataSource.setDriverClass(driverClass);
        return dataSource;
    }

    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        // TODO Auto-generated method stub
        this.valueResolver = resolver;
        driverClass = valueResolver.resolveStringValue("${db.driverClass}");
    }

}
@Profile:指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个组件
  1)、加了环境标识的bean,只有这个环境被激活的时候才能注册到容器中。默认是default环境
  2)、写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效
  3)、没有标注环境标识的bean在,任何环境下都是加载的;
运行测试类并制定环境;切换环境的时候 介绍了两种方法,代码如下:
public class IOCTest_Profile {
    
    //1、使用命令行动态参数: 在虚拟机参数位置加载 -Dspring.profiles.active=test
    //2、代码的方式激活某种环境;
    @Test
    public void test01(){
        AnnotationConfigApplicationContext applicationContext = 
                new AnnotationConfigApplicationContext();
        //1、创建一个applicationContext
        //2、设置需要激活的环境
        applicationContext.getEnvironment().setActiveProfiles("dev");
        //3、注册主配置类
        applicationContext.register(MainConfigOfProfile.class);
        //4、启动刷新容器
        applicationContext.refresh();
        
        
        String[] namesForType = applicationContext.getBeanNamesForType(DataSource.class);
        for (String string : namesForType) {
            System.out.println(string);
        }
        
        Yellow bean = applicationContext.getBean(Yellow.class);
        System.out.println(bean);
        applicationContext.close();
    }

}

注意:在使用第二种方式的时候,不能使用获取容器的有参构造器

 
posted @ 2019-07-29 18:26  焦糖毛嗑  阅读(368)  评论(0编辑  收藏  举报