關於spring依賴注入到普通類中爲null的情況解決理解方案

最近寫了一個讀取日誌文件並定時保存的功能,但通過spring的依賴注入一直存在注入的實體類爲null 的情況,網上查了很多的方法,有說有配置文件中包掃描的問題,

有的說是註解方式(增加@Component註解)的問題,但查了相應的方法都沒有解決我的問題。無意中查到一位大神的方法,但還沒有弄清楚原理,在這裏先記錄下來,方便以後的學習並加上自己的理解,

並希望瀏覽過的大神會給出一些建議和原理思路:


@Component
public class InitTiming {
	private static final Logger LOGGER = LoggerFactory.getLogger(AbstractListener.class);
	
	@Resource
	private KafkaTraceLogBiz kafkaTraceLogBiz;
	
	private static InitTiming initTiming; //關鍵點1
	
	public void setKafkaTraceLogBiz(KafkaTraceLogBiz kafkaTraceLogBiz) {
		this.kafkaTraceLogBiz = kafkaTraceLogBiz;
	}

	@PostConstruct //關鍵點2
	public void getTiming(){
		SGSCallBackMethod.executeTiming(kafkaTraceLogBiz);
		LOGGER.info("request error log callback timing start");
	}	
}

通過上面的關鍵點,就可以將bean成功注入到我的InitTiming類中,在這裏先看看註解@PostConstruct的理解 

Java EE 5規範開始,Servlet中增加了兩個影響Servlet生命週期的註解(Annotion);@PostConstruct和@PreDestroy。這兩個註解被用來修飾一個非靜態的void()方法 。寫法有如下兩種方式:

@PostConstruct

Public void someMethod() {}                                                                              
或者

public @PostConstruct void someMethod(){}

    被@PostConstruct修飾的方法會在服務器加載Servle的時候運行,並且只會被服務器執行一次。PostConstruct在構造函數之後執行,init()方法之前執行。PreDestroy()方法在destroy()方法執行執行之後執行

 

 

被註解的Servlet生命週期

    需要注意的是,註解會多多少少地影響到服務器的啓動速度。服務器在啓動時候會遍歷Web 應用的WEB-INF/classes下的所有class文件與WEB-INF/lib下的所有jar文件,以檢查哪些類使用了註解。如果應用程序中沒有 使用任何註解,可以在Web.xml中設置的metadata-complete屬性爲true.(支持@PostConstruct和 @PreDestroy的服務器需要支持Servlet2.5規範。Tomcat5.x僅支持Servlet2.4規範。)


我現在要說的是用實例說明它有什麼作用。

比如說我有一種情況,在我的servlet初始化加載之前我想處理一些東西,像加載緩存等等。

怎麼做。@PostConstruct就派上用場了。那爲什麼這玩意用的不多呢,這是因爲如果初始化之前我們要加載或處理某些玩意完全可以在構造器初始化時就處理了,但這種方法需要自己重寫構造器。



發佈了22 篇原創文章 · 獲贊 35 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章