1. 程式人生 > 其它 >SpringBoot 學習之 @PostConstruct、 @Autowired與建構函式的執行順序

SpringBoot 學習之 @PostConstruct、 @Autowired與建構函式的執行順序

技術標籤:筆記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