是否可能Spring在两个地方自动装配原型范围类的相同实例

时间:2010-02-03 13:30:59

标签: spring inversion-of-control autowired

**更改了示例以更好地表达情况

我正在使用spring 2.5并且有以下情况

@Component
@Scope("prototype") 
Class Foo
{
}

class A
{ 
  @Autowired 
  Foo fooA;
}


class B
{ 
  @Autowired 
  Foo fooB;
}



class C
{ 
  @Autowired 
  Foo fooC;
}

我想了解是否有某种方法可以使用@Autowired并将同一个FOO实例绑定到 将不同的实例绑定到fooA

fooBfooC

我理解,如果FOO的范围是singleton,那么它将起作用

但是如果有一种方法可以在使用protoype范围时达到相同的目标,我就会徘徊。

还请解释一下这是自动装配概念的正确用法吗?我试图滥用弹簧框架的目的

3 个答案:

答案 0 :(得分:5)

由于singletonprototype范围似乎都不适合您(您不需要单个对象,但每次都不想要新实例),因此需要另一个范围。< / p>

在Web应用程序上下文中有一个现成的解决方案 - 使用request范围 - 因此在每个请求/响应周期中,只有一个bean实例,无论您注入它的位置和次数

在非Web应用程序上下文中,您可以定义自己的org.springframework.beans.factory.config.Scope

实现 澄清之后,

更新:,这似乎是一个非常奇怪的案例。我想到的是:

  • 定义两个FactoryBean s(实际上是AbstractFactoryBean的子类) - 每次返回一个新对象,一个返回同一个对象(两个都应该在singleton范围内)
  • 使用Foo@Resource(name="prototypeFactoryBean")(而不是@Resource(name="singletonFactoryBean"))注入@Autowired
  • singletonFactoryBean可以设计为只返回一个单例(在工厂bean类中注入)
  • prototypeFactoryBean可以创建新实例,将BeanFactory(通过getBeanFactory()提供)投射到AutowireCapableBeanFactory并调用.autowire(newlyCreatedBean),然后将其返回。 (或者您可以注入ApplicationContext并获取其AutowireCapableBeanFactory

但是这太复杂了,即使在我的解释之后你也需要延长弹簧知识:)

此外,我认为你应该重新考虑你的设计而不是做出上述'怪癖'

更新2 :在您发表评论后,命名概念会转移到注释 - 如上所述,您可以使用@Resource(name="someBean")

答案 1 :(得分:1)

prototype范围的重点是每次都获得不同的实例。

此外,自动装配原型范围的bean在设计方面是有问题的(事实上,如果它被允许,我会感到有些惊讶)。通常的想法是将相同范围的bean一起自动装配(有很多方法,但这里没有相关性)。

关于你的设计的一切都表明Foo不应该是原型 - 你为什么这么做?

答案 2 :(得分:1)

完全可以自动装配原型范围对象,但每次都会创建一个新实例。所以回答你的问题:不,你做不到。

对于其他部分,您对组件扫描和自动装配的使用似乎没有问题。