【Spring【IOC】】——19、使用@Profile注解实现开发、测试和生产环境的配置和切换?

在这里插入图片描述

作者简介:zhz小白
公众号:小白的Java进阶之路
专业技能:
1、Java基础,并精通多线程的开发,熟悉JVM原理
2、熟悉Java基础,并精通多线程的开发,熟悉JVM原理,具备⼀定的线上调优经验
3、熟悉MySQL数据库调优,索引原理等,⽇志原理等,并且有出过⼀篇专栏
4、了解计算机⽹络,对TCP协议,滑动窗⼝原理等有⼀定了解
5、熟悉Spring,Spring MVC,Mybatis,阅读过部分Spring源码
6、熟悉SpringCloud Alibaba体系,阅读过Nacos,Sentinel,Seata,Dubbo,Feign,Gateway核⼼源码与设计,⼆次开发能⼒
7、熟悉消息队列(Kafka,RocketMQ)的原理与设计
8、熟悉分库分表ShardingSphere,具有真实⽣产的数据迁移经验
9、熟悉分布式缓存中间件Redis,对其的核⼼数据结构,部署架构,⾼并发问题解决⽅案有⼀定的积累
10、熟悉常⽤设计模式,并运⽤于实践⼯作中
11、了解ElasticSearch,对其核⼼的原理有⼀定的了解
12、了解K8s,Jekins,GitLab
13、了解VUE,GO
14、⽬前有正在利⽤闲暇时间做互游游戏,开发、运维、运营、推销等

本人著作git项目:https://gitee.com/zhouzhz/star-jersey-platform,有兴趣的可以私聊博主一起编写,或者给颗star
领域:对支付(FMS,FUND,PAY),订单(OMS),出行行业等有相关的开发领域
如果此文还不错的话,还请关注、点赞、收藏三连支持一下博主~

文章目录

  • 1、@Profile是什么?
  • 2、@Profile有什么作用?
  • 3、源码解析
  • 4、使用
    • 4.1、激活方式
      • 4.1.1、配置文件方式
      • 4.1.2、命令行方式
    • 4.2、多profile的指定
      • 4.2.1、使用例子
      • 4.2.2、工作中的例子
  • 5、参考

1、@Profile是什么?

主要是一个用于多环境配置的切换,比如不同环境的mysql连接信息,mq连接信息等

2、@Profile有什么作用?

  • 指定类或方法在特定的 Profile 环境生效,任何@Component或@Configuration注解的类都可以使用@Profile注解。在使用DI来依赖注入的时候,能够根据@profile标明的环境,将注入符合当前运行环境的相应的bean
    • 使用要求
      • @Component或@Configuration注解的类可以使用@profile
      • @Profile中需要指定一个字符串,约定生效的环境

3、源码解析

【Spring【IOC】】——19、使用@Profile注解实现开发、测试和生产环境的配置和切换?_第1张图片

首先我们先看一下其源码,可以发现其用于类,方法上,注解上的。

4、使用

  • 实际使用中,注解中标示了dev、test、uat、prod等多个环境,运行时使用哪个profile由spring.profiles.active控制,以下说明2种方式:配置文件方式、命令行方式。

4.1、激活方式

4.1.1、配置文件方式

在对应的项目的application.yml/application.properties中添加如下
application.properties:

spring.profiles.active=dev 

application.yml

spring:
  profiles:
    active: dev

4.1.2、命令行方式

java -jar xxx.jar --spring.profiles.active=dev

4.2、多profile的指定

  • applcation.yml - 公共配置
  • application-dev.yml - 开发环境配置
  • application-test.yml - 测试环境配置
  • application-uat.yml - 预发环境配置
  • application-prod.yml - 生产环境配置

不同的配置可以在application.yml中指定为:

spring:
  profiles:
    active: dev

4.2.1、使用例子

controller测试类

@@RestController
@RequestMapping("/test")
public class TestController {

    @Value("${name}")
    private String name;

    @Value("${ip}")
    private String ip;

    @RequestMapping("test1")
    public String test(){
        return name  + ip;
    }
}

application.yml中的配置如下:

spring.profiles.active=prod

application-dev.yml文件内容如下:

server:
	port: 8080
name: zhz-dev
ip: 127.0.0.1

application-test.yml文件内容如下:

server:
	port: 8080
name: zhz-test
ip: 127.0.0.2

application-uat.yml文件内容如下:

server:
	port: 8080
name: zhz-uat
ip: 127.0.0.3

application-prod.yml文件内容如下:

server:
	port: 8080
name: zhz-prod
ip: 127.0.0.4

然后我们启动项目就会发现不同的激活输出的结果是不一样的

4.2.2、工作中的例子

环境配置

/**
 * 容器配置类
 * 用于测试@Profile注解
 */
@Configuration
@PropertySource(value = {"classpath:/dbconfig.properties"})
public class ProfileBeanConfig implements EmbeddedValueResolverAware {

    //数据库连接用户名
    @Value(value = "${jdbc.username}")
    private String username;
    //数据库连接密码
    private String password;

    //开发环境数据源
    @Bean(value = "dataSourceDev")
    @Profile(value = "dev")
    public DataSource dataSourceDev(@Value("${jdbc.driverClass}") String driverClass) throws PropertyVetoException {
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        comboPooledDataSource.setUser(this.username);
        comboPooledDataSource.setPassword(this.password);
        comboPooledDataSource.setDriverClass(driverClass);
        comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/dev");
        return comboPooledDataSource;
    }

    //测试环境数据源
    @Bean(value = "dataSourceTest")
    @Profile("test")
    public DataSource dataSourceTest(@Value("${jdbc.driverClass}") String driverClass) throws PropertyVetoException {
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        comboPooledDataSource.setUser(this.username);
        comboPooledDataSource.setPassword(this.password);
        comboPooledDataSource.setDriverClass(driverClass);
        comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
        return comboPooledDataSource;
    }

    //生产环境数据源
    @Bean(value = "dataSourceProduction")
    @Profile("production")
    public DataSource dataSourceProduction(@Value("${jdbc.driverClass}") String driverClass) throws PropertyVetoException {
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        comboPooledDataSource.setUser(this.username);
        comboPooledDataSource.setPassword(this.password);
        comboPooledDataSource.setDriverClass(driverClass);
        comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/production");
        return comboPooledDataSource;
    }

    //获取字符串解析器
    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        //解析配置文件,然后对数据库连接密码进行赋值
        this.password = resolver.resolveStringValue("jdbc.password");
    }
}

利用applicationContext去加载

//创建匿名容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
//设置环境,其值为@Profile注解的属性值
applicationContext.getEnvironment().setActiveProfiles("test");
//注册容器类
applicationContext.register(ProfileBeanConfig.class);
//刷新容器
applicationContext.refresh();

5、参考

https://www.cnblogs.com/dubhlinn/p/10708240.html

你可能感兴趣的:(#,Spring,spring,java,后端)