2013-03-29 30 views
0

我试图理解使用焊接的CDI。获得下一个结构:Weld @Inject ApplicationScope bean在每个注入点创建新实例

@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的相同实例。我做错了什么?

+3

你怎么确定它是一个新的实例?这可能是它注入了不同的代理。 – rdcrng

+0

你不会说你在标准输出中看到什么。 – akostadinov

回答

2

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

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

代理将基本上延伸MainFacade这是必需的,因为否则代理不能注入发生注入的字段。在创建代理实例时,您的bean的默认构造函数将被执行。由于Weld将创建多个代理,因此您将看到多个日志到控制台。您可以通过添加这样的事情你的构造验证这一点:

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

谢谢你,我早些时候发现了这个,但是你的帖子涵盖了所有方面。 – Minolan

0

当您使用@ApplicationScoped焊料会调用构造函数也specification here代理。

+0

我无法解析这个答案。你能重写它吗? –

相关问题