Jakarta ee - 创建了两个 CDI @TransactionScoped Bean 实例.为什么



我有一个注入到 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不会创建代理对象。

最新更新