我有一个注入EJB enpoint的@TransactionScoped bean。当我通过例如调用EJB时在JAX-RS端点,我可以看到创建了两个bean实例。我感兴趣的是,为什么可能会创建第一个bean实例。它发生在payara和wildfly上。
@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;
}
}
我看到输出
#1实例是实际交易中使用的实例。为什么要创建第一个实例?它是那些特定应用服务器中CDI的实现细节还是故意发生?这只是出于好奇......
干杯, 丹尼尔
答案 0 :(得分:0)
您见证的最有可能是创建代理对象。
CDI(在您的情况下焊接,除非您更改了Wildfly内部构件)将创建基础对象本身以及它将提供给注入点的代理。
要验证这个想法,您可以尝试使用类似于您将使用@Singleton
bean的代码。在那里,构造函数应该只调用一次,如@Singleton
does not create a proxy object。