我正在尝试使用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实例。我做错了什么?
答案 0 :(得分:2)
我认为此测试不能很好地验证应用程序作用域bean是否真的是“单例”。
如果将此bean注入其他bean,Weld将创建一个代理,该代理将处理对正确实例的所有调用的委派。这很重要,特别是如果您将请求范围的bean注入到会话范围的bean中,例如。
代理将基本上扩展MainFacade
,这是必需的,否则代理无法注入到正在发生注入的字段中。创建代理实例时,将执行bean的默认构造函数。由于Weld将创建许多代理,您将看到多个日志到控制台。您可以通过向构造函数中添加类似的内容来验证这一点:
System.out.println("Type: "+this.getClass().getName());
答案 1 :(得分:0)
当您使用@ApplicationScoped时,Weld也会创建一个调用构造函数的代理specification here。