java - 在构造函数或后方法中初始化 CDI 注入(inject)组件?

标签 java jakarta-ee vaadin cdi

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

下面显示了两种不同的 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);
    }
}

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

最佳答案

构造函数用于对象构造;即永远不要从构造函数中调用业务逻辑。始终使用 @PostConstruct 作为业务初始化逻辑。参见 my answer to this以获得更详细的解释。

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

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

关于java - 在构造函数或后方法中初始化 CDI 注入(inject)组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19025331/

相关文章:

Java:CSV文件读写

java - Websphere Application Server 中所需的 Websphere MQ 类

javascript - vaadin 网格的组件渲染器

vaadin TreeTable 将树列放在第二列中

java - 如何将Java程序转成jar?

java - 相当于 Java 编码的 C# 代码

Java-Thread.setPriority()错误: cannot find symbol (the period between Thread and setPriority)

java - Spring 依赖注入(inject)和插件 Jar

java - 如果使用 "localhost"URL,则无法从 HttpServletRequest 获取 IP

java - Vaadin 中的多个 View 类