为什么父类中的@PostConstruct方法在子类中的@PostConstruct方法之后执行?

men*_*.ye 9 java spring annotations

我对下面代码的结果有点困惑.
ParentController:

@Controller
public abstract class ParentController{

@PostConstruct
public void init(){
    System.out.println("Parent-----PostConstruct");
}


public ParentController(){
    System.out.println("Parent-----constructor");
}
} 
Run Code Online (Sandbox Code Playgroud)

ChildController:

@Controller
public class ChildController extends ParentController {
 @PostConstruct
public void init() {
    System.out.println("Child-----PostConstruct");
}

public ChildController(){
    System.out.println("Child-----constructor");
}
}
Run Code Online (Sandbox Code Playgroud)

结果如下:
Parent ----- constructor
Child ----- constructor
Child ----- PostConstruct
Parent ----- PostConstruct

我不知道为什么parent的postConstruct是在child的postContruct之后.

Fre*_*ahn 5

发生这种情况是因为您正在重写 @PostConstruct 方法。

到底是怎么回事:

  1. 调用子类的构造函数。

  2. 子类调用的构造函数super

  3. 调用父类的构造函数

  4. 执行父类的构造函数

  5. 父类构造函数完成

  6. 子类的构造函数被执行

  7. 子类的构造函数完成

  8. 子类的@PostConstruct被调用、执行、完成(因为我们调用了子类的构造函数)

  9. 父类的@PostConstruct被调用、执行、完成(因为我们调用了父类的构造函数)

UPD:(感谢@Andreas!)

  1. 在这种情况下,父类的 @PostConstruct 根本不会被调用。
    Spring不会调用被子类@PostConstruct方法覆盖的父类@PostConstruct方法,因为它知道它最终只会调用同一个方法两次(子方法),并且Spring知道这样做是错误的。

  • 你基本上重新输入了OP已经知道的内容。他问的是为什么会这样,而不是重申他已经知道了。 (2认同)