亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號