@PostConstruct注解詳解
最近在項目中遇到一個問題,一位同事由於失誤注釋掉了@PostConstruct注解,導致目錄樹緩存失效,每次都得重新去數據庫取,找到問題后,順便記錄一下知識點。
背景
很多人以為@PostConstruct注解是Spring提供的,其實不是!@PostConstruct注解是Java自己提供的注解。
import javax.annotation.PostConstruct;
Java中該注解的說明:@PostConstruct該注解被用來修飾一個非靜態的void()方法。被@PostConstruct修飾的方法只會被服務器執行一次。
通常我們會是在Spring框架中使用到@PostConstruct注解。從依賴注入的字面意思就可以知道,要將對象b注入到對象a,那么首先就必須得生成對象a和對象b,才能執行注入。所以,如果一個類A中有個成員變量b被@Autowried注解,那么@Autowired注入是發生在A的構造方法執行完之后的。如果想在生成對象時完成某些初始化操作,而偏偏這些初始化操作又依賴於依賴注入,那么久無法在構造函數中實現。為此,可以使用@PostConstruct注解一個方法來完成初始化,@PostConstruct注解的方法將會在依賴注入完成后被自動調用。
該注解的方法在整個Bean初始化中的執行順序:

但是需要注意:子類實例化過程中會調用父類中的@PostConstruct方法!
@Component
public class TestRootClass {
public TestRootClass() {
System.out.println("Root Constructor");
}
@PostConstruct
public void sayHello() {
System.out.println("Hello! I am Root");
}
}
@Component
public class TestChildClass extends TestRootClass{
public TestChildClass() {
System.out.println("Child Constructor");
}
@PostConstruct
public void sayBye() {
System.out.println("Bye! I am Child");
}
}
打印結果
Root Constructor
Child Constructor
Hello! I am Root
Bye! I am Child
Root Constructor
Hello! I am Root