4

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

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

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

class A
{ 
  @Autowired 
  Foo fooA;
}


class B
{ 
  @Autowired 
  Foo fooB;
}



class C
{ 
  @Autowired 
  Foo fooC;
}

我试图了解是否有某种方法可以使用@Autowired和绑定相同的实例,同时将不同的实例绑定FOOfooAfooBfooC

我知道,如果范围是,FOO它将singleton起作用

protoype但是如果有办法在使用范围时实现相同的目标,我会徘徊。

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

4

3 回答 3

5

由于范围似乎都不singleton适合prototype您(您不想要一个对象,但您不希望每次都有一个新实例),因此您需要另一个范围。

在 web 应用程序上下文中,有一个现成的解决方案 - 使用request范围 - 因此在每个请求/响应周期中,无论您在何处注入它以及注入它多少次,您都将只有一个 bean 实例。

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

更新:在你澄清之后,这似乎是一个非常奇怪的案例。我想到的是以下内容:

  • 定义两个FactoryBean(实际上是 的子类AbstractFactoryBean)——一个每次都返回新对象,一个返回相同的对象(它们都应该在singleton范围内)
  • 用and注入Foos (而不是)@Resource(name="prototypeFactoryBean")@Resource(name="singletonFactoryBean")@Autowired
  • singletonFactoryBean可以设计为只返回一个单例(在工厂 bean 类中注入)
  • prototypeFactoryBean可以创建一个新实例,将(BeanFactory可通过getBeanFactory())转换为AutowireCapableBeanFactory并调用.autowire(newlyCreatedBean),然后返回它。(或者你可以注入一个ApplicationContext并得到它AutowireCapableBeanFactory

但这过于复杂,即使经过我的解释,您也需要扩展弹簧知识 :)

此外,我认为您应该重新考虑您的设计,而不是制造上述“怪癖”

更新 2:在您发表评论之后,命名概念被转移到注释 - 正如我在上面指出的那样,您可以使用@Resource(name="someBean")

于 2010-02-03T13:45:40.117 回答
1

范围的全部意义prototype在于您每次都会获得不同的实例。

此外,从设计角度来看,自动装配原型范围的 bean 是有问题的(事实上,如果允许的话,我会有点惊讶)。通常的想法是将相同范围的bean自动装配在一起(有一些方法可以解决这个问题,但在这里不相关)。

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

于 2010-02-03T13:33:30.303 回答
1

自动装配原型作用域对象是完全可能的,但每次都会创建一个新实例。所以回答你的问题:不,你不能那样做。

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

于 2010-02-03T13:37:40.680 回答