【问题标题】:Using init function after constructor vs initializing in constructor - JAVA [duplicate]在构造函数之后使用初始化函数与在构造函数中初始化 - JAVA [重复]
【发布时间】:2018-08-02 10:19:29
【问题描述】:

有什么区别

public UserBean() {
        // create the session state
        state = new BigInteger(64, new SecureRandom()).toString(32);

}

public UserBean() {
        init();
}

@PostConstruct
    public void init() {
        // create the session state
        state = new BigInteger(64, new SecureRandom()).toString(32);            
    }

其中状态是类的众多属性之一。

【问题讨论】:

  • State 会在 UserBean 被实例化时被实例化。在其他情况下,UserBean 将被实例化,然后状态将被实例化。
  • 第一个恰好在构建新实例初始化state 之后,第二个在初始化调用方法init(初始化state)并在触发事件后构造时再次调用init 方法。 @PostConstruct 在 bean 的所有上下文初始化时触发。
  • 不应在构造函数中调用可覆盖的方法(使其成为最终方法)。由于@PostConstruct,这里也不需要它。先前评论的链接说明了其余部分。

标签: java constructor initialization


【解决方案1】:

您误解了@PostConstruct 注释。
执行依赖注入后,容器应调用带有注释的方法。 它没有被您的应用程序代码调用。

所以当然在没有容器(EJB、Spring、Guice...)的情况下使用@PostConstruct 是没有意义的。

@PostConstruct 文档指出:

PostConstruct 注解用于需要被 在依赖注入完成后执行以执行任何 初始化。

总结一下:

  • 容器通过调用构造函数来创建bean
  • 容器设置 bean 依赖项
  • @PostConstruct 方法被调用

请注意,在步骤 1、2 和 3 之间,容器可能会为其他 bean 执行其他任务,但您不必担心,因为 javadoc 还指出必须在类投入使用之前调用 @PostConstruct 方法.

【讨论】:

  • 我正在使用 jsf2 并使用 tomcat。那么tomcat 会处理@postConstruct 吗?
  • Tomcat 单独,不。它不是组件容器。它是一个 servlet 容器。如果您在应用程序中添加 Spring 作为组件容器,Spring 会处理它。
  • 但它在 jsf 2.2 代码中。你是说jsf没有什么可以照顾的吗?我认为 jsf 是 spring 的替代品。
  • 关于JSF2的托管bean,不知道。在互联网上,我们可以读到是的。所以试一试吧。
猜你喜欢
  • 2012-04-11
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 2012-03-19
  • 1970-01-01
相关资源
最近更新 更多