如何利用@Value配置普通類
所謂普通類,也可以稱爲非依賴注入類或者非註冊類。因爲@Value使用有一些限制條件參考@Value註解使用中的坑,其中最重要的一條即爲:@Value必須在註冊類中使用,且類加載方式必須爲注入方式。所以普通類中不能使用@Value註解內部屬性,同時普通類中也不能使用@Autowired或者@Resource注入由@Value註解的註冊類(這是因爲裝配只能在註冊類中進行)。
在普通類中直接使用@Value註解無法生效,只能採用間接的方式,定義一個配置註冊類將.properties或者.yml文件中配置的屬性引入,現在的問題是如何將這個註冊類引入到普通類中。
我提供兩種思路:
1. 手動加載bean
比較簡單的方法是使用:
WebApplicationContext wc=ContextLoader.getCurrentWebApplicationContext();
wc.getBean(BeanID);
這樣可以直接在普通類獲取bean。但是如果是spring boot使用Embedded tomcat而不是使用war包部署在tomcat中,wc返回可能是null.
當然也可以在初始化時,implements ApplicationContextAware(或類似環境上下文接口),重載public void setApplicationContext()方法,從而獲取環境上下文,再使用getBean.但是我覺這樣比較複雜。如果能夠直接使用@Value注入當然是最好不過了。
2. 使用@Value配置
使用@Value配置普通類的思路,主要是利用了@Value註解靜態變量。本來@Value是無法註解靜態變量的,但是可以這樣:
@Component
public class StudentConfig {
public static String name;
@Value("${student.name}")
public void setName(String name){
Student.name = name;
}
}
這樣properties或者是yml文件中student.name就能注入到StudentConfig中,由於name是靜態屬性,就可以在普通類中直接StudentConfig.name來使用這個屬性了。完美解決問題,鼓掌。