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

 @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

posted @ 2022-06-06 12:21  Dabo丶  阅读(22)  评论(0编辑  收藏  举报