我有一个注入到 EJB 点中的@TransactionScoped bean。当我通过例如 JAX-RS 端点调用 EJB 时,我可以看到创建了 Bean 的两个实例。出于兴趣,我想知道为什么要创建第一个 Bean 实例。它发生在帕亚拉和野蝇上。
@TransactionScoped
public class TransactionBean implements Serializable {
private String data;
private static AtomicInteger counter = new AtomicInteger();
public TransactionBean() {
this.data = "TransactionBean #" + counter.getAndIncrement() + " created.";
System.out.println("Created " + this.data);
}
public String toString() {
return data;
}
}
我看到输出
- 事务Bean #0 已创建。
- 事务Bean #1 已创建。
#1 实例是实际事务中使用的实例。为什么要创建第一个实例?它是CDI在这些特定应用程序服务器中的实现细节还是故意发生的?只是出于好奇...
干杯丹尼尔
你目睹的很可能是代理对象的创建。
CDI(在您的情况下为焊接,除非您更改了 Wildfly 内部)将创建底层对象本身以及它将交付到您的注入点的代理。
为了验证这个想法,你可以尝试一段类似于你将使用@Singleton
bean的代码。在那里,构造函数只应调用一次,因为@Singleton
不会创建代理对象。