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

时间:2013-05-14 11:28:39

标签: jsf-2

在我的视图作用域的managedBean中,我需要用DB中的数据填充列表。 我通过构造函数的直接调用来执行此操作,如下所示:

public MyClass(){
   list=populateFromDb();
}

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

public MyClass(){
}

@PostConstruct
populateFromDb(){...}

这有什么区别?

1 个答案:

答案 0 :(得分:35)

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

public TrainingClassForm() {

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

    }


让你回到this question of stack
在托管bean中,@PostConstruct在常规Java对象构造函数之后被调用。
当调用构造函数时,bean尚未初始化 - 即没有注入依赖项。 @PostConstruct方法中,bean已完全初始化,您可以使用依赖项

@PostConstruct是一个合同,保证在bean生命周期中只调用一次 。容器在其内部工作中可能会多次实例化(但不太可能),但它保证@PostConstruct仅被调用一次。
如果您的类在构造函数中执行所有初始化,那么@PostConstruct确实是多余的。
但是,如果您的类使用setter方法注入其依赖项,则该类的构造函数无法完全初始化该对象,有时需要在调用所有setter方法后执行某些初始化,因此@PostConstruct的用例
see thisthis