**更改了示例以更好地表达情况
我正在使用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
fooB
和fooC
我理解,如果FOO
的范围是singleton
,那么它将起作用
但是如果有一种方法可以在使用protoype
范围时达到相同的目标,我就会徘徊。
还请解释一下这是自动装配概念的正确用法吗?我试图滥用弹簧框架的目的
答案 0 :(得分:5)
由于singleton
和prototype
范围似乎都不适合您(您不需要单个对象,但每次都不想要新实例),因此需要另一个范围。< / 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)
完全可以自动装配原型范围对象,但每次都会创建一个新实例。所以回答你的问题:不,你做不到。
对于其他部分,您对组件扫描和自动装配的使用似乎没有问题。