0

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

4

2 回答 2

3

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

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

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

System.out.println("Type: "+this.getClass().getName());
于 2013-04-01T09:21:05.820 回答
0

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

于 2013-09-24T23:00:04.360 回答