JSF - @PostConstruct和构造函数的直接方法调用有什么区别?

Mat*_*ari 15 jsf-2

在我的视图作用域的managedBean中,我需要用DB中的数据填充列表.我这样做是通过构造函数的直接调用,如下所示:

public MyClass(){
   list=populateFromDb();
}
Run Code Online (Sandbox Code Playgroud)

但是这个方法可以在@PostConstruct注释方法中调用,如:

public MyClass(){
}

@PostConstruct
populateFromDb(){...}
Run Code Online (Sandbox Code Playgroud)

这有什么区别?

Fre*_*eak 36

如果bean具有请求范围,则@PostConstruct将每次执行.它将在托管bean实例化之后调用,但在将bean放入范围之前调用.这样的方法不带参数,返回void,并且可能不会声明要抛出的已检查异常.方法可以是公共的,受保护的,私有的或包私有的.如果该方法抛出未经检查的异常,则JSF实现不得将托管bean置于服务中,并且不会调用该托管bean实例上的其他方法.

public TrainingClassForm() {

    }
  @PostConstruct
   public void init() {
       if (this.trainingListModel.getListDataModel() != null) {
          this.trainingListModel.getAllTrainingClasses();
       }

    }
Run Code Online (Sandbox Code Playgroud)


让你回答这个堆栈问题
在托管bean中,@PostConstruct在常规Java对象构造函数之后调用.
当调用构造函数时,bean尚未初始化 - 即没有注入依赖项.@PostConstructbean 的方法中,bean被完全初始化,你可以使用依赖关系

@PostConstruct来保证在bean生命周期中只调用一次这个方法.可能会发生(尽管不太可能)容器在其内部工作中多次实例化bean,但它保证@PostConstruct只调用一次.
如果您的类在构造函数中执行所有初始化,那么@PostConstruct确实是多余的.
但是,如果你的类使用setter方法注入其依赖项,那么类的构造函数不能完全初始化对象,有时需要在调用所有setter方法之后执行一些初始化,因此用例@PostConstruct
看到这个这个