2012-03-22 90 views
10

我有一个名为酒吧与以下标注类: @Configurable(autowire = Autowire.BY_TYPE)弹簧自动装配和原型范围

在一个私有成员,我有以下注释:

@Autowired(required = true) 
private Foo foo; 

在春天的配置我有一颗豆Foo类。如果Bean与scope="prototype"定义它不工作,我得到以下异常:

NoSuchBeanDefinitionException:无类型的匹配豆富找到了依赖性: 预计将有至少1 Bean上有资格作为自动装配候选人,这依赖

一旦我改变注入豆范围"singleton"它工作正常。

是否允许自动接线原型范围的bean?

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

由于提前, 阿夫纳

+0

相关:http://stackoverflow.com/questions/27776672/spring-protype-scope-behaviour/27782040#27782040 – 2015-01-07 12:45:16

回答

9

以下链接为这样的场景提供替代解决方案:

  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/

有关添加foo第一个联系洽谈:

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

,这将导致每个呼叫都有一个新实例。

+0

这很好,你写了什么,但它会更好,如果你只是写,配置它与代理是必需的:) – tomekK 2016-05-13 05:53:37

+0

只有链接的答案是坏的,如果给定的链接消失会发生什么? – 2016-06-24 14:51:40

-1

如果注入的bean的范围是“单身”,bean的同一实例会自动连线。如果注入的bean作用域是'prototype',那么将创建新的实例作为auto-wire进程的一部分。

您正在使用哪个版本的Spring,并附加spring-context.xml以获取更多详细信息。

+1

我知道原型和singleton之间的差异,我只是不明白为什么应该bean范围对自动布线有影响。我使用spring 3. – 2012-03-22 11:55:50

0

我相信它的原型/ singleton在你的xml中声明的bean是这个问题。

是否允许自动接线原型范围的bean?

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

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

只要尝试删除范围属性,如果它是原型属性,将不会被检索。如果在applicationContext中声明了这些bean(服务和DAO),那么只需让autowire注解将其作为单例注册即可,因为默认情况下bean是单例的,应该是singleton。

+0

感谢您的回答,但删除scope属性不会修复我的代码,因为所有Bar实例将共享相同的Foo实例,这不是我所需要的。另外,Foo实例应该在每个Bar对象创建/注入时实例化一次,而不是每个字段的用法(就我的理解而言)。 – 2012-07-18 06:33:12

+0

我不知道是否有替代您的具体设计,告诉我,如果有。但就设计而言,bean应该以无状态的方式使用,这意味着在你的领域要小心,确保在这些bean中使用的字段不是全局字段,而是方法字段,这种方式甚至是单例,你赢了不用担心它是否被许多类共享,因为没有共享全局变量,因为它是无状态的。 – vine 2012-09-25 07:56:46

-2

或者您可以简单地使用新的操作符。

+1

这完全破坏了DI和IOC的全部目的。 – csmckelvey 2017-07-12 20:36:04