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);
  • 相关阅读:
    简单的排序算法总结
    Android Stuido 方法参数 p0,p1
    年与酒
    Android-自定义View前传-View的三大流程-Layout
    Android自定义View前传-View的三大流程-Measure
    寻找积极
    括号配对问题
    Wan Android 项目总结
    涂鸦之作WanAndroid第三方APP
    CSS-定位(Position)
  • 原文地址:https://www.cnblogs.com/tdyang/p/11877265.html
Copyright © 2011-2022 走看看