CDI从注入点所有者注入依赖项

时间:2013-11-18 13:18:27

标签: java cdi

我有一个名为Container的类:

public class Container {

    @Inject
    ServiceA serviceA;

    @Inject
    ServiceB serviceB;

}

ServiceB依赖于serviceA:

public class ServiceB {

    @Inject 
    ServiceA serviceA;
}

在我的应用程序内部可以有几个容器。现在,有没有任何技巧可以向ServiceB注入这个ServiceA实例,它已经被注入到与ServiceB相同的Container实例中?

3 个答案:

答案 0 :(得分:0)

您应该为对象定义@Singleton范围。把@Singleton注释放到Service A类例如

@Singleton
public class ServiceA  { 

}

答案 1 :(得分:0)

将您的课程注释为@ApplicationScoped@Singleton,这将确保您的申请中只有ServiceA的一个实例。在第一次注入此bean时将创建此实例。

P.S。我更喜欢焊接docs中建议的@ApplicationScoped因为@Singleton没有可以在序列化过程中使用问题的代理对象。

答案 2 :(得分:0)

您可以创建一个带有自定义范围的CDI扩展@ContainerScope" ContainerScopeExtension" ...

如何制作自定义范围可以在这里阅读: https://rpestano.wordpress.com/2013/06/30/cdi-custom-scope/

这样的ContainerScopeExtension的实现可能如下:

  1. 同一请求的每个容器实例都会在"容器缓存中记住"

  2. 创建服务实例时。获得当前"生产者的注入点"请求。如果注入点是控制器,请检查是否已为此容器生成服务。 (例如,在"每个容器缓存的服务中#34;)。否则创建一个新的服务实例并将其放在"服务缓存中#34;并记住此服务实例的容器。

  3. 如果注入点是服务..然后获得"父母"缓存的服务实例,用于查找" parent"的容器实例。服务。然后你可以检查是否已经为找到的容器生成了一个服务实例......

  4. 等...