gpt4 book ai didi

jakarta-ee - 急切 CDI bean 实例化的干净解决方案

转载 作者:行者123 更新时间:2023-12-03 23:52:48 25 4
gpt4 key购买 nike

想象一下以下简化的 DI 模型:

@ApplicationScoped
public class A {

private B b;

@Inject
public A(B b) {
this.B = b;
}

}

@ApplicationScoped
public class B {

private C c;

@Inject
public B(C c) {
this.C = c;
}

}

@ApplicationScoped
public class C {

@PostConstruct
public void start() {
// processing that should begin on startup
}

}

假设我想要 C#start在部署完成时调用。网上一般推荐的模式是 here但该解决方案:1) 添加了太多样板文件,2) 为扩展添加了一个新的文本文件,3) 使用 toString 的作弊手段仅用于触发 B实例化实际 B 的代理下面的 bean 将依次触发 C代理等

从 CDI 1.1 开始,将以下方法添加到 A也是一个解决方案:
public void init(@Observes @Initialized(ApplicationScoped.class) Object init) {
B.toString();
}

这解决了上面描述的前两个问题,但我仍然需要在 B 上调用一个虚拟方法以便触发实例化/注入(inject)链并最终调用 @PostConstruct C 的注释方法.

我是否缺少解决此问题的更清洁的方法? CDI 2.0 能解决这个问题吗?

最佳答案

您无法为急切初始化选择任何选项,您必须选择一些“解决方法”。 CDI 没有定义 bean init 应该是惰性的还是急切的,因为惰性在大多数情况下更有意义,所以 Weld 就是这样做的。

您最好的选择类似于 article you mentioned建议。例如。设置一个扩展, cherry-pick 你想要急切初始化的bean并初始化它们,并在它们上调用一个(无害的)方法。

显然,这仅对部署中的少数 bean 有意义(我认为最多是应用范围的),因此不会有太多(如果有的话)开销。有一些额外的样板,但你不必写那么多行来完成这项工作。

为了让它更好,你可以让你所有的 bean 实现一个默认的虚拟接口(interface) ping()方法并从扩展中调用该方法 - 只是为了避免调用 toString() .

关于jakarta-ee - 急切 CDI bean 实例化的干净解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46361561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com