java - Spring:如何处理 Spring 容器中的原型(prototype) bean,单例范围仅限于对象图的某个子部分?

标签 java spring dependency-injection inversion-of-control autowired

我认为这是一个微不足道的问题,但我找不到任何关于它的讨论。
我有DeeplyNestedObject,其对象图应该通过注入(inject)Dependency来 Autowiring 。在这个对象图中Dependency应该是单例范围的。

 class DeeplyNestedObject {
     Dependency dependency;//should be same instance as in SomeOtherObject
     SomeOtherObject someOtherObject;

     @Autowired
     public DeeplyNestedObject(Dependency dependency,
                               SomeOtherObject someOtherObject){
          this.dependency = dependency; 
          this.someOtherObject = someOtherObject;
     }

 }

 //this is just some other class nested inside DeeplyNestedObject's object graph
 class SomeOtherObject{
     Dependency dependency;//should be same instance as in DeeplyNestedObject

     @Autowired
     public DeeplyNestedObject(Dependency dependency){
          this.dependency = dependency; 
     }

 }

由于我只需要 Dependency 来 Autowiring SomeOtherObject 以及 DeeplyNestedObject,因此这个 bean 配置应该足够了:

@Bean
Dependency dependency(){
     return new Dependency();
 }

我有三个要求

  1. DeeplyNestedObject 应原型(prototype)化,因此每次我在某处 Autowiring 该对象图时,我都需要一个该对象图的新实例
  2. Dependency 应被视为此对象图中的单例,
  3. 每个DeeplyNestedObject应该有自己的Dependency实例

我无法解决以下问题:

  • 如果我将Dependency范围作为原型(prototype),我将始终获得一个新的Dependency实例,违反约束2(DeeplyNestedObject中的Dependency SomeOtherObject 会有所不同)
  • 如果我将Dependency范围限定为单例,那么我将违反约束3(每个DeeplyNestedObject及其对象图将共享相同的Dependency 对象)

基本上,我认为需要的是为DeeplyNestedObject引入另一个IoC容器,我可以在其中注入(inject)依赖项,然后将其作为DeeplyNestedObject 图的单例。但是,到目前为止我还没有看到任何类似的解决方案。

最佳答案

If I scope Dependency as prototype, I will always get a new instance, breaching constraint 2

我不认为。 Spring 仅在请求注入(inject)或 bean 加载时为原型(prototype)作用域 bean 创建一个新实例
因此,如果在将 DeeplyNestedObject bean 添加到 bean 容器中后,您不在 DeeplyNestedObject 中执行其他 Dependency 的 bean 加载/注入(inject),那么您将通过 DeeplyNestedObject 实例拥有不同的 Dependency 实例。

关于java - Spring:如何处理 Spring 容器中的原型(prototype) bean,单例范围仅限于对象图的某个子部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52664454/

相关文章:

java - 当使用自定义类对象作为 HashMap 的键时,从 Java HashMap 随机访问一个值?

java - 在 Java 中编写不带可选参数的可测试代码与在 ABAP OO 中注入(inject)的正确方法

java - spring+JPA EntityManager注入(inject)service和dao

java - Gradle 错误 : java. lang.String 无法转换为 org.gradle.api.artifacts.Configuration

交响乐 4.2+ : Replacement for ContainerAwareCommand's getContainer->get()

c# - 在静态类中使用依赖注入(inject)

java 如何从字符串向对象添加变量

Java - 在磁盘上创建 prn.json 文件

java - 简单线程串联运行? (第二个线程在第一个线程停止之前不会运行)

java - Spring Boot 找不到/WEB-INF/classes/index.jsp