Java 在构造函数或post方法中初始化CDI注入组件?

Java 在构造函数或post方法中初始化CDI注入组件?,java,jakarta-ee,vaadin,cdi,Java,Jakarta Ee,Vaadin,Cdi,我在Vaadin环境中使用CDI,但这对我的问题不重要: 一般来说,在构造函数中注入对象更好,还是直接作为成员变量?尤其是当必须进一步配置这些对象才能使组件工作时 以下显示了两种不同的CDI可能性: @UIScoped public class MyMenuBar extends CustomComponent { @Inject @New private Label label; @Inject @New private MenuBar menuBar; @PostC

我在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);
    }
}

是否有最佳实践?为什么一个选择比另一个更可取?或者这只是个人选择的问题?

构造函数只用于对象构造的东西;i、 e.永远不要从构造函数调用业务逻辑。业务初始化逻辑始终使用
@PostConstruct
。有关更详细的说明,请参阅

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


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

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


但是,如果您处理非注入资源,构造函数初始化仍然很有用,因此您可以调用一些方法或init变量,在这种情况下,这更是一个有趣的问题。但是始终使用
@PostConstruct
绝对不会出错。

也就是说:如果我@injected所有要在这个cl中使用的对象和内容混蛋,我可能从来都不需要构造函数?我不确定你的意思;我要说的是,如果你有任何
@Inject
ed字段,这些字段将被注入
@PostConstruct
方法。构造函数中唯一可用的依赖项是构造函数
@Inject
ed参数。