为了账号安全,请及时绑定邮箱和手机立即绑定

DI 将 String bean 作为 List<String> 的单个元素注入

DI 将 String bean 作为 List<String> 的单个元素注入

慕码人2483693 2022-10-26 17:01:16
我是第一次学习 Spring Framework 和 DI,并尝试了一个带有 Spring-boot 1.2.0 的小测试应用程序(由于 Spring Framework 版本要求为 4.1.x,项目限制),我制作了一个具有两个属性的 BookBean:一个字符串标题和一个作者列表。显然 DI 将标题作为列表的唯一成员注入,我完全不知道为什么。我在标记为 @Bean 的方法上添加了一些日志记录,以查看它们何时被调用以及 BookBean 构造函数,我注意到在调用构造函数之后调用了 String 方法:[2019-04-29 14:46:05.631] boot - 3888  INFO [main] --- CollectionConfig: returning title: [A sample book][2019-04-29 14:46:05.637] boot - 3888  INFO [main] --- BookBean: construction called[2019-04-29 14:46:05.649] boot - 3888  INFO [main] --- CollectionConfig: returning authors: [[John, Adam, Harry]]这让我相信 DI 在尝试构造 BookBean 时没有可用的 List bean,并且“做了次好的事情”,返回一个注入了它知道的唯一 String bean 的 List:title。反过来,这让我相信我可能以错误的方式做整个 Autowired 事情,并且我可能无法按照要求按类型/名称排列自动装配。据我了解,默认自动装配是按类型,构造函数应该尝试查找两种不同类型的 bean:String 和 List,但我尝试使用 @Bean(name = "title"/"authors" 注释 bean ) 没有成功。如果我还尝试使用 @Qualifier("title"/"authors") 注释构造函数参数,则会收到以下错误:[2019-04-29 14:54:25.847] boot - 20824  INFO [main] --- CollectionConfig: returning title: [A sample book][2019-04-29 14:54:25.853] boot - 20824  WARN [main] --- AnnotationConfigEmbeddedWebApplicationContext: Exception encountered during context initialization - cancelling refresh attempt
查看完整描述

2 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

默认情况下@Autowired会尝试按类型查找 bean。在您的BookBean课堂上,您正在注入 aString title和 a List<String> authors

Spring 在引擎盖下做了什么?

字符串标题- 它会找到一个String 类型的 Bean (如果它找到多个,它需要一个 @Qualifier 来确定要注入哪个),在你的情况下@Bean String title()

列出作者- 它会尝试查找所有String 类型的 Bean,在您的场景中,您只有一个:title()

总而言之,除非您使用注入它,否则您的List<String> authors()bean 将无法访问。@Resource(id ="authors")

退后几步,你不应该依赖原语进行依赖注入,因为它们可能会误导你。如果你真的需要使用依赖注入,我建议将它们包装在一些类中,也就是定义一个Title类和一个Authors类。


查看完整回答
反对 回复 2022-10-26
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

当类型化集合或数组上存在 @Bean 注释时,该 bean 将自动填充应用程序上下文注册的该类型的所有 bean(请参阅参考文档)。在您的情况下,这是titleben ( A sample book),因此authors列表仅包含该条目。

如果您想自动装配特定的 bean,您可以使用@Qualifier注解引用名称(请参阅参考文档)。

在您的情况下,构造函数可以重写为:

@Autowired

public BookBean(String title, @Qualifier("authors") List<String> authors) {

    this.title = title;

    this.authors = authors;

}

当使用类型化集合时,参考文档实际上是建议的(在灰色部分下方向下滚动一点)。您要使用 @Resource 注释:


private String title;


@Resource

private List<String> authors;


public BookBean(String title) {

    this.title = title;

}


查看完整回答
反对 回复 2022-10-26
  • 2 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信