我有一个名为Container的类:
public class Container {
@Inject
ServiceA serviceA;
@Inject
ServiceB serviceB;
}
ServiceB依赖于serviceA:
public class ServiceB {
@Inject
ServiceA serviceA;
}
在我的应用程序内部可以有几个容器。现在,有没有任何技巧可以向ServiceB注入这个ServiceA实例,它已经被注入到与ServiceB相同的Container实例中?
答案 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的实现可能如下:
同一请求的每个容器实例都会在"容器缓存中记住"
创建服务实例时。获得当前"生产者的注入点"请求。如果注入点是控制器,请检查是否已为此容器生成服务。 (例如,在"每个容器缓存的服务中#34;)。否则创建一个新的服务实例并将其放在"服务缓存中#34;并记住此服务实例的容器。
如果注入点是服务..然后获得"父母"缓存的服务实例,用于查找" parent"的容器实例。服务。然后你可以检查是否已经为找到的容器生成了一个服务实例......
等...