【问题标题】:JSF - what is the difference between @PostConstruct and direct method call from constructor?JSF - @PostConstruct 和构造函数的直接方法调用有什么区别?
【发布时间】:2013-05-08 15:57:03
【问题描述】:

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

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

但是这个方法可以在@PostConstruct注解的方法中调用,比如:

public MyClass(){
}

@PostConstruct
populateFromDb(){...}

这有什么区别?

【问题讨论】:

标签: jsf-2


【解决方案1】:

如果 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 生命周期 。容器在其内部工作中多次实例化 bean 可能会发生(尽管不太可能),但它保证 @PostConstruct 只会被调用一次。
如果您的类在构造函数中执行所有初始化,那么@PostConstruct 确实是多余的。
但是,如果你的类使用setter方法注入了依赖,那么类的构造函数就无法完全初始化对象,有时需要在调用完所有setter方法后进行一些初始化,因此@987654331的用例@
还有see thisthis

【讨论】:

  • 我这边加一个。如果我希望使用从数据库中获取的值来初始化 inputtext 字段,我可以在 PostConstruct 的帮助下完成,但在构造函数中尝试执行相同操作时会失败。我有这个要求在不使用 PostContruct 的情况下进行初始化。如果你有时间,你能不能也回答一下:stackoverflow.com/questions/27540573/…
猜你喜欢
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
相关资源
最近更新 更多