1. 程式人生 > >Spring中constructor,@PostConstruct,afterPropertiesSet,onApplicationEvent執行順序

Spring中constructor,@PostConstruct,afterPropertiesSet,onApplicationEvent執行順序

package com.xx;
 
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
 
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
 
import com.xx.service.DemoService;
 
@Component
public class InitBeanTest implements InitializingBean,ApplicationListener<ContextRefreshedEvent> {
 
	@Resource
	DemoService demoService;
	
	public InitBeanTest() {   
	       System.err.println("----> InitSequenceBean: constructor: "+demoService);   
	    }
 
	@PostConstruct
	public void postConstruct() {
		System.err.println("----> InitSequenceBean: postConstruct: "+demoService);
	}
 
	@Override
	public void afterPropertiesSet() throws Exception {
		System.err.println("----> InitSequenceBean: afterPropertiesSet: "+demoService);
	}
 
	@Override
	public void onApplicationEvent(ContextRefreshedEvent arg0) {
		System.err.println("----> InitSequenceBean: onApplicationEvent");
	}
 
}

執行結果

----> InitSequenceBean: constructor: null
----> InitSequenceBean: postConstruct: [email protected]
----> InitSequenceBean: afterPropertiesSet: [email protected]
----> InitSequenceBean: onApplicationEvent
----> InitSequenceBean: onApplicationEvent

分析

建構函式是每個類最先執行的,這個時候,bean屬性還沒有被注入

postConstruct優先於afterPropertiesSet執行,這時屬性竟然也被注入了,有點意外

spring很多組建的初始化都放在afterPropertiesSet做。我們在做一些中介軟體想和spring一起啟動,可以放在這裡啟動。

onApplicationEvent屬於應用層的時間,最後被執行,很容易理解。注意,它出現了兩次,為什麼?因為bean注入了DemoService,spring容器會被重新整理。

換言之onApplicationEvent會被頻繁執行,需要使用它監聽,需要考慮效能問題。

很顯然,這是觀察者模式的經典應用。

總結

1:spring為bean提供了兩種初始化bean的方式,實現InitializingBean介面,實現afterPropertiesSet方法,或者在配置檔案中同過init-method指定,兩種方式可以同時使用

2:實現InitializingBean介面是直接呼叫afterPropertiesSet方法,比通過反射呼叫init-method指定的方法效率相對來說要高點。但是init-method方式消除了對spring的依賴

3:如果呼叫afterPropertiesSet方法時出錯,則不呼叫init-method指定的方法。

最後,給出本文的結論,Bean在例項化的過程中:Constructor > @PostConstruct > InitializingBean > init-method

原始碼分析參考:https://www.cnblogs.com/april-chen/p/8182631.html

文章參考:https://blog.csdn.net/zhairuiping1989/article/details/78859931

相關推薦

Springconstructor,@PostConstruct,afterPropertiesSet,onApplicationEvent執行順序

package com.xx; import javax.annotation.PostConstruct; import javax.annotation.Resource; import org.springframework.beans.factory.Init

springConstructor、@Autowired、@PostConstruct順序

註入 自動 img 成對 .com 使用 struct ron autowire 依賴註入: 從字面意思就可以知道,要將對象B註入到對象A,那麽首先就必須得生成對象B與對象A,才能執行註入。 所以,如果一個類A中有個成員變量B被@Autowired註解,那麽@Autowir

springConstructor、@Autowired、@PostConstruct順序【轉】

auto bbb 構造 () article lan csdn 初始 ons 其實從依賴註入的字面意思就可以知道,要將對象p註入到對象a,那麽首先就必須得生成對象p與對象a,才能執行註入。所以,如果一個類A中有個成員變量p被@Autowired註解,那麽@Autowired

SQL Server 查詢處理的各個階段(SQL執行順序)

派生 步驟 sel 合成 emp lec 限制 對象 沒有 SQL 不同於與其他編程語言的最明顯特征是處理代碼的順序。在大數編程語言中,代碼按編碼順序被處理,但是在SQL語言中,第一個被處理的子句是FROM子句,盡管SELECT語句第一個出現,但是幾乎總是最後被處

jquery ajaxsuccess與complete的執行順序

err 執行 stop 我們 -- jquer bsp con ucc jquery ajax中success與complete的執行順序 jquery中各個事件執行順序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件)

main入口方法創建線程執行順序的問題

