ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

@Profile-指定组件在哪种情况下注册到容器中

2022-06-06 12:32:45  阅读:157  来源: 互联网

标签:Profile applicationContext String driverClass 哪种 pwd mysqldb dataSource 组件


 @Profile:
Spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能;

@Profile:指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个组件
1)、加了环境标识的bean,只有这个环境被激活的时候才能注册到容器中。默认是default环境
2)、写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效
3)、没有标注环境标识的bean在,任何环境下都是加载的;

配置类

/**
 * 下面有三种从配置文件中获取值的方法
 */
@PropertySource("classpath:/datasourcer.properties")
@Component
public class MyDataSource implements EmbeddedValueResolverAware {

    @Value("${mysqldb.user}")
    private String user;

    @Value("${mysqldb.testurl}")
    private String testurl;

    @Value("${mysqldb.devurl}")
    private String devurl;

    @Value("${mysqldb.produrl}")
    private String produrl;

    private String driverClass;

    /**
     * 测试环境数据库
     * @param pwd
     * @return
     * @throws PropertyVetoException
     */
    @Profile("test")
    @Bean
    public DataSource testDataSource(@Value("${mysqldb.pwd}") String pwd) throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl(testurl);
        dataSource.setDriverClass(driverClass);
        return dataSource;
    }
    /**
     * 开发环境数据库
     * @param pwd
     * @return
     * @throws PropertyVetoException
     */
    @Profile("dev")
    @Bean
    public DataSource devDataSource(@Value("${mysqldb.pwd}") String pwd) throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl(devurl);
        dataSource.setDriverClass(driverClass);
        return dataSource;
    }
    /**
     * 生产环境数据库
     * @param pwd
     * @return
     * @throws PropertyVetoException
     */
    @Profile("prod")
    @Bean
    public DataSource prodDataSource(@Value("${mysqldb.pwd}") String pwd) throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl(produrl);
        dataSource.setDriverClass(driverClass);
        return dataSource;
    }

    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        String driverClass = resolver.resolveStringValue("${mysqldb.driverClass}");
        this.driverClass = driverClass;
    }
}
@Configuration
@Import({MyDataSource.class})
public class MyConfig1 {

}
#这里是yml或properties配置文件内容
mysqldb.user =root mysqldb.pwd=1 mysqldb.driverClass =com.mysql.jdbc.Driver mysqldb.testurl =jdbc:mysql://localhost:3306/test_test mysqldb.devurl =jdbc:mysql://localhost:3306/dev_test mysqldb.produrl =jdbc:mysql://localhost:3306/prod_test

输出 先配置环境 有三种方法 

1).在properties中配置
spring.profiles.active=dev

输出代码

@Test
    public void test2() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig1.class);
        String[] beanNamesForType = applicationContext.getBeanDefinitionNames();
        for (String name:beanNamesForType) {
            System.out.println(name);
        }
    }

输出结果

 

 2).在虚拟机参数位置赋值
-Dspring.profiles.active=test

 

 输出代码

 @Test
    public void test2() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig1.class);
        String[] beanNamesForType = applicationContext.getBeanDefinitionNames();
        for (String name:beanNamesForType) {
            System.out.println(name);
        }
    }

输出结果

 

 3).写代码方式激活

输出代码

@Test
    public void test1() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        //1、创建一个applicationContext
        //2、设置需要激活的环境
        // setActiveProfiles("prod","test") 可以设置多个值
        applicationContext.getEnvironment().setActiveProfiles("prod");
        //3、注册主配置类
        applicationContext.register(MyConfig1.class);
        //4、启动刷新容器
        applicationContext.refresh();
        String[] beanNamesForType = applicationContext.getBeanDefinitionNames();
        for (String name:beanNamesForType) {
            System.out.println(name);
        }
    }

输出结果

 

 

 

注意:3) > 2) > 1)

3覆盖2和1 2覆盖1

标签:Profile,applicationContext,String,driverClass,哪种,pwd,mysqldb,dataSource,组件
来源: https://www.cnblogs.com/dabo-tian/p/16347769.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有