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

我是第一次学习 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


慕码人2483693
浏览 85回答 2
2回答

素胚勾勒不出你

默认情况下@Autowired会尝试按类型查找 bean。在您的BookBean课堂上,您正在注入 aString title和 a&nbsp;List<String> authors。Spring 在引擎盖下做了什么?字符串标题- 它会找到一个String 类型的 Bean (如果它找到多个,它需要一个 @Qualifier 来确定要注入哪个),在你的情况下@Bean String title()列出作者- 它会尝试查找所有String 类型的 Bean,在您的场景中,您只有一个:title()总而言之,除非您使用注入它,否则您的List<String> authors()bean 将无法访问。@Resource(id ="authors")退后几步,你不应该依赖原语进行依赖注入,因为它们可能会误导你。如果你真的需要使用依赖注入,我建议将它们包装在一些类中,也就是定义一个Title类和一个Authors类。

米琪卡哇伊

当类型化集合或数组上存在 @Bean 注释时,该 bean 将自动填充应用程序上下文注册的该类型的所有 bean(请参阅参考文档)。在您的情况下,这是titleben (&nbsp;A sample book),因此authors列表仅包含该条目。如果您想自动装配特定的 bean,您可以使用@Qualifier注解引用名称(请参阅参考文档)。在您的情况下,构造函数可以重写为:@Autowiredpublic BookBean(String title, @Qualifier("authors") List<String> authors) {&nbsp; &nbsp; this.title = title;&nbsp; &nbsp; this.authors = authors;}当使用类型化集合时,参考文档实际上是建议的(在灰色部分下方向下滚动一点)。您要使用 @Resource 注释:private String title;@Resourceprivate List<String> authors;public BookBean(String title) {&nbsp; &nbsp; this.title = title;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java