首页 文章

spring 自动装配和原型范围

提问于
浏览
11

我有一个名为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 回答

  • -1

    如果注入的bean范围是“Singleton”,则bean的相同实例将自动连接 . 如果注入的bean范围是'prototype',则将创建新实例作为自动连接过程的一部分 .

    您使用的是什么版本的Spring,还附加了spring-context.xml以获取更多详细信息 .

  • 0

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

    第一个链接谈到添加到Foo:

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

    这将导致每个呼叫的新实例 .

  • 9

    我相信它的xml中为该bean声明的原型/单例事物是个问题 .

    是不是允许原型scoped bean的自动接线?

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

    有没有解决方法(除了手动获取bean)?

    只是尝试删除范围属性,如果它是原型属性,则不会检索它 . 如果在applicationContext中声明了这些bean(服务和DAO),那么让autowire注释将其作为单例进行处理,因为默认bean是单例,它应该是单例 .

相关问题