当前位置: 首页 > 面试题库 >

Spring @Autowired是按名称还是按类型注入bean?

李安歌
2023-03-14
问题内容

我正在读初春(威利出版社)的书。在第二章中有一个关于Java配置和Java的示例@Autowired。它提供了这个@Configuration

@Configuration
public class Ch2BeanConfiguration {

    @Bean
    public AccountService accountService() {
        AccountServiceImpl bean = new AccountServiceImpl();
        return bean;
    }

    @Bean
    public AccountDao accountDao() {
        AccountDaoInMemoryImpl bean = new AccountDaoInMemoryImpl();
        //depedencies of accountDao bean will be injected here...
        return bean;
    }

    @Bean
    public AccountDao accountDaoJdbc() {
        AccountDaoJdbcImpl bean = new AccountDaoJdbcImpl();
        return bean;
    }
}

还有这个普通的bean类

public class AccountServiceImpl implements AccountService {

    @Autowired
    private AccountDao accountDao;

    public void setAccountDao(AccountDao accountDao) {
        this.accountDao = accountDao;
    }
    ...
}

当我运行代码时,它可以工作。但是我期待一个异常,因为我在配置中定义了2个具有相同类型的bean。

我意识到它的工作原理是这样的:

  • 如果Spring遇到多个具有相同类型的bean,它将检查字段名称。
    • 如果找到具有目标字段名称的bean,则将该bean注入该字段。

这不是错吗?Spring在处理Java配置时是否存在错误?


问题答案:

该文档解释了这个

对于后备匹配, bean名称被视为默认的限定符值。 因此,您可以使用id“
main”而不是嵌套的qualifier元素定义bean,从而得到相同的匹配结果。
但是,尽管您可以使用此约定按名称引用特定的bean,但从@Autowired根本上讲,它是带有可选语义限定符的类型驱动的注入。这意味着,即使带有Bean名称后退的限定符值,在类型匹配集中也始终具有狭窄的语义。他们没有在语义上表示对唯一bean
id的引用


因此,不,这不是错误,而是预期的行为。如果按类型自动装配找不到单个匹配的Bean,则将Bean ID(名称)用作备用。



 类似资料:
  • 我正在读《初春》(威利出版社)的书。在第2章中,有一个关于Java配置和的示例。它提供了这个类 还有这个普通的豆类课 当我运行代码时,它就工作了。但我预期会出现异常,因为我在配置中定义了两个具有相同类型的bean。 我意识到它是这样工作的: 如果Spring遇到多个具有相同类型的bean,它将检查字段名。 这不对吗?Spring对Java配置的处理是否存在缺陷?

  • 我有一个关于Spring注释的问题。在我的(学习)项目中,我定义了两个类,另一个类有两个属性,每种类型一个。为了生成一个错误,我在XML中定义了两个相同类类型的beans,并且在setter方法中使用了@Autowired注释。大概是这样的: 在主类中,我获取此 Bean 的应用程序上下文的实例,并打印覆盖 toString 方法的属性的内容,这是一个简单的测试。我已经读到Spring自动连线注释

  • 我使用的是Spring Boot1.3,我有下面的配置类: 当我试图按名称注入下面的bean之一时,它抛出:没有定义[java.text.SimpleDateFormat]类型的合格bean:预期的是单个匹配bean,但找到了2:dateAndTimeFormater,DateFormater。 如有任何建议,将不胜感激?

  • 我正在使用selenium Java搜索不同的网站,我知道要查找特定的WebElement,有不同的方法,比如使用Xpath、使用Class或使用id。假设某网站具有如下所示的html结构 现在,如果我想从类名为“score”和“score_title”的div中提取文本,即1%的强度、43:1的情感、75%的激情和12%的到达,下面哪个选项最好。

  • 问题内容: 我正在寻找一些关于JavaScript何时按值传递值,何时按引用传递,何时修改传递的项目影响函数外部值以及何时不传递值的良好综合阅读材料。我还对何时通过引用与按值分配给另一个变量以及是否遵循除作为函数参数传递以外的任何其他规则进行分配感兴趣。 我已经进行了很多搜索,找到了很多具体的示例(其中很多都在SO上),可以从这些示例中整理出一些真实的规则,但是我还没有找到一个写得很好的文档来描述

  • 问题内容: 我有一个HashMap: 然后我这样做: 第一次打印1000,第二次打印1000,该值不变。为什么Java按值而不是按引用返回Integer? 问题答案: 该方法返回对存储整数的引用的 副本 。 给存储该副本的变量分配一个新值,指向该值将 不会 更改映射中的引用。 如果可以的话,它会工作,但是由于是一个不可变的类,因此这不是一个选择。 如果要使更改在地图中生效,则必须将余额包装在(可变