在我的视图作用域的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尚未初始化 - 即没有注入依赖项.在@PostConstruct
bean 的方法中,bean被完全初始化,你可以使用依赖关系
@PostConstruct
来保证在bean生命周期中只调用一次这个方法.可能会发生(尽管不太可能)容器在其内部工作中多次实例化bean,但它保证@PostConstruct
只调用一次.
如果您的类在构造函数中执行所有初始化,那么@PostConstruct
确实是多余的.
但是,如果你的类使用setter方法注入其依赖项,那么类的构造函数不能完全初始化对象,有时需要在调用所有setter方法之后执行一些初始化,因此用例@PostConstruct
也看到这个和这个
归档时间: |
|
查看次数: |
49463 次 |
最近记录: |