Spring注解学习_自动装配4_@Profile

  1. @Profile

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

比如我们可以根据开发环境、测试环境、生产环境 切换不同的组件。


本例中我们用@Profile来决定运行时使用的数据源:

先新建配置类:MainConfigOfProfile.java:

@Configuration
@PropertySource("classpath:/dbconfig.properties")
public class MainConfigOfProfile {
    @Value("${db.user}")
    private String user;
    @Value("${db.password}")
    private String pwd;
    @Value("${db.driverClass}")
    private String driver;

    @Bean("testDataSource")
    public DataSource dataSourceTest() throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/labs");
        dataSource.setDriverClass(driver);
        return dataSource;
    }
    @Bean("devDataSource")
    public DataSource dataSourceDev() throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/gmall");
        dataSource.setDriverClass(driver);
        return dataSource;
    }
    @Bean("prodDataSource")
    public DataSource dataSourceProd() throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mybatis");
        dataSource.setDriverClass(driver);
        return dataSource;
    }

}

对应地在resource目录下创建配置文件:dbconfig.properties:

db.user=root
db.password=123456
db.driverClass=com.mysql.cj.jdbc.Driver

测试一下:

public class IOCTest_Profile {
    @Test
    public void test1(){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfigOfProfile.class);
        String[] beanNamesForType = context.getBeanNamesForType(DataSource.class);
        for (String s : beanNamesForType) {
            System.out.println(s);
        }
    }
}

所有Bean都被正常加载:

image-20200403180546637

@Profile

@Profile: 指定组件在哪个环境的情况下才能被注入到容器中。若不指定,该组件在任何环境下都能被注入到容器。

  • 加了环境标识的bean,只有当这个环境被激活时才能注册到容器中。默认为@Profile(“default”)

  • 如何激活对应环境:

    • 使用命令行动态参数:在虚拟机参数位置加载 -Dspring.profiles.active=test

    • 使用代码方式设置需要激活的环境:

      //要指定环境,容器需要使用无参构造
      AnnotationConfigApplicationContext context = 
          new AnnotationConfigApplicationContext();
      //激活环境
      context.getEnvironment().setActiveProfiles("dev","test");
      //注册配置类
      context.register(MainConfigOfProfile.class);
      //启动刷新容器
      context.refresh();
      
  • @Profile也可以标注在配置类上,当指定的环境激活时,该配置类里的所有配置才能生效

  • 没有标注@Profile的Bean,在任何环境下都是加载的。

为各个数据源标注环境:

@Configuration
@PropertySource("classpath:/dbconfig.properties")
public class MainConfigOfProfile {
    ...

    @Profile("test")
    @Bean("testDataSource")
    public DataSource dataSourceTest() throws PropertyVetoException {
        ...
    }

    @Profile("dev")
    @Bean("devDataSource")
    public DataSource dataSourceDev() throws PropertyVetoException {
        ...
    }

    @Profile("prod")
    @Bean("prodDataSource")
    public DataSource dataSourceProd() throws PropertyVetoException {
        ...
    }

}

不开启对应环境时无法加载指定的Bean:

image-20200403180905501

1️⃣ 使用命令行参数激活test环境:

image-20200403181156961

此时的测试结果:

image-20200403181221878

2️⃣ 在代码中指定激活环境:

public class IOCTest_Profile {
    @Test
    public void test1(){
        //要指定环境,容器需要使用无参构造
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        //激活环境
        context.getEnvironment().setActiveProfiles("dev","test");
        //注册配置类
        context.register(MainConfigOfProfile.class);
        //启动刷新容器
        context.refresh();

        String[] beanNamesForType = context.getBeanNamesForType(DataSource.class);
        for (String s : beanNamesForType) {
            System.out.println(s);
        }
        context.close();
    }
}

运行测试,结果为:

image-20200403182120200


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,邮件至 708801794@qq.com

文章标题:Spring注解学习_自动装配4_@Profile

文章字数:695

本文作者:梅罢葛

发布时间:2020-04-03, 16:47:50

最后更新:2020-04-03, 18:43:09

原始链接:https://qiurungeng.github.io/2020/04/03/Spring%E6%B3%A8%E8%A7%A3%E5%AD%A6%E4%B9%A0-%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D4-Profile/
目录
×

喜欢就点赞,疼爱就打赏