弹簧自动装配和原型范围

时间:2012-03-22 10:02:16

标签: java spring annotations inversion-of-control

我有一个名为Bar的类,带有以下注释: @Configurable(autowire = Autowire.BY_TYPE)

在私人会员身上,我有以下注释:

@Autowired(required = true)
private Foo foo;

在spring配置中,我有一个类Foo的bean。如果使用scope="prototype"定义bean,则它不起作用,我得到以下异常:

  

NoSuchBeanDefinitionException:找不到依赖关系的类型为Foo的匹配bean:       预计至少有1个bean有资格成为此依赖关系的autowire候选者

一旦我将注入的bean范围更改为"singleton",它就可以正常工作。

是不是允许原型范围豆的自动接线?

是否有任何解决方法(除了手动获取bean之外)?

提前致谢, 阿夫纳

3 个答案:

答案 0 :(得分:12)

以下链接为此类方案提供了替代解决方案:

  1. http://whyjava.wordpress.com/2010/10/30/spring-scoped-proxy-beans-an-alternative-to-method-injection/
  2. http://benkiew.wordpress.com/2012/04/22/spring-2-5-x-create-prototype-instances-from-code/
  3. 第一个链接谈到添加到Foo:

    @Component
    @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "prototype")
    class Foo
    

    每次调用都会导致新实例。

答案 1 :(得分:0)

我相信它在xml中为该bean声明的原型/单例事件是个问题。

  

是不是允许原型范围豆的自动接线?

我认为这是不允许的。逻辑是如果它被允许,那么无论何时使用该类,它都需要将该bean始终作为其字段重新实例化。这很奇怪,特别是如果这个bean作为一个字段自动装配的类本身就是一个单独的。

  

是否有任何解决方法(除了手动获取bean)?

只是尝试删除scope属性,因为如果它是prototype属性,则不会被检索。如果在你的applicationContext中声明了那些bean(服务和DAO),那么让autowire注释将它作为singleton来获取,因为默认bean是singleton,它应该是。

答案 2 :(得分:-1)

如果注入的bean范围是“Singleton”,则bean的相同实例将自动连接。如果注入的bean范围是'prototype',则将创建新实例作为自动连接过程的一部分。

您正在使用的是什么版本的Spring,还附加了spring-context.xml以获取更多详细信息。