zoukankan      html  css  js  c++  java
  • spring中@Profile的作用

    根据系统环境的不同,Profile可以用来切换数据源。例如切换开发,测试,生产环境的数据源。

    举个例子:

    先创建配置类MainProfileConfig:

    @Configuration
    @PropertySource("classpath:/jdbc.properties")
    public class MainProfileConfig implements EmbeddedValueResolverAware {
    
        @Value("${db.user}")
        private String user;
    
        private String driverClass;
    
        private StringValueResolver stringValueResolver;
    
        @Profile("test")
        @Bean("testDataSource")
        public  DataSource getTestDataSource(@Value("${db.password}") String pwd) throws PropertyVetoException {
            ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
            comboPooledDataSource.setUser(user);
            comboPooledDataSource.setPassword(pwd);
            comboPooledDataSource.setDriverClass(driverClass);
            return comboPooledDataSource;
        }
    
        @Profile("dev")
        @Bean("devDataSource")
        public  DataSource getDevDataSource(@Value("${db.password}") String pwd) throws PropertyVetoException {
            ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
            comboPooledDataSource.setUser(user);
            comboPooledDataSource.setPassword(pwd);
            comboPooledDataSource.setDriverClass(driverClass);
            return comboPooledDataSource;
        }
    
        @Profile("pro")
        @Bean("proDataSource")
        public  DataSource getproDataSource(@Value("${db.password}") String pwd) throws PropertyVetoException {
            ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
            comboPooledDataSource.setUser(user);
            comboPooledDataSource.setPassword(pwd);
            comboPooledDataSource.setDriverClass(driverClass);
            return comboPooledDataSource;
        }
    
        @Override
        public void setEmbeddedValueResolver(StringValueResolver stringValueResolver) {
            this.stringValueResolver = stringValueResolver;
            driverClass = stringValueResolver.resolveStringValue("${db.driverClass}");
        }
    }

    这里使用@Value和StringValueResolver来给属性赋值

    测试:运行的时候设置环境   -Dspring.profiles.active=dev

    public class ProFileTest {
    
        @Test
        public void  test(){
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainProfileConfig.class);
    
            String[] beanNamesForType = applicationContext.getBeanNamesForType(DataSource.class);
            for (String name : beanNamesForType){
                System.out.println(name);
            }
            applicationContext.close();
        }
    }

    打印输出:

    devDataSource

    也可以使用代码的方式设置系统环境,创建容器的时候使用无参构造方法,然后设置属性。

    @Test
        public void  test(){
            //创建容器
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
            //设置需要激活的环境
            applicationContext.getEnvironment().setActiveProfiles("test");
            //设置主配置类
            applicationContext.register(MainProfileConfig.class);
            //启动刷新容器
            applicationContext.refresh();
    
            String[] beanNamesForType = applicationContext.getBeanNamesForType(DataSource.class);
            for (String name : beanNamesForType){
                System.out.println(name);
            }
            applicationContext.close();
        }

    打印输出:

    testDataSource

    setActiveProfiles设置环境的时候可以传入多个值,它的方法可以接受多个参数。
    public interface ConfigurableEnvironment extends Environment, ConfigurablePropertyResolver {
        void setActiveProfiles(String... var1);
  • 相关阅读:
    硬件基础---拆装机
    Dynamics CRM 2015 Update 1 系列(4): 自己定义主键
    Heroku第三方服务接入指南(二)
    ssh 免密登录
    CentOS 7 NAT软路由
    Nginx升级
    挖矿病毒
    安装 epel-release
    hydra 安装和使用
    Linux 安全信息查看
  • 原文地址:https://www.cnblogs.com/tdyang/p/11877265.html
Copyright © 2011-2022 走看看