Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CDI从注入点所有者注入依赖项_Java_Cdi - Fatal编程技术网

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

Java CDI从注入点所有者注入依赖项,java,cdi,Java,Cdi,我有一个名为Container的类: public class Container { @Inject ServiceA serviceA; @Inject ServiceB serviceB; } 服务B依赖于服务A: public class ServiceB { @Inject ServiceA serviceA; } 在我的应用程序中可以有几个容器。现在,有什么技巧可以将这个ServiceA实例注入ServiceB吗?它已经注

我有一个名为Container的类:

public class Container {

    @Inject
    ServiceA serviceA;

    @Inject
    ServiceB serviceB;

}
服务B依赖于服务A:

public class ServiceB {

    @Inject 
    ServiceA serviceA;
}

在我的应用程序中可以有几个容器。现在,有什么技巧可以将这个ServiceA实例注入ServiceB吗?它已经注入到与ServiceB相同的容器实例中了。

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

比如说

@Singleton
public class ServiceA  { 

}

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


另外,我更喜欢Weld中建议的
@ApplicationScoped
,因为
@Singleton
没有代理对象,在序列化过程中可能会出现问题。

您可以使用自定义作用域@ContainerScope“ContainerScopeExtension”创建CDI扩展

如何创建自定义范围可在此处阅读:

这种集装箱范围扩展的实施可以如下所示:

  • 同一请求的每个容器实例都会被存储在“容器缓存”中

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

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

  • 等等


  • 不是这样吗?您尝试了什么?@IanMcLaird:默认情况下,注入将在依赖范围内,并且每个可注入对象都有自己的依赖范围实例。至少,这是我的理解,这可能是错误的!不幸的是,我需要将
    ServiceA
    的不同实例注入到不同的
    容器
    实例中,所以单例模式不是我的选择。我需要的是每个容器的单例模式,在这里,您可以使用每个JVM都是唯一的EJB单例(我不知道同样的事情是否适用于CDI单例),但我担心没有其他方法可以实现您想要的…但我认为整个应用程序也可能存在设计问题。。。