在我的范围为managedBean的视图中,我需要用数据库中的数据填充一个列表。我通过从构造函数直接调用来执行此操作,如下所示:public MyClass(){ list=populateFromDb();}但是可以在带有@PostConstruct注释的方法中调用此方法,例如:public MyClass(){}@PostConstructpopulateFromDb(){...}这有什么区别? 最佳答案 如果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中,在常规Java对象构造函数之后调用@PostConstruct。当调用构造函数时,bean尚未初始化-即没有注入依赖项。在@PostConstruct方法中,bean已完全初始化,您可以使用依赖项@PostConstruct是保证该方法在bean生命周期中仅被调用一次的协定。可能会发生(尽管不太可能)容器在其内部工作中多次实例化bean,但它保证@PostConstruct仅被调用一次。如果您的类在构造函数中执行了所有初始化操作,则@PostConstruct确实是多余的。但是,如果您的类使用setter方法注入了其依赖项,则该类的构造函数无法完全初始化该对象,有时在调用所有setter方法之后需要执行一些初始化,因此@PostConstruct Also 和see this关于jsf-2 - JSF-@PostConstruct和从构造方法直接调用之间有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16542003/ 10-12 17:26