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