弹簧自动线和原型范围

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

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

@Autowired(required = true)
private Foo foo;

在春季配置中,我有一个Foo级的豆子。如果bean被定义为它不起作用,我得到以下异常:scope="prototype"

NoSuchBeanDefinitionException:没有为依赖项找到 Foo 类型的匹配 Bean:预期至少有 1 个 Bean,它有资格作为此依赖项的自动连接候选项

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

原型范围的Bean的自动布线是不允许的吗?

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

提前致谢,阿夫纳


答案 1

以下链接提供了此类方案的替代解决方案:http://whyjava.wordpress.com/2010/10/30/spring-scoped-proxy-beans-an-alternative-to-method-injection/

该链接讨论了如何添加到Foo:

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

这将为每个调用创建一个新实例。


答案 2

我相信这是在你的xml中为该bean声明的原型/单例的东西是问题所在。

原型范围的Bean的自动布线是不允许的吗?

我认为这是不允许的。逻辑是,如果允许,那么每当你使用该类时,它都需要重新证明该bean始终作为其字段。这很奇怪,特别是如果这个bean被自动连接为字段的类是单例本身。

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

只需尝试删除 scope 属性,因为如果它是原型属性,则不会检索它。如果这些 bean(服务和 DAO)在你的 applicationContext 中声明,只需让 autowire 注释将其作为单例获取,因为默认情况下 bean 是单例,它应该是单例。


推荐