Java Weld@InjectApplicationScope bean在每个注入点创建新实例

Java Weld@InjectApplicationScope bean在每个注入点创建新实例,java,cdi,weld,jsr299,Java,Cdi,Weld,Jsr299,我试图通过焊接来理解CDI。得到下一个结构: @ApplicationScoped public class MainFacade { @Inject private FooFacade fooFacade; private static int ins=0; public MainFacade() { super(); ins++; System.out.println("MainFacade instanc

我试图通过焊接来理解CDI。得到下一个结构:

@ApplicationScoped
public class MainFacade {

    @Inject
    private FooFacade fooFacade;

    private static int ins=0;

    public MainFacade() {
        super();
        ins++;
        System.out.println("MainFacade instance = "+ins);
    }

    public FooFacade getFooFacade() {
        return fooFacade;
    }
}
其中FooFacade也是@ApplicationScope

当应用程序启动时,我得到一个MainFacade实例=1。当我将其注入其他类(GWT RPC servlet)并调用mainFacade.getFooFacade()时,就会创建mainFacade的新实例以及fooFacade的新实例


我想Weld会在我注入应用程序范围bean的任何地方返回相同的实例。我做错了什么?

我认为这个测试无法很好地验证应用程序范围的bean是否真的是“单例”

如果将这个bean注入到其他bean中,Weld将创建一个代理,该代理将处理所有调用到正确实例的委托。这一点非常重要,例如,如果您将请求范围的bean注入会话范围的bean中,这一点尤为重要

代理将基本上扩展
MainFacade
,这是必需的,因为否则代理无法被注入到发生注入的字段中。创建代理实例时,将执行bean的默认构造函数。由于Weld将创建许多代理,您将看到控制台上有多个日志。您可以通过向构造函数中添加类似的内容来验证这一点:

System.out.println("Type: "+this.getClass().getName());

我认为这个测试无法很好地验证应用程序范围的bean是否真的是“单例”

如果将这个bean注入到其他bean中,Weld将创建一个代理,该代理将处理所有调用到正确实例的委托。这一点非常重要,例如,如果您将请求范围的bean注入会话范围的bean中,这一点尤为重要

代理将基本上扩展
MainFacade
,这是必需的,因为否则代理无法被注入到发生注入的字段中。创建代理实例时,将执行bean的默认构造函数。由于Weld将创建许多代理,您将看到控制台上有多个日志。您可以通过向构造函数中添加类似的内容来验证这一点:

System.out.println("Type: "+this.getClass().getName());

当您使用@ApplicationScoped Weld时,也会创建一个调用构造函数的代理。

当您使用@ApplicationScoped Weld时,也会创建一个调用构造函数的代理。

您如何确定它是一个新实例?可能是注入了不同的代理。你没有说你在标准输出上看到了什么。你如何确定这是一个新实例?可能是注入了不同的代理。你不会说你在stdout上看到了什么。谢谢,我之前发现了这个,但是你的帖子涵盖了所有方面。谢谢,我之前发现了这个,但是你的帖子涵盖了所有方面。我在解析这个答案时遇到了麻烦。你能重写一下吗?我在解析这个答案时遇到了困难。你能重写一下吗?