2013-05-14 84 views
16

在我看来有作用域的managedBean,我需要用DB中的数据填充一个列表。 林这样通过从构造函数直接调用,这样的事情:JSF - @PostConstruct和构造函数的直接方法调用有什么区别?

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

但这种方法可以在@PostConstruct注解的方法被调用,如:

public MyClass(){ 
} 

@PostConstruct 
populateFromDb(){...} 

之间有什么区别这个?

+1

[为什么使用@PostConstruct?](http://stackoverflow.com/q/3406555/1055089) – Vrushank 2013-05-14 11:32:35

回答

35

如果bean具有请求范围,则@PostConstruct将每次都执行。它将在托管bean实例化之后,但在bean放入作用域之前调用。这样的方法没有参数,返回void,并且可能不会声明一个检查的异常被抛出。方法可能是公开的,受保护的,私有的或私有的。如果该方法抛出未经检查的异常,则JSF实现不得将托管bean投入使用,并且不会调用该托管bean实例上的其他节点。

public TrainingClassForm() { 

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

    } 


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

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

+0

加一个从我身边。如果我想使用从数据库中提取的值初始化一个输入文本字段,我可以在PostConstruct的帮助下完成此工作,但在尝试在构造函数中执行相同操作时会失败。我有这个要求来初始化而不使用PostContruct。如果你有时间,你可以请回答这个问题:http://stackoverflow.com/questions/27540573/how-to-initialize-inputtextfield-with-a-value-from-database-on-runtime-withoutt – 2014-12-22 13:04:50

相关问题