![](/img/trans.png)
[英]Unsatisfied dependencies for type [***<T>] with qualifiers [@Default] at injection point [[field] @Inject
[英]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的实现可能如下:
在“容器缓存”中记住同一请求的每个容器实例
在创建服务实例时。 获取当前“生产者”请求的注入点。 如果注入点是控制器,请检查是否已为此容器生成服务。 (例如,在“每个容器缓存的服务”内)。 否则创建一个新的服务实例并将其放在“服务缓存”中并记住此服务实例的容器。
如果注入点是服务..然后获取缓存的“父”服务实例,以找到“父”服务的容器实例。 然后你可以检查是否已经为找到的容器生成了一个服务实例...
等等...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.