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



我正在尝试使用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也会创建一个调用构造函数的代理,在这里进行说明。

最新更新