@PostConstruct
PostConstruct注釋用于在完成依賴項注入以執行任何初始化之后需要執行的方法。必須在類投入使用之前調用此方法。
所有支持依賴注入的類都必須支持此注釋。即使類沒有請求注入任何資源,也必須調用使用PostConstruct注釋的方法。
只有一個方法可以使用此批注進行批注。
應用PostConstruct注釋的方法必須滿足以下所有條件:除了攔截器之外,方法絕不能有任何參數,在這種情況下它采用Interceptor規范定義的InvocationContext對象。
在攔截器類上定義的方法必須具有以下簽名之一:
void <METHOD>(InvocationContext)Object <METHOD>(InvocationContext)拋出異常注意:
PostConstruct攔截器方法不能拋出應用程序異常,但可以聲明它拋出檢查異常,包括java.lang.Exception,
如果相同的攔截器方法除了生命周期事件之外插入業務或超時方法。
如果PostConstruct攔截器方法返回一個值,容器將忽略它。
在非攔截器類上定義的方法必須具有以下簽名:void <METHOD>()應用PostConstruct的方法可以是public,protected,package private或private。
除應用程序客戶端外,該方法絕不能是靜態的。
該方法可能是最終的。如果該方法拋出一個未經檢查的異常,那么該類絕不能投入使用,除非EJB可以處理異常甚至從它們恢復的EJB
然后就會思考問題,這個注釋是修飾初始化之后需要執行的方法,那么它和@Autowired、構造函數的執行順序是什么呢?(當然注釋中已經說明了PostConstruct注釋用于在完成依賴項注入之后)
@Service
public class BeanA {
@Autowired
private BeanB beanB;
public BeanA() {
System.out.println("這是Bean A 的構造方法");
}
@PostConstruct
private void init() {
System.out.println("這是BeanA的 init 方法");
beanB.testB();
}
}
@Service
public class BeanB {
@PostConstruct
private void init() {
System.out.println("這是BeanB 的init 方法");
}
public BeanB() {
System.out.println("這是Bean B的 構造方法");
}
void testB() {
System.out.println("這是Bean B 的 testB 方法");
}
}
啟動后輸出:
這是Bean A 的構造方法
這是Bean B的 構造方法
這是BeanB 的init 方法
這是BeanA的 init 方法
這是Bean B 的 testB 方法
所以得到結論: 構造方法 > @Autowired > @PostConstruct
posted on 2020-04-09 15:29
Terry Zou 閱讀(308)
評論(0) 編輯 收藏 所屬分類:
spring