ati csdn () stat 輸出結果 輸出 實現 string tar 1 public static void main(String args[]) { 2 3 4 Thread t1=new Thre

Java面試經常遇到的類執行順序

單類執行順序: 下面是我寫的一個demo: package com.bw; /** * @author brickworker * 關於類Color的描述:測試單個類的執行順序問題 */ public classColor {     //建構函式     public

Java不同情況下的執行順序整理:

      初始化順序:父靜態變數、父靜態程式碼塊、子類靜態變數、子類靜態程式碼塊、父類非靜態變數、父類非靜態程式碼塊、父類構造器、子類非靜態變數、子類非靜態程式碼塊、子類建構函式。       執行順序:父類B靜態程式碼塊->子類A靜態程式碼塊->父類B非靜態

關於sqlor與and的執行順序

<select id="countAssetTab" resultType="Integer" parameterType="HashMap"> SELECT COUNT(1) FROM TTRD_ASSET_MANAGE_PLAN_EXTEND

Spring事務與aop的先後順序問題

    Spring中的事務是通過aop來實現的,當我們自己寫aop攔截的時候,會遇到跟spring的事務aop執行的先後順序問題,比如說動態切換資料來源的問題,如果事務在前,資料來源切換在後,會導致資料來源切換失效,所以就用到了Order(排序)這個關鍵字.     

sql server 上 update 語句 set 後表示式的執行順序

以下結論是通過在Sql Server2000上的實驗得出的結論,也可通過檢視估計的執行計劃(Ctrl+L)來檢視執行順序。 1.先執行等號(=)左邊是變數的表示式(A類),再執行等號(=)左邊是列名的表示式(B類)。 例:update tablename set [email

SQL語句的AND和OR執行順序問題

情景:一個搜尋框 可以同時根據使用者賬號或者使用者名稱字 搜尋匹配條件的使用者 如果搜尋框中沒有搜尋條件 則查出所有教師使用者 遇到的問題: 查詢條件時為輸入框內的內容 先在資料庫中模擬測試 結果

javafinally與return的執行順序詳解

一些準備知識:     首先為了說明白java中finally與return的執行順序是怎樣的這個問題,我們需要做一點準備工作。     java方法是在棧幀中執行,棧幀是執行緒私有棧的單位,執行方法的執行緒會為每一個方法分配一小塊棧空間來作為該方法執行時的記憶體空間,棧幀

eclipsescanf和printf的執行順序顛倒的解決方法

最近我利用Eclipse進行c語言開發時,發現當使用輸入輸出函式時,會出現一種奇怪的現象:必須在控制檯完全輸入資料後,控制檯才會輸出諸如提示輸入的語句及最終結果。 如下程式碼: #include <stdio.h> #include <stdlib.h&g

sql語句各子部分的執行順序

(3)inner join:這裡是內部連線,直接就是VT2,如果是outer join,如left join、right join、full join,那麼還需要按照外部連線的規則,把VT1中沒有匹配的行新增到VT2,生成VT3.

Javafinally與return的執行順序

finally不會執行的兩種情況:1.finally對應的try塊語句還沒被執行到就返回了 2.finally對應的try塊語句中有System.exit()這樣的語句 finally塊的語句在tr

JS的async/await的執行順序詳解

雖然大家知道async/await,但是很多人對這個方法中內部怎麼執行的還不是很瞭解,本文是我看了一遍技術部落格理解 JavaScript 的 async/await(如果對async/await不熟悉可以先看下http://es6.ruanyifeng.com/#docs/async)後拓展了一下,我理了一

Spring框架InitializingBean執行順序

ans .com 構造函數 tar start bean 復制代碼 init auth 本文轉自:https://www.cnblogs.com/yql1986/p/4084888.html package org.test.InitializingBean; 2

Spring構造器、init-method、@PostConstructafterPropertiesSet孰先孰後,自動註入發生時間以及單例多例的區別

但是 lan 構造方法 nes src 調用父類構造方法 pos print 提醒      首先明白,spring的IOC功能需要是利用反射原理,反射獲取類的無參構造方法創建對象,如果一個類沒有無參的構造方法spring是不會創建對象的。在這裏需要提醒一下,如果我們在c

spring過濾器(filter)、攔截器(interceptor)和切面(aop)的執行順序

1.程式執行的順序是先進過濾器,再進攔截器,最後進切面。注意:如果攔截器中preHandle方法返回的為false時,則無法進入切面,例子如下 @RestController @RequestMapping("/user") public class UserController {