Spring Profile与PropertyPlaceholderConfigurer项目多环境配置切换
作者:回炉重造P
最近考虑项目在不同环境下配置的切换,使用profile注解搭配PropertyPlaceholderConfigurer实现对配置文件的切换,简单写了个demo记录下实现。
基本知识介绍
@Profile
@Profile
通过对bean进行修饰,来限定spring在bean管理时的初始化情况,只有环境中激活的profile状态和修饰的value值对应时,该bean才会被顺利加载并管理。
PropertyPlaceholderConfigurer
PropertyPlaceholderConfigurer
是PlaceholderConfigurerSupport的实现类,是spring提供的一个解析yml或properties配置文件并将对应的值进行映射,通过 ${}
形式进行调用的配置读取类。
举例来说,配置文件中 akb.num=48
,那么在bean或配置文件中使用 ${akb.num}
即可获取配置的值48。
简单实现
profile修饰的bean实例在不同环境下的切换
首先定义bean接口与default、dev、prob三种情况下的bean。
接口 DeafultProfileBean
@Component public interface DefaultProfileBean { String getInfo(); }
default bean ProfileBeanDefault
@Profile("default") @Component public class ProfileBeanDefault implements DefaultProfileBean{ @Override public String getInfo() { return "这是default状态下的bean"; } }
dev bean ProfileBeanDev
@Profile("dev") @Component public class ProfileBeanDev implements DefaultProfileBean{ @Override public String getInfo(){ return "这是dev环境使用的bean"; } }
dev bean ProfileBeanProd
@Profile("prod") @Component public class ProfileBeanProd implements DefaultProfileBean{ @Override public String getInfo() { return "这是prod环境使用的bean"; } }
加载上下文并输出加载的bean结果
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); // 设置profile环境 context.getEnvironment().setActiveProfiles("dev"); context.scan("com.huiluczP"); context.refresh(); System.out.println("loading success"); DefaultProfileBean bean = context.getBean(DefaultProfileBean.class); System.out.println(bean.getInfo());
切换profile环境后的不同输出结果:
可以看出@Profile注解生效了。
配置类和配置文件
SpringConfigure
配置类
@Configuration public class SpringConfigure { @Bean @Profile("default") // 默认状态配置加载类 public PropertyPlaceholderConfigurer defaultConfig(){ PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer(); Resource resource = new ClassPathResource("config/default.properties"); ppc.setLocation(resource); return ppc; } @Bean @Profile("dev") // dev状态配置加载类 public PropertyPlaceholderConfigurer devConfig(){ PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer(); Resource resource = new ClassPathResource("config/dev.properties"); ppc.setLocation(resource); return ppc; } @Bean @Profile("prod") // prod状态配置加载类 public PropertyPlaceholderConfigurer prodConfig(){ PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer(); Resource resource = new ClassPathResource("config/prod.properties"); ppc.setLocation(resource); return ppc; } }
管理了三个 PropertyPlaceholderConfigurer
类型的配置读取类,分别对应不同的profile状态。通过 ClassPathResource
读取对应的配置文件,如果用xml配置文件进行PropertyPlaceholderConfigurer bean的管理,直接增加property location,将value设置为对应的配置文件地址即可。
三个不同的配置文件内容
default.properties
config.info=default information
dev.properties
config.info=dev information
prod.properties
config.info=prod information
配置获取测试接口和bean类
public interface DefaultConfigBean { String getConfigInfo(); } @Component public class DifferentConfigBean implements DefaultConfigBean{ @Value("${config.info}") private String config; @Override public String getConfigInfo() { return "当前环境下的config信息为:" + config; } }
通过 ${config.info}
实现对配置文件的获取。
加载上下文进行处理
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); // 设置profile环境 context.getEnvironment().setActiveProfiles("prod"); context.scan("com.huiluczP"); context.refresh(); DefaultConfigBean configBean = context.getBean(DefaultConfigBean.class); System.out.println(configBean.getConfigInfo());
切换环境输出结果
profile激活
特别的,说明下对项目profile环境怎么进行设置以对profile进行激活。没有特别指定时,默认调用default修饰的bean。
1.直接上下文设定,也就是上文中使用的,对enviroment中的 activeProfile
进行设置即可。
2.web项目中可以在web.xml中设置全局的变量:
<context-param> <param-name>spring.profiles.alive</param-name> <param-value>dev</param-value> </context-param>
3.如果是springMVC管理,可以在DispatcherServlet的配置中增加init-param:
<init-param> <param-name>spring.profiles.alive</param-name> <param-value>dev</param-value> </init-param>
4.可以在jvm的运行属性中设置,tomcat等服务器的启动option也可设置jvm属性。
-Dspring.profiles.active=dev
5.对测试类使用注解 @ActiveProfiles
进行修饰,value设置为对应的环境。 总结
简单记录了一下spring profile和PropertyPlaceholderConfigurers类实现不同环境下的不同配置文件加载的方法,在分支中进行快速切换还是挺方便的,而且PropertyPlaceholderConfigurer映射的配置在spring读取其他的配置文件时也可以通过${}进行读取,这样不同的环境配置文件只需要一份,并将其中需要变动的部分用PropertyPlaceholderConfigurer进行管理即可。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。