Spring Spring 靜態屬性 注入的三種方式
阿新 • • 發佈:2019-01-03
Spring靜態注入的三種方式:
(說明:MongoFileOperationUtil是自己封裝的一個Mongodb檔案讀寫工具類,裡面需要依賴AdvancedDatastore物件例項,dsForRW用來獲取Mongodb資料來源)
在springframework裡,我們不能@Autowired一個靜態變數,使之成為一個spring bean,例如下面這種方式:
- @Autowired
- privatestatic AdvancedDatastore dsForRW;
但是自己比較喜歡封裝工具類,並通過@Component註解成功能元件,但是功能元件中的方法一般都是靜態方法,靜態方法只能呼叫靜態成員變數,於是就有了下面的問題。封有的時候封裝功能元件會需要底層的service注入,怎麼辦呢?
去網上搜了下解決辦法,簡單總結一下幾種實現方式;
1.xml方式實現;
- <beanid="mongoFileOperationUtil"class="com.*.*.MongoFileOperationUtil"init-method="init">
- <propertyname="dsForRW"ref="dsForRW"/>
-
</
- publicclass MongoFileOperationUtil {
- privatestatic AdvancedDatastore dsForRW;
- privatestatic MongoFileOperationUtil mongoFileOperationUtil;
- publicvoid init() {
- mongoFileOperationUtil = this;
- mongoFileOperationUtil.dsForRW = this.dsForRW;
- }
-
}
[email protected]方式實現;
- import org.mongodb.morphia.AdvancedDatastore;
- import org.springframework.beans.factory.annotation.Autowired;
- @Component
- publicclass MongoFileOperationUtil {
- @Autowired
- privatestatic AdvancedDatastore dsForRW;
- privatestatic MongoFileOperationUtil mongoFileOperationUtil;
- @PostConstruct
- publicvoid init() {
- mongoFileOperationUtil = this;
- mongoFileOperationUtil.dsForRW = this.dsForRW;
- }
- }
這種方式和在xml中配置 init-method和 destory-method方法差不多,定義spring 容器在初始化bean 和容器銷燬之前的所做的操作;
3.set方法上新增@Autowired註解,類定義上新增@Component註解;
- import org.mongodb.morphia.AdvancedDatastore;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Component;
- @Component
- publicclass MongoFileOperationUtil {
- privatestatic AdvancedDatastore dsForRW;
- @Autowired
- publicvoid setDatastore(AdvancedDatastore dsForRW) {
- MongoFileOperationUtil.dsForRW = dsForRW;
- }
- }
首先Spring要能掃描到AdvancedDatastore的bean,然後通過setter方法注入;
然後注意:成員變數上不需要再新增@Autowired註解;