繁体   English   中英

焊接@Inject ApplicationScope bean在每个注入点创建新实例

[英]Weld @Inject ApplicationScope bean creates new instance in every inject point

我正在尝试使用Weld了解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());

使用@ApplicationScoped时,Weld会创建一个也调用构造函数的代理, 这里是规范

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM