1. 程式人生 > >Spring Spring 靜態屬性 注入的三種方式

Spring Spring 靜態屬性 注入的三種方式

Spring靜態注入的三種方式:

(說明:MongoFileOperationUtil是自己封裝的一個Mongodb檔案讀寫工具類,裡面需要依賴AdvancedDatastore物件例項,dsForRW用來獲取Mongodb資料來源)

在springframework裡,我們不能@Autowired一個靜態變數,使之成為一個spring bean,例如下面這種方式:

  1. @Autowired
  2. privatestatic AdvancedDatastore dsForRW;  
可以試一下,dsForRW在這種狀態下不能夠被依賴注入,會丟擲執行時異常java.lang.NullPointerException,為什麼呢?靜態變數/類變數不是物件的屬性,而是一個類的屬性,spring則是基於物件層面上的依賴注入。

但是自己比較喜歡封裝工具類,並通過@Component註解成功能元件,但是功能元件中的方法一般都是靜態方法,靜態方法只能呼叫靜態成員變數,於是就有了下面的問題。封有的時候封裝功能元件會需要底層的service注入,怎麼辦呢?

去網上搜了下解決辦法,簡單總結一下幾種實現方式;

1.xml方式實現;

  1. <beanid="mongoFileOperationUtil"class="com.*.*.MongoFileOperationUtil"init-method="init">
  2.     <propertyname="dsForRW"ref="dsForRW"/>
  3. </
    bean>

  1. publicclass MongoFileOperationUtil {  
  2.     privatestatic AdvancedDatastore dsForRW;  
  3.     privatestatic MongoFileOperationUtil mongoFileOperationUtil;  
  4.     publicvoid init() {  
  5.         mongoFileOperationUtil = this;  
  6.         mongoFileOperationUtil.dsForRW = this.dsForRW;  
  7.     }  
  8. }  
這種方式適合基於XML配置的WEB專案;

[email protected]方式實現;

  1. import org.mongodb.morphia.AdvancedDatastore;  
  2. import org.springframework.beans.factory.annotation.Autowired;  
  3. @Component
  4. publicclass MongoFileOperationUtil {  
  5.     @Autowired
  6.     privatestatic AdvancedDatastore dsForRW;  
  7.     privatestatic MongoFileOperationUtil mongoFileOperationUtil;  
  8.     @PostConstruct
  9.     publicvoid init() {  
  10.         mongoFileOperationUtil = this;  
  11.         mongoFileOperationUtil.dsForRW = this.dsForRW;  
  12.     }  
  13. }  
@PostConstruct 註解的方法在載入類的建構函式之後執行,也就是在載入了建構函式之後,執行init方法;(@PreDestroy 註解定義容器銷燬之前的所做的操作)

這種方式和在xml中配置 init-method和 destory-method方法差不多,定義spring 容器在初始化bean 和容器銷燬之前的所做的操作;

3.set方法上新增@Autowired註解,類定義上新增@Component註解;

  1. import org.mongodb.morphia.AdvancedDatastore;  
  2. import org.springframework.beans.factory.annotation.Autowired;  
  3. import org.springframework.stereotype.Component;  
  4. @Component
  5. publicclass MongoFileOperationUtil {  
  6.     privatestatic AdvancedDatastore dsForRW;  
  7.     @Autowired
  8.     publicvoid setDatastore(AdvancedDatastore dsForRW) {  
  9.         MongoFileOperationUtil.dsForRW = dsForRW;  
  10.     }  
  11. }  

首先Spring要能掃描到AdvancedDatastore的bean,然後通過setter方法注入;

然後注意:成員變數上不需要再新增@Autowired註解;