弹簧自动assembly和原型范围
我有一个名为Bar的类,带有以下注释: @Configurable(autowire = Autowire.BY_TYPE)
在私有成员上,我有以下注释:
@Autowired(required = true) private Foo foo;
在spring配置中,我有一个类Foo的bean。 如果使用scope="prototype"
定义bean,则它不起作用,我得到以下exception:
NoSuchBeanDefinitionException:没有为依赖项找到Foo类型的匹配bean:预期至少有1个bean符合此依赖项的autowire候选者
一旦我将注入的bean范围更改为"singleton"
它就可以正常工作。
是否允许原型scoped bean的自动接线?
有没有解决方法(除了手动获取bean)?
先谢谢,Avner
以下链接为此类方案提供了替代解决方案:
- 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:
@Component @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "prototype") class Foo
每次调用都会导致新实例。
我相信它的xml中为该bean声明的原型/单例事物是个问题。
是否允许原型scoped bean的自动接线?
我认为这是不允许的。 逻辑是如果它被允许,那么无论何时使用该类,它都需要将该bean重新实例化为其字段。 这很奇怪,特别是如果这个bean作为一个字段自动assembly的类本身就是一个单例。
是否有任何解决方法(除了手动获取bean)?
只是尝试删除范围属性,如果它是原型属性,则不会检索它。 如果在applicationContext中声明了这些bean(服务和DAO),那么让autowire注释将其作为单例进行处理,因为默认bean是单例,它应该是单例。
如果注入的bean范围是“Singleton”,则bean的相同实例将自动连接。 如果注入的bean范围是’prototype’,则将创建新实例作为自动连接过程的一部分。
您使用的是什么版本的Spring,还附加了spring-context.xml以获取更多详细信息。