繁体   English   中英

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

[英]CDI Inject dependencies from Injection Point owner

我有一个名为Container的类:

public class Container {

    @Inject
    ServiceA serviceA;

    @Inject
    ServiceB serviceB;

}

ServiceB依赖于serviceA:

public class ServiceB {

    @Inject 
    ServiceA serviceA;
}

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

你应该为你的对象定义一个@Singleton范围。 将@Singleton注释放到ServiceA类中

例如

@Singleton
public class ServiceA  { 

}

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

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

您可以使用自定义范围创建CDI扩展@ContainerScope“ContainerScopeExtension”...

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

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

  1. 在“容器缓存”中记住同一请求的每个容器实例

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

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

  4. 等等...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM