一種簡(jiǎn)潔的Spring Bean選擇器模式

作用

在日常開(kāi)發(fā)中式矫,我們常常會(huì)遇到一個(gè)接口有多個(gè)實(shí)現(xiàn)類時(shí),需要選擇合適的實(shí)現(xiàn)類的情況聪廉。

最簡(jiǎn)單的方法是寫(xiě)一個(gè)選擇器故慈,用if-else來(lái)判斷使用哪個(gè)實(shí)現(xiàn)類的實(shí)例,比如:

if(條件1){
  return 實(shí)現(xiàn)類a的實(shí)例;
}else if(條件2){
  retuen 實(shí)現(xiàn)類b的實(shí)例;
}

然而這種方法不符合開(kāi)閉原則(OCP)干签,如果再添加一個(gè)實(shí)現(xiàn)類拆撼,那么選擇器的代碼也需要再加一個(gè)else if。

所以竭贩,在參考了同事及網(wǎng)上的一些代碼后莺禁,我整理出了一種簡(jiǎn)潔的、符合設(shè)計(jì)原則的實(shí)現(xiàn)方式楼熄。

一種更好的選擇器:工具類

這種選擇器使用了策略模式柒傻,并且利用了Spring的自動(dòng)注入特性。

首先青柄,我們需要提供4個(gè)工具類:

public interface MatchingBean<K> {
    boolean matching(K factor);
}
public interface MyFactoryList<E extends MatchingBean<K>, K> extends List<E> {
    E getBean(K factor);
    List<E> getBeanList(K factor);
}
public class MyFactoryArrayList<E extends MatchingBean<K>, K> extends ArrayList<E>
        implements MyFactoryList<E, K>, Serializable {
    @Override
    public E getBean(K factor) {
        Iterator<E> itr = iterator();
        while (itr.hasNext()) {
            E beanMatch = itr.next();
            if (beanMatch.matching(factor)) {
                return beanMatch;
            }
        }
        return null;
    }
    @Override
    public List<E> getBeanList(K factor) {
        Iterator<E> itr = iterator();
        while (itr.hasNext()) {
            E beanMatch = itr.next();
            if (!beanMatch.matching(factor)) {
                itr.remove();
            }
        }
        return this;
    }
}
public class MyFactoryListEditor extends CustomCollectionEditor {
    public MyFactoryListEditor() {
        super(MyFactoryArrayList.class);
    }
}

一種更好的選擇器:使用示例

假設(shè)我們有個(gè)購(gòu)物接口致开,有淘寶和京東兩個(gè)實(shí)現(xiàn)萎馅。

那么就讓購(gòu)物接口繼承MatchingBean,代碼如下:

public interface BuyService extends MatchingBean<String> {
    public String goShopping();
}

然后在實(shí)現(xiàn)類里實(shí)現(xiàn)matching方法飒货,代碼如下:

@Service
public class JingdongService  implements BuyService {

    @Override
    public String goShopping() {
        return "Shopping in Jd";
    }

    @Override
    public boolean matching(String factor) {
        return "jd".equals(factor);
    }
}
@Service
public class TaobaoService implements BuyService {

    @Override
    public String goShopping() {
        return "Shopping in Taobao";
    }

    @Override
    public boolean matching(String factor) {
        return "taobao".equals(factor);
    }
}

最后,咱們寫(xiě)個(gè)測(cè)試類晃虫,看下選擇器的使用方法:

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestMyBeanUtil {

    @Autowired
    MyFactoryList<BuyService,String> factoryList;

    @Test
    public void testOne(){
        BuyService shop = factoryList.getBean("jd");
        System.out.println(shop.goShopping());
    }
}

參考文獻(xiàn)

https://my.oschina.net/guanhe/blog/1821060
系列文章總目錄:https://mp.weixin.qq.com/s/56JgXLArTAEDj1f3y4arLA

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哲银,一起剝皮案震驚了整個(gè)濱河市呻惕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌做院,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件山憨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡玛迄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)虏杰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)勒虾,“玉大人,你說(shuō)我怎么就攤上這事修然。” “怎么了玻靡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵中贝,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蝎土,道長(zhǎng)视哑,這世上最難降的妖魔是什么挡毅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任慷嗜,我火速辦了婚禮,結(jié)果婚禮上庆械,老公的妹妹穿的比我還像新娘菌赖。我一直安慰自己,他們只是感情好堕绩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布邑时。 她就那樣靜靜地躺著,像睡著了一般黍氮。 火紅的嫁衣襯著肌膚如雪浅浮。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天专执,我揣著相機(jī)與錄音郁油,去河邊找鬼。 笑死已艰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凿叠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蹬碧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼炒刁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起罗心,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤渤闷,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后飒箭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蜒灰,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年凸椿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了削饵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖叙凡,靈堂內(nèi)的尸體忽然破棺而出密末,到底是詐尸還是另有隱情,我是刑警寧澤严里,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布刹碾,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏色洞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一火诸、第九天 我趴在偏房一處隱蔽的房頂上張望置蜀。 院中可真熱鬧,春花似錦盯荤、人聲如沸舀瓢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至芥玉,卻和暖如春狱窘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背僚碎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工抠藕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒋困,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓零院,卻偏偏與公主長(zhǎng)得像村刨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嵌牺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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