创建了两个 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;
    }
}

我看到输出

#1 实例是实际交易中使用的那个。为什么要创建这个第一个实例?它是那些特定应用程序服务器中 CDI 的实现细节还是故意发生的?只是出于好奇...

干杯, 丹尼尔

您看到的很可能是代理对象的创建。

CDI(在您的情况下为焊接,除非您更改了 Wildfly 内部结构)将创建底层对象本身以及它将传送到您的注入点的代理。

为了验证这个想法,您可以尝试一段类似于您将使用 @Singleton bean 的代码。在那里,构造函数应该只被调用一次,因为 @Singleton does not create a proxy object.