我有一个名为Bar的类,带有以下注释: @Configurable(autowire = Autowire.BY_TYPE)
在私有成员上,我有以下注释:
@Autowired(required = true)
private Foo foo;
在spring配置中,我有一个类Foo的bean . 如果使用 scope="prototype"
定义bean,则它不起作用,我得到以下异常:
NoSuchBeanDefinitionException:没有为依赖项找到Foo类型的匹配bean:期望至少有一个bean符合此依赖项的autowire候选者资格
一旦我将注入的bean范围更改为 "singleton"
,它就可以正常工作 .
是否允许原型scoped bean的自动接线?
有没有解决方法(除了手动获取bean)?
先谢谢,Avner
3 回答
如果注入的bean范围是“Singleton”,则bean的相同实例将自动连接 . 如果注入的bean范围是'prototype',则将创建新实例作为自动连接过程的一部分 .
您使用的是什么版本的Spring,还附加了spring-context.xml以获取更多详细信息 .
以下链接为此类方案提供了替代解决方案:
http://whyjava.wordpress.com/2010/10/30/spring-scoped-proxy-beans-an-alternative-to-method-injection/
http://benkiew.wordpress.com/2012/04/22/spring-2-5-x-create-prototype-instances-from-code/
第一个链接谈到添加到Foo:
这将导致每个呼叫的新实例 .
我相信它的xml中为该bean声明的原型/单例事物是个问题 .
我认为这是不允许的 . 逻辑是如果它被允许,那么无论何时使用该类,它都需要将该bean重新实例化为其字段 . 这很奇怪,特别是如果这个bean作为一个字段自动装配的类本身就是一个单例 .
只是尝试删除范围属性,如果它是原型属性,则不会检索它 . 如果在applicationContext中声明了这些bean(服务和DAO),那么让autowire注释将其作为单例进行处理,因为默认bean是单例,它应该是单例 .