Spring 注入 Bean 到 List / Map 中

前言

由于在工作中遇到了這樣的問題价捧,所以隨筆寫下來饭耳,記錄一下偶垮。
我們平常習(xí)慣的注入方式是:
@Autowired
private 類的名稱 對象名稱;
這種方式是最簡單的遗增,也是最實(shí)用的叫惊。但是有些時(shí)候我們就需要將實(shí)現(xiàn)了同樣接口的Bean注入到Context中,然后可以用 List / Map 接受注入的對象贡定。

正文

想象一下這樣的例子赋访,我們需要解析一個(gè)字符串,有好幾個(gè)解析這個(gè)字符串的Service,然后在對贏得地方使用對應(yīng)的Service蚓耽。如果我們把每一個(gè)解析器Service都有一個(gè)自己的接口渠牲,那么就違背了,他們都在做同一件事步悠,只是做法不同的初衷签杈。如果是有默認(rèn)解析器,可以使用@Primary注解(這個(gè)注解會在實(shí)現(xiàn)相同接口的Bean中找到有@Primary鼎兽,把這個(gè)Bean作為優(yōu)先級最高的注入進(jìn)來)答姥,如果有好多個(gè)@Primary, Spring 又會傻傻分不清谚咬,到底要注入那個(gè)鹦付,于是就會報(bào)Exception,這個(gè)時(shí)候我們可以使用@Qualifier具體指定以哪個(gè)實(shí)體類注入择卦。如果這樣的話敲长,當(dāng)我們在一個(gè)地方需要好多個(gè)解析器,我們得寫好多個(gè)@Autowired以及具體指定的@Qualifier秉继。
Spring的厲害之處祈噪,就是咱們的煩惱,他都能想得到尚辑,于是便有了將注入的Bean 放在List或者M(jìn)ap中這樣的 “玩法”辑鲤。
下面直接上例子:
我創(chuàng)建了一個(gè)接口叫做“Parent”然后有三個(gè)實(shí)現(xiàn)它的類分別為 “ChildA”,“ChildB”杠茬,“ChildC”月褥。然后創(chuàng)建了一個(gè)Controller類,用于注入那些Bean澈蝙。目錄結(jié)構(gòu)如下:

屏幕快照 2019-01-26 下午10.02.48.png

Parent 類代碼如下:

package com.example.injectdemo.model;

public interface Parent {

    public void say();
}

Child類代碼如下:

package com.example.injectdemo.model;

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component("ChildA")
public class ChildA implements Parent{
    @Override
    public void say() {
        System.out.println("I am ChildA");
    }
}

Tips:@Component一定要傳遞這個(gè)bean注入的名稱吓坚,因?yàn)樵谶@個(gè)時(shí)候spring不會自動幫我們把注入的bean的名稱處理好撵幽。
Controller類代碼如下:

package com.example.injectdemo;

import com.example.injectdemo.model.Parent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;
import java.util.Map;
import java.util.Set;

@Controller
@RequestMapping("/test")
public class InjectController {

    @Autowired
    private Map<String, Parent> map;

    @Autowired
    private List<Parent> list;
    @RequestMapping("/say")
    public void sayTest(){
        Set<Map.Entry<String, Parent>> sets =  map.entrySet();
        for(Map.Entry<String,Parent> item:sets){
            System.out.println(item.getKey());
        }

        for(Parent parent : list){
            parent.say();
        }
    }
}

Tips:Map的Key是實(shí)現(xiàn)類的名稱灯荧,Value為具體的類(Value的泛型為接口名稱)
啟動Application后,訪問URL盐杂,查看結(jié)果逗载,結(jié)果為:

ChildA
ChildB
ChildC
I am ChildA
I am childB
I am ChildC

Map我在這里不多說,通過代碼链烈,可以看的一清二楚厉斟。
List我在多說一點(diǎn):
如果我們不想讓調(diào)用的順序?yàn)镃hildA->ChildB->ChildC怎么辦。
我們可以分別在這三個(gè)實(shí)現(xiàn)的@Component注解下面加上@Order(number),這里的number 可以填寫數(shù)字强衡。數(shù)字越大擦秽,在list中越靠前。
加完之后 ChildA是這樣的:

package com.example.injectdemo.model;

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component("ChildA")
@Order(3)
public class ChildA implements Parent{
    @Override
    public void say() {
        System.out.println("I am ChildA");
    }
}

其他的B,C分別加上 2和1
輸出的順序是:
ChildA
ChildB
ChildC
I am ChildC
I am childB
I am ChildA

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末感挥,一起剝皮案震驚了整個(gè)濱河市缩搅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌触幼,老刑警劉巖硼瓣,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異置谦,居然都是意外死亡堂鲤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門媒峡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘟栖,“玉大人,你說我怎么就攤上這事谅阿÷冢” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵奔穿,是天一觀的道長镜沽。 經(jīng)常有香客問我,道長贱田,這世上最難降的妖魔是什么缅茉? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮男摧,結(jié)果婚禮上蔬墩,老公的妹妹穿的比我還像新娘。我一直安慰自己耗拓,他們只是感情好拇颅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著乔询,像睡著了一般樟插。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上竿刁,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天黄锤,我揣著相機(jī)與錄音,去河邊找鬼食拜。 笑死鸵熟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的负甸。 我是一名探鬼主播流强,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼痹届,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了打月?” 一聲冷哼從身側(cè)響起短纵,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎僵控,沒想到半個(gè)月后香到,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡报破,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年悠就,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片充易。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梗脾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盹靴,到底是詐尸還是另有隱情炸茧,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布稿静,位于F島的核電站梭冠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏改备。R本人自食惡果不足惜控漠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悬钳。 院中可真熱鬧盐捷,春花似錦、人聲如沸默勾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽母剥。三九已至滞诺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間媳搪,已是汗流浹背铭段。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工骤宣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秦爆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓憔披,卻偏偏與公主長得像等限,于是被迫代替她去往敵國和親爸吮。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容