在我的视图作用域的managedBean中,我需要用DB中的数据填充列表。 我通过构造函数的直接调用来执行此操作,如下所示:
public MyClass(){
list=populateFromDb();
}
但是这个方法可以在@PostConstruct注释方法中调用,如:
public MyClass(){
}
@PostConstruct
populateFromDb(){...}
这有什么区别?
答案 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 this和this