【问题标题】:Initialise CDI injected components in constructor or post-method?在构造函数或后方法中初始化 CDI 注入组件?
【发布时间】:2013-09-26 10:09:21
【问题描述】:

我在 Vaadin 上下文中使用 CDI,但这对我的问题来说并不重要: 通常是在构造函数中注入对象,还是直接作为成员变量更好?特别是如果必须进一步配置这些对象才能使组件工作。

以下显示了两种不同的 CDI 可能性:

@UIScoped
public class MyMenuBar extends CustomComponent {
    @Inject @New private Label label;
    @Inject @New private MenuBar menuBar;

    @PostConstruct
    private void init() {
        //set label text, define menu entries
        setCompositionRoot(menuBar);
    }
}

@UIScoped
public class MyMenuBar extends CustomComponent {
    private Label label;
    private MenuBar menuBar;

    @Inject
    public MyMenuBar(@New Label label, @New MenuBar menuBar) {
        //set label text, define menu entries
        setCompositionRoot(menuBar);
    }
}

有最佳实践吗?为什么一个人更喜欢一种选择而不是另一种?还是只是个人选择的问题?

【问题讨论】:

    标签: java jakarta-ee vaadin cdi


    【解决方案1】:

    构造函数用于对象构造;即从不调用构造函数的业务逻辑。业务初始化逻辑始终使用@PostConstruct。更详细的解释见my answer to this

    简而言之,系统可能会以“意想不到的”方式调用构造函数。

    此外,在@PostConstruct 中,您可以保证注入所有依赖项(事件字段)。

    【讨论】:

    • 这么说:如果我@Inject 所有要在这个类中使用的对象和东西,我可能永远不需要构造函数?
    • 我不确定你的意思;我要说的是如果你有任何@Injected 字段,这些将被注入@PostConstruct 方法。构造函数中唯一可用的依赖项是构造函数 @Injected 参数。
    【解决方案2】:

    当您使用注入的资源(例如 CDI 和 EJB bean)时,请始终使用@PostConstruct,因为只有这样您才能确定它们确实已经被注入到 bean 中(这是由容器提供的)。这就是为什么在注入资源时不应该依赖构造函数的原因(它们可能被注入,但你不能确定)。

    但是,如果您处理非注入资源,构造函数初始化仍然很有用,因此您可以调用一些方法或初始化变量,在这种情况下更符合品味。但是一直使用@PostConstruct 永远不会出错。

    【讨论】:

      猜你喜欢
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      相关资源
      最近更新 更多