SpringBoot 學習之 @PostConstruct、 @Autowired與建構函式的執行順序
阿新 • • 發佈:2020-12-15
技術標籤:筆記spring boot
雖然 @PostConstruct、 @Autowired 和 建構函式都是在 Servlet 載入時呼叫,但是呼叫是時間還是有一些區別
一、當 @PostConstruct、 @Autowired 和 建構函式 在同一個類中的時候
呼叫的順序為: 建構函式 > @Autowired > @PostConstruct
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Auther: yoult
* @Description: TODO 初始化函式執行順序測試
* @LoginName: ZDGG
* @Date: 2020-12-14 22:01 星期一
*/
@Component
public class SuccessivelyTestA {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS" );//設定日期格式,精確到毫秒
SuccessivelyTestA(){
System.out.println(df.format(new Date()) + "==>successivelyTestA");
}
@PostConstruct
void testPostConstruct(){
System.out.println(df.format(new Date()) + "==>testPostConstructA");
}
@Autowired
private void testAutowired(Test test){
System.out.println(df.format(new Date()) + "==>testAutowiredA");
}
}
import org.springframework.stereotype.Component;
/**
* @Auther: yoult
* @Description: TODO
* @LoginName: ZDGG
* @Date: 2020-12-14 22:01 星期一
*/
@Component
public class Test {
Test(){
}
}
執行結果為:
2020-12-14 22:36:18.361==>successivelyTestA
2020-12-14 22:36:18.364==>testAutowiredA
2020-12-14 22:36:18.364==>testPostConstructA
二、當 @PostConstruct、 @Autowired 和 建構函式 在不同的類中時
現有SuccessivelyTestA 類和 SuccessivelyTestB 類
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Auther: yoult
* @Description: TODO 初始化函式執行順序測試
* @LoginName: ZDGG
* @Date: 2020-12-14 22:01 星期一
*/
@Component
public class SuccessivelyTestB {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");//設定日期格式,精確到毫秒
SuccessivelyTestB(){
System.out.println(df.format(new Date()) + "==>successivelyTestB");
}
@PostConstruct
void testPostConstruct(){
System.out.println(df.format(new Date()) + "==>testPostConstructB");
}
@Autowired
private void testAutowired(Test test){
System.out.println(df.format(new Date()) + "==>testAutowiredB");
}
}
2.1 當類 SuccessivelyTestA 和類 SuccessivelyTestB 無關聯時,按類載入順序執行
執行結果為:
2020-12-14 22:44:01.711==>successivelyTestA
2020-12-14 22:44:01.714==>testAutowiredA
2020-12-14 22:44:01.714==>testPostConstructA
2020-12-14 22:44:01.714==>successivelyTestB
2020-12-14 22:44:01.715==>testAutowiredB
2020-12-14 22:44:01.715==>testPostConstructB
2.2 若在SuccessivelyTestA類 中注入 SuccessivelyTestB 類時 ,則執行順序為: A類構造方法 > B類構造方法 > B類 @Autowired > B類 @PostConstruct > A類 @Autowired > A類 @PostConstruct
/**
* @Auther: yoult
* @Description: TODO 初始化函式執行順序測試
* @LoginName: ZDGG
* @Date: 2020-12-14 22:01 星期一
*/
@Component
public class SuccessivelyTestA {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");//設定日期格式,精確到毫秒
SuccessivelyTestA(){
System.out.println(df.format(new Date()) + "==>successivelyTestA");
}
@PostConstruct
void testPostConstruct(){
System.out.println(df.format(new Date()) + "==>testPostConstructA");
}
/**
* 此處把注入類改為 SuccessivelyTestB
* @param successivelyTestB
*/
@Autowired
private void testAutowired(SuccessivelyTestB successivelyTestB){
System.out.println(df.format(new Date()) + "==>testAutowiredA");
}
}
執行結果為:
2020-12-14 22:53:02.072==>successivelyTestA
2020-12-14 22:53:02.074==>successivelyTestB
2020-12-14 22:53:02.076==>testAutowiredB
2020-12-14 22:53:02.076==>testPostConstructB
2020-12-14 22:53:02.077==>testAutowiredA
2020-12-14 22:53:02.077==>testPostConstructA