16

在我看来,作用域为 managedBean,我需要用数据库中的数据填充一个列表。我通过构造函数的直接调用来做到这一点,如下所示:

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

但是可以在 @PostConstruct 注释的方法中调用此方法,例如:

public MyClass(){
}

@PostConstruct
populateFromDb(){...}

这有什么区别?

4

1 回答 1

36

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

public TrainingClassForm() {

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

    }


向您推荐这个堆栈问题
在托管 bean 中,@PostConstruct在常规 Java 对象构造函数之后调用。
当构造函数被调用时,bean 还没有被初始化——即没有依赖注入。在该@PostConstruct方法中,bean 已完全初始化,您可以使用依赖项

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

于 2013-05-14T11:34:17.860 回答