zoukankan      html  css  js  c++  java
  • 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();
        }
    
    }

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

     
  • 相关阅读:
    IIS日志字段详解
    Linux CPU监控指标
    PMP 质量管理新7张图
    PMP 质量管理7张图 很形象
    【MVC model 验证失效 】【Unexpected token u in JSON at position 0】【jquery-plugin-validation】
    VS 忽略文件 Git 向远程添加问题
    .Net Core 知识了解:一跨平台的奥秘
    ios 时间解析 差8个小时
    百度定位转腾讯定位
    需求评审会议分析
  • 原文地址:https://www.cnblogs.com/xingjia/p/11265657.html
Copyright © 2011-2022 走看看