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

时间:2013-03-29 10:11:25

标签: java cdi weld jsr299

我正在尝试使用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实例。我做错了什么?

2 个答案:

答案 0 :(得分:2)

我认为此测试不能很好地验证应用程序作用域bean是否真的是“单例”。

如果将此bean注入其他bean,Weld将创建一个代理,该代理将处理对正确实例的所有调用的委派。这很重要,特别是如果您将请求范围的bean注入到会话范围的bean中,例如。

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

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

答案 1 :(得分:0)

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