2010-02-03 84 views
4

**改变的例子来更好地表达情况是否有可能春天的Autowire一个protoype范围的类在两个地方同一个背景

我使用Spring 2.5的,并具有下列情形

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

class A 
{ 
    @Autowired 
    Foo fooA; 
} 


class B 
{ 
    @Autowired 
    Foo fooB; 
} 



class C 
{ 
    @Autowired 
    Foo fooC; 
} 

我试图了解是否有某种方式使用@AutowiredFOO相同的实例绑定到 fooAfooB,同时结合不同的实例fooC

我明白,如果FOO范围将singleton它会工作

,但我游荡,如果有一种方法,而使用protoype范围达到同样的目标。

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

回答

1

prototype范围的整点是你每次都得到一个不同的实例。另外,自动装配一个原型范围的bean是有问题的,在设计方面(事实上,如果它甚至被允许的话,我会感到一丝不安)。通常的想法是一起自动调用相同范围的bean(有解决方法,但在这里不相关)。

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

+0

上面的示例是我的情况的简化表达式 我使用原型形式的bean,因为它在我当前的配置中是需要的,有很多地方注入了bean,并且每个bean都需要一个新实例。 但有一个特定的地方,我想两个对象共享第三个对象的同一个实例,我想看看它是否支持春天 – Mark 2010-02-04 09:54:37

+0

也许你可以配置多个'Foo'单身豆,并将它们连接起来单独使用'@Autowired @ Qualifier' – skaffman 2010-02-04 10:03:52

1

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

您对组件扫描和自动连线的使用对另一部分似乎没问题。

5

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

在Web应用程序上下文中有一个现成的解决方案 - 使用request作用域 - 因此在每个请求/响应循环中,只有一个bean实例,无论注入的位置和次数如何。

在你可以定义自己的实现org.springframework.beans.factory.config.Scope

更新的非Web应用程序上下文:你澄清后,这似乎是一个很奇怪的情况。是什么在我脑海的是以下几点:

  • 定义两个FactoryBean S(实际 - 的AbstractFactoryBean子类) - 一个每次都返回新的对象,和一个返回相同的对象(两者应该是singleton范围)
  • @Resource(name="prototypeFactoryBean")@Resource(name="singletonFactoryBean")(而不是@Autowired)注入Foo小号
  • singletonFactoryBean可以设计成只返回一个单身(在工厂Bean类注射)
  • prototypeFactoryBean可以创建一个新实例,将BeanFactory(可通过getBeanFactory())投射到AutowireCapableBeanFactory并调用.autowire(newlyCreatedBean),然后将其返回。 (或者你可以注入ApplicationContext,并得到其AutowireCapableBeanFactory

但是,这是过于复杂,甚至我的解释:)

而且我认为你应该重新考虑你的设计,而不是后,你将需要延长春天知识使上面的“怪癖”

更新2:您的评论后,命名概念转移到注释 - 正如我上面显示你可以使用@Resource(name="someBean")

+0

我使用的是非web配置,所以建议的解决方案不适用,我上面的解释也过于简化了,我会修改它 – Mark 2010-02-04 09:59:05

+0

谢谢。我同意你上面所说的一切。我知道这看起来像一个奇怪的场景,但如果你仔细想想,在一个复杂的项目中有很多场合,其中一个特定类的几个实例在其他类中共享。如果你考虑Spring的XML配置,那么通过“命名”就可以非常简单地处理,你只需要定义两个不同名称的bean,这些名称由相同的“代码”表示,我只是试图看看这个功能是否转移到了注释中,看起来好像有点不一致 – Mark 2010-02-04 15:57:50

相关问题