Spring Profile與PropertyPlaceholderConfigurer項目多環(huán)境配置切換
最近考慮項目在不同環(huán)境下配置的切換,使用profile注解搭配PropertyPlaceholderConfigurer實現(xiàn)對配置文件的切換,簡單寫了個demo記錄下實現(xiàn)。
基本知識介紹
@Profile
@Profile 通過對bean進行修飾,來限定spring在bean管理時的初始化情況,只有環(huán)境中激活的profile狀態(tài)和修飾的value值對應時,該bean才會被順利加載并管理。
PropertyPlaceholderConfigurer
PropertyPlaceholderConfigurer 是PlaceholderConfigurerSupport的實現(xiàn)類,是spring提供的一個解析yml或properties配置文件并將對應的值進行映射,通過 ${} 形式進行調(diào)用的配置讀取類。
舉例來說,配置文件中 akb.num=48 ,那么在bean或配置文件中使用 ${akb.num} 即可獲取配置的值48。
簡單實現(xiàn)
profile修飾的bean實例在不同環(huán)境下的切換
首先定義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狀態(tài)下的bean";
}
}dev bean ProfileBeanDev
@Profile("dev")
@Component
public class ProfileBeanDev implements DefaultProfileBean{
@Override
public String getInfo(){
return "這是dev環(huán)境使用的bean";
}
}dev bean ProfileBeanProd
@Profile("prod")
@Component
public class ProfileBeanProd implements DefaultProfileBean{
@Override
public String getInfo() {
return "這是prod環(huán)境使用的bean";
}
}加載上下文并輸出加載的bean結果
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
// 設置profile環(huán)境
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環(huán)境后的不同輸出結果:



可以看出@Profile注解生效了。
配置類和配置文件
SpringConfigure 配置類
@Configuration
public class SpringConfigure {
@Bean
@Profile("default")
// 默認狀態(tài)配置加載類
public PropertyPlaceholderConfigurer defaultConfig(){
PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
Resource resource = new ClassPathResource("config/default.properties");
ppc.setLocation(resource);
return ppc;
}
@Bean
@Profile("dev")
// dev狀態(tài)配置加載類
public PropertyPlaceholderConfigurer devConfig(){
PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
Resource resource = new ClassPathResource("config/dev.properties");
ppc.setLocation(resource);
return ppc;
}
@Bean
@Profile("prod")
// prod狀態(tài)配置加載類
public PropertyPlaceholderConfigurer prodConfig(){
PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
Resource resource = new ClassPathResource("config/prod.properties");
ppc.setLocation(resource);
return ppc;
}
}管理了三個 PropertyPlaceholderConfigurer 類型的配置讀取類,分別對應不同的profile狀態(tài)。通過 ClassPathResource 讀取對應的配置文件,如果用xml配置文件進行PropertyPlaceholderConfigurer bean的管理,直接增加property location,將value設置為對應的配置文件地址即可。
三個不同的配置文件內(nèi)容
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 "當前環(huán)境下的config信息為:" + config;
}
}通過 ${config.info} 實現(xiàn)對配置文件的獲取。
加載上下文進行處理
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
// 設置profile環(huán)境
context.getEnvironment().setActiveProfiles("prod");
context.scan("com.huiluczP");
context.refresh();
DefaultConfigBean configBean = context.getBean(DefaultConfigBean.class);
System.out.println(configBean.getConfigInfo());切換環(huán)境輸出結果



profile激活
特別的,說明下對項目profile環(huán)境怎么進行設置以對profile進行激活。沒有特別指定時,默認調(diào)用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設置為對應的環(huán)境。 總結
簡單記錄了一下spring profile和PropertyPlaceholderConfigurers類實現(xiàn)不同環(huán)境下的不同配置文件加載的方法,在分支中進行快速切換還是挺方便的,而且PropertyPlaceholderConfigurer映射的配置在spring讀取其他的配置文件時也可以通過${}進行讀取,這樣不同的環(huán)境配置文件只需要一份,并將其中需要變動的部分用PropertyPlaceholderConfigurer進行管理即可。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot?+?Disruptor實現(xiàn)特快高并發(fā)處理及使用Disruptor高速實現(xiàn)隊列的過程
Disruptor是一個開源的Java框架,它被設計用于在生產(chǎn)者—消費者(producer-consumer problem,簡稱PCP)問題上獲得盡量高的吞吐量(TPS)和盡量低的延遲,這篇文章主要介紹了SpringBoot?+?Disruptor?實現(xiàn)特快高并發(fā)處理,使用Disruptor高速實現(xiàn)隊列,需要的朋友可以參考下2023-11-11
使用Java將實體類轉(zhuǎn)換為JSON并輸出到控制臺的完整過程
在軟件開發(fā)的過程中,Java是一種廣泛使用的編程語言,而在眾多應用中,數(shù)據(jù)的傳輸和存儲經(jīng)常需要使用JSON格式,用Java將實體類轉(zhuǎn)換為JSON格式并輸出其實不難,只需掌握幾個步驟就可以做到!接下來,我們來看看這一過程究竟是如何實現(xiàn)的,感興趣的小伙伴跟著小編一起來看看吧2025-05-05
Spring中使用atomikos+druid實現(xiàn)經(jīng)典分布式事務的方法
這篇文章主要介紹了Spring中使用atomikos+druid實現(xiàn)經(jīng)典分布式事務的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06
SocketIo+SpringMvc實現(xiàn)文件的上傳下載功能
這篇文章主要介紹了SocketIo+SpringMvc實現(xiàn)文件的上傳下載功能,socketIo不僅可以用來做聊天工具,也可以實現(xiàn)局域網(wǎng)。文中給出了實現(xiàn)代碼,需要的朋友可以參考下2018-08-08

