背景
在profile推出之前,通过不同系统的环境变量切换,通过一些手动或者写死的方法进行切换非常费时费力,而且有些系统来回几套系统在切换的时候经常性出现各种问题...
spring @profile解决什么问题?
spring profile是Spring Framework 3.1以后推出一个解决切换环境变量的注解。主要解决一个环境问题切换的问题,其原理就是通过spring di在注入的时候通过环境变量来判断注入相应的环变量,以达到减少配置问题引起的各种麻烦。
个人理解:就是通过环境变量中的不同值来判断是正式环境、测试环境、开发环境、本地环境等。
源码实现:
/**
* @Auther: csh
* @Date: 2020/7/10 15:18
* @Description:系统环境
*/
public class SystemConfig {
private String systemInfo;
public SystemConfig(String systemInfo) {
this.systemInfo = systemInfo;
}
public String getSystemInfo() {
return systemInfo;
}
public void setSystemInfo(String systemInfo) {
this.systemInfo = systemInfo;
}
}
/**
* @Auther: csh
* @Date: 2020/7/10 15:20
* @Description:环境配置
*/
@Configuration
public class EnvironmentConfig {
@Profile("dev")
@Bean
public SystemConfig getTest(){
return new SystemConfig("dev222222");
}
@Profile("idc")
@Bean
public SystemConfig getIDC(){
return new SystemConfig("idc2222222222");
}
}
/**
* @Auther: csh
* @Date: 2020/7/10 10:43
* @Description:
*/
public class ProfileTest {
public static void main(String[] args) {
//从类路径的xm文件载入上下文定义的信息
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
System.out.println("context 已启动!");
context.getEnvironment().setActiveProfiles("idc");
//注册主配置类
context.register(EnvironmentConfig.class);
context.refresh();
SystemConfig bean = context.getBean(SystemConfig.class);
System.out.println(bean.getSystemInfo());
AnnotationConfigApplicationContext context2 = new AnnotationConfigApplicationContext();
context2.getEnvironment().setActiveProfiles("dev");
//注册主配置类
context2.register(EnvironmentConfig.class);
context2.refresh();
SystemConfig bean2 = context2.getBean(SystemConfig.class);
System.out.println(bean2.getSystemInfo());
}
}
context 已启动!
七月 10, 2020 3:24:13 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@37bba400: startup date [Fri Jul 10 15:24:13 CST 2020]; root of context hierarchy
idc
七月 10, 2020 3:24:14 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@7dc222ae: startup date [Fri Jul 10 15:24:14 CST 2020]; root of context hierarchy
dev
context 已启动!
七月 10, 2020 3:25:04 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@37bba400: startup date [Fri Jul 10 15:25:04 CST 2020]; root of context hierarchy
idc2222222222
七月 10, 2020 3:25:04 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@7dc222ae: startup date [Fri Jul 10 15:25:04 CST 2020]; root of context hierarchy
dev222222
当然也可以通过jvm来进行配置
/**
* @Auther: csh
* @Date: 2020/7/10 10:43
* @Description:profile测试
*/
public class ProfileTest {
public static void main(String[] args) {
//从类路径的xm文件载入上下文定义的信息
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
System.out.println("context 已启动!");
// context.getEnvironment().setActiveProfiles("idc");
//注册主配置类
context.register(EnvironmentConfig.class);
context.refresh();
SystemConfig bean = context.getBean(SystemConfig.class);
System.out.println(bean.getSystemInfo());
AnnotationConfigApplicationContext context2 = new AnnotationConfigApplicationContext();
// context2.getEnvironment().setActiveProfiles("dev");
//注册主配置类
context2.register(EnvironmentConfig.class);
context2.refresh();
SystemConfig bean2 = context2.getBean(SystemConfig.class);
System.out.println(bean2.getSystemInfo());
}
}
context 已启动!
七月 10, 2020 3:30:44 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@37bba400: startup date [Fri Jul 10 15:30:44 CST 2020]; root of context hierarchy
idc2222222222
七月 10, 2020 3:30:44 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6483f5ae: startup date [Fri Jul 10 15:30:44 CST 2020]; root of context hierarchy
idc2222222222
注:
org.springframework.core.env.ConfigurableEnvironment#setActiveProfiles的等级优于VM options
代码下载:https://gitee.com/hong99/spring/issues/I1N1DF
参考文章:
https://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile
https://blog.csdn.net/weixin_43950568/article/details/104256427?ops_request_misc=&request_id=&biz_id=102&utm_term=@Profile&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-104256427