【Spring【IOC】】——19、使用@Profile注解实现开发、测试和生产环境的配置和切换?
原创
©著作权归作者所有:来自51CTO博客作者zhz小白的原创作品,请联系作者获取转载授权,否则将追究法律责任
📫作者简介: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.1、配置文件方式
- 4.1.2、命令行方式
- 4.2.1、使用例子
- 4.2.2、工作中的例子
1、@Profile是什么?
主要是一个用于多环境配置的切换,比如不同环境的mysql连接信息,mq连接信息等
2、@Profile有什么作用?
- 指定类或方法在特定的 Profile 环境生效,任何@Component或@Configuration注解的类都可以使用@Profile注解。在使用DI来依赖注入的时候,能够根据@profile标明的环境,将注入符合当前运行环境的相应的bean
- @Component或@Configuration注解的类可以使用@profile
- @Profile中需要指定一个字符串,约定生效的环境
3、源码解析

首先我们先看一下其源码,可以发现其用于类,方法上,注解上的。
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();