Java Spring autowire和原型范围

Java Spring autowire和原型范围,java,spring,annotations,inversion-of-control,Java,Spring,Annotations,Inversion Of Control,我有一个名为Bar的类,带有以下注释: @可配置(autowire=autowire.BY_TYPE) 对于私人成员,我有以下注释: @Autowired(required = true) private Foo foo; 在spring配置中,我有一个Foo类的bean。如果bean是用scope=“prototype”定义的,那么它不工作,我会得到以下异常: NoSuchBeanDefinitionException:找不到依赖项类型为Foo的匹配bean: 应至少有1个bean符合此依赖

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

对于私人成员,我有以下注释:

@Autowired(required = true)
private Foo foo;
在spring配置中,我有一个Foo类的bean。如果bean是用
scope=“prototype”
定义的,那么它不工作,我会得到以下异常:

NoSuchBeanDefinitionException:找不到依赖项类型为Foo的匹配bean: 应至少有1个bean符合此依赖项的autowire候选

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

原型范围的bean不允许自动布线吗

除了手动获取bean之外,还有其他解决方法吗

提前感谢,,
Avner

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


您正在使用哪个版本的Spring,并附上Spring-context.xml以了解更多详细信息。

我相信这是xml中为该bean声明的原型/单例问题

原型范围的bean不允许自动布线吗

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

除了手动获取bean之外,还有其他解决方法吗


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

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

  • 第一个链接讨论如何添加到Foo:

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

    这将导致每次调用都有一个新实例。

    我知道prototype和singleton之间的区别,我只是不明白为什么bean作用域会影响自动布线。我正在使用Spring3。谢谢你的回答,但是删除scope属性并不能修复我的代码,因为所有的Bar实例都将共享同一个Foo实例,这不是我需要的。另外,Foo实例应该在每个Bar对象创建/注入时实例化一次,而不是在每个字段使用时实例化一次(据我所知)。我不知道是否有适合您的特定设计的替代方案,请告诉我是否有。但就设计而言,bean应该以无状态的方式使用,这意味着在您的字段中要小心,确保这些bean中使用的字段不是全局字段而是方法字段,这样即使它是单态的,您也不会担心它是否被多个类共享,因为没有全局变量被共享,因为它是无状态的。相关:你写的很好,但是如果你只写需要配置代理的话会更好:)只有链接答案是错误的,如果给定的链接消失了会发生什么?