我认为这是一个微不足道的问题,但我找不到任何关于它的讨论。
我有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();
}
我有三个要求
DeeplyNestedObject
应原型(prototype)化,因此每次我在某处 Autowiring 该对象图时,我都需要一个该对象图的新实例Dependency
应被视为此对象图中内的单例,- 每个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/