• 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);
  • 相关阅读:
    JDK+MyEclipse+Tomcat配置
    常用数据类型占内存字节数
    连连看核心算法
    gnuplot画图
    socket服务器的搭建-Mac
    AlertController提示框
    block-循环引用
    OC基础(21)
    OC基础(20)
    OC基础(19)
  • 原文地址:https://www.cnblogs.com/tdyang/p/11877265.html
Copyright © 2020-2023  润新知