如何利用@Value配置普通類

如何利用@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來使用這個屬性了。完美解決問題,鼓掌。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章