创建了两个 CDI @TransactionScoped Bean 实例。为什么?
Two CDI @TransactionScoped Bean instances created. Why?
我有一个注入 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;
}
}
我看到输出
- TransactionBean #0 已创建。
- TransactionBean #1 已创建。
#1 实例是实际交易中使用的那个。为什么要创建这个第一个实例?它是那些特定应用程序服务器中 CDI 的实现细节还是故意发生的?只是出于好奇...
干杯,
丹尼尔
您看到的很可能是代理对象的创建。
CDI(在您的情况下为焊接,除非您更改了 Wildfly 内部结构)将创建底层对象本身以及它将传送到您的注入点的代理。
为了验证这个想法,您可以尝试一段类似于您将使用 @Singleton
bean 的代码。在那里,构造函数应该只被调用一次,因为 @Singleton
does not create a proxy object.
我有一个注入 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;
}
}
我看到输出
- TransactionBean #0 已创建。
- TransactionBean #1 已创建。
#1 实例是实际交易中使用的那个。为什么要创建这个第一个实例?它是那些特定应用程序服务器中 CDI 的实现细节还是故意发生的?只是出于好奇...
干杯, 丹尼尔
您看到的很可能是代理对象的创建。
CDI(在您的情况下为焊接,除非您更改了 Wildfly 内部结构)将创建底层对象本身以及它将传送到您的注入点的代理。
为了验证这个想法,您可以尝试一段类似于您将使用 @Singleton
bean 的代码。在那里,构造函数应该只被调用一次,因为 @Singleton
does not create a proxy object.