欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring中bean集合注入的方法詳解

 更新時(shí)間:2022年07月06日 11:48:54   作者:碼農(nóng)參上  
Spring作為項(xiàng)目中不可缺少的底層框架,提供的最基礎(chǔ)的功能就是bean的管理了。bean的注入相信大家都比較熟悉了,但是有幾種不太常用到的集合注入方式,可能有的同學(xué)會(huì)不太了解,今天我們就通過(guò)實(shí)例看看它的使用

哈嘍大家好啊,我是Hydra。

Spring作為項(xiàng)目中不可缺少的底層框架,提供的最基礎(chǔ)的功能就是bean的管理了。bean的注入相信大家都比較熟悉了,但是有幾種不太常用到的集合注入方式,可能有的同學(xué)會(huì)不太了解,今天我們就通過(guò)實(shí)例看看它的使用。

首先,聲明一個(gè)接口:

public interface UserDao {
    String getName();
}

然后定義兩個(gè)類(lèi)來(lái)分別實(shí)現(xiàn)這個(gè)接口,并通過(guò)@Component注解把bean放入spring容器中:

@Component
public class UserDaoA implements UserDao {
    @Override
    public String getName() {
        return "Hydra";
    }
}
@Component
public class UserDaoB implements UserDao {
    @Override
    public String getName() {
        return "#公眾號(hào):碼農(nóng)參上";
    }
}

準(zhǔn)備工作完成后,我們看看幾種不同類(lèi)型的集合注入方式。

Map注入

首先來(lái)看Map類(lèi)型的注入,直接在Service中注入一個(gè)Map,key為字符串類(lèi)型,value為上面定義的接口類(lèi)型。

@Service
@AllArgsConstructor
public class UserMapService {
    final Map<String, UserDao> userDaoMap;

    public Map<String,UserDao> getDaos(){
        return userDaoMap;
    }
}

通過(guò)接口測(cè)試,查看這個(gè)Map中的內(nèi)容:

可以看到,Map中的value是實(shí)現(xiàn)了接口的實(shí)例對(duì)象,key則是beanName,可以通過(guò)@Componentvalue屬性進(jìn)行自定義。

修改UserDaoA,指定名稱(chēng):

@Component(value = "Hydra")
public class UserDaoA implements UserDao {...}

可以看到,key的值發(fā)生了改變:

List注入

Service中,這次注入泛型為接口UserDao類(lèi)型的List。

@Service
@AllArgsConstructor
public class UserListService {
    private final List<UserDao> userDaoLists;

    public List<UserDao> getDaos(){
        return userDaoLists;
    }
}

測(cè)試這個(gè)方法,查看List中的內(nèi)容,是我們放入容器中的兩個(gè)bean

我們知道,List是一個(gè)有序的數(shù)據(jù)結(jié)構(gòu),那么如果想要修改Listbean的排序,該如何做呢?

很簡(jiǎn)單,修改注入到spring容器中的兩個(gè)bean,為它們添加@Order注解并指定加載順序,數(shù)字越小越優(yōu)先加載。

@Component
@Order(1)
public class UserDaoA implements UserDao {……}
@Component
@Order(-1)
public class UserDaoB implements UserDao {……}

修改完成后,再進(jìn)行測(cè)試,可以看到bean的順序發(fā)生了改變:

Set注入

同樣,也可以使用無(wú)序的Set注入bean,泛型指定為接口類(lèi)型。

@Service
@AllArgsConstructor
public class UserSetService {
    private final Set<UserDao> userDaoSet;

    public Set<UserDao> getDaos(){
        return userDaoSet;
    }
}

查看Set中的元素,和List相同,只不過(guò)順序變?yōu)闊o(wú)序,不會(huì)因?yàn)?code>@Order注解的值而改變:

數(shù)組注入

最后,我們?cè)賮?lái)看一下數(shù)組注入的方式:

@Service
@AllArgsConstructor
public class UserArrayService {
    private final  UserDao[] userDaoArray;

    public UserDao[] getDaos(){
        return userDaoArray;
    }
}

查看數(shù)組中的元素:

并且,和List比較類(lèi)似的,數(shù)組中bean的排序會(huì)受到@Order注解數(shù)值的影響,有興趣的同學(xué)可以自己嘗試一下。

應(yīng)用

了解了這幾種注入方式后,再簡(jiǎn)單提一下它的使用場(chǎng)景。例如,我們可以用Map注入實(shí)現(xiàn)策略模式,來(lái)替換代碼中繁雜的if/else判斷。例如,原始的代碼中判斷邏輯可能是這樣的:

public String choice(String name){
    if (name.equals("auth")){
        return "Hydra";
    }else if (name.equals("official")){
        return "#公眾號(hào):碼農(nóng)參上";
    }    
    return null;
}

使用策略模式進(jìn)行改造,首先修改beanName

@Component(value = "auth")
public class UserDaoA implements UserDao {
    @Override
    public String getName() {
        return "Hydra";
    }
}
@Component(value = "official")
public class UserDaoB implements UserDao {
    @Override
    public String getName() {
        return "#公眾號(hào):碼農(nóng)參上";
    }
}

再修改Servie中的方法,一行代碼即可實(shí)現(xiàn)原有的if/else判斷:

@Service
@AllArgsConstructor
public class TestService {
    final Map<String, UserDao> userDaoMap;

    public String choice2(String name){
        return userDaoMap.get(name).getName();
    };
}

可能在這個(gè)例子中,這種寫(xiě)法的優(yōu)點(diǎn)體現(xiàn)的不十分明顯,但是當(dāng)你有一個(gè)非常長(zhǎng)的if/else判斷時(shí),這種模式能使你的代碼看上去簡(jiǎn)潔很多,并且符合代碼按照功能拆分的原則。

同理,如果你已經(jīng)通過(guò)@Order注解定義好了bean的加載順序,也可以將它理解為bean的優(yōu)先級(jí),例如我想要調(diào)用優(yōu)先級(jí)最高的符合類(lèi)型的bean的方法,那么完全可以這樣寫(xiě):

@Service
@AllArgsConstructor
public class TestService {
    final List<UserDao> userDaoLists;
    
    public String choiceFirst(){
        return userDaoLists.get(0).getName();
    };
}

通過(guò)上面兩個(gè)簡(jiǎn)單的例子可以看到,集合注入的方式使用起來(lái)非常靈活,我們可以在實(shí)際使用中,結(jié)合各種設(shè)計(jì)模式,寫(xiě)出實(shí)用而優(yōu)雅的代碼。

以上就是Spring中bean集合注入的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring集合注入的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解析如何開(kāi)發(fā)FineReport的自定義控件

    解析如何開(kāi)發(fā)FineReport的自定義控件

    FineReport作為插件化開(kāi)發(fā)的報(bào)表軟件,有些特殊需求的功能需要自己開(kāi)發(fā),開(kāi)發(fā)的插件包帆軟官方有提提供,可以去帆軟論壇上找,本文將主要介紹如何開(kāi)發(fā)一個(gè)自定義控件,這里講講方法論。需要的朋友一起來(lái)看下吧
    2016-12-12
  • 簡(jiǎn)單記事本java源碼實(shí)例

    簡(jiǎn)單記事本java源碼實(shí)例

    這篇文章主要介紹了簡(jiǎn)單記事本java源碼,以一個(gè)完整的實(shí)例形式分析了記事本的Java實(shí)現(xiàn)方法,對(duì)于Java應(yīng)用程序的開(kāi)發(fā)有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11
  • SpringBoot使用Spring Test進(jìn)行集成測(cè)試的流程步驟

    SpringBoot使用Spring Test進(jìn)行集成測(cè)試的流程步驟

    Spring Test 是 Spring Framework 提供的一個(gè)測(cè)試框架,它可以幫助我們進(jìn)行集成測(cè)試,在本文中,我們將介紹如何使用 Spring Test 進(jìn)行集成測(cè)試,需要的朋友可以參考下
    2023-06-06
  • java根據(jù)富文本生成pdf文件過(guò)程解析

    java根據(jù)富文本生成pdf文件過(guò)程解析

    這篇文章主要介紹了java根據(jù)富文本生成pdf文件過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Java生成壓縮文件的實(shí)例代碼

    Java生成壓縮文件的實(shí)例代碼

    在工作過(guò)程中,需要將一個(gè)文件夾生成壓縮文件,然后提供給用戶下載。下面通過(guò)實(shí)例代碼給大家介紹Java生成壓縮文件的方法,感興趣的朋友一起看看吧
    2018-06-06
  • 官方詳解HDFS?Balancer工具主要調(diào)優(yōu)參數(shù)

    官方詳解HDFS?Balancer工具主要調(diào)優(yōu)參數(shù)

    這篇文章主要為大家介紹了HDFS?Balancer工具主要調(diào)優(yōu)參數(shù)的?官方詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • window系統(tǒng)安裝jdk jre的教程圖解

    window系統(tǒng)安裝jdk jre的教程圖解

    java開(kāi)發(fā)少不了安裝jdk,jdk可以同時(shí)安裝多個(gè)版本,只要在項(xiàng)目部署時(shí)注意切換版本選擇,下面小編給大家?guī)?lái)了window系統(tǒng)安裝jdk jre的教程圖解,感興趣的朋友一起看看吧
    2018-08-08
  • java面向?qū)ο罄^承與多態(tài)介紹

    java面向?qū)ο罄^承與多態(tài)介紹

    大家好,本篇文章主要講的是java面向?qū)ο罄^承與多態(tài)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • 通過(guò)JDBC連接oracle數(shù)據(jù)庫(kù)的十大技巧

    通過(guò)JDBC連接oracle數(shù)據(jù)庫(kù)的十大技巧

    通過(guò)JDBC連接oracle數(shù)據(jù)庫(kù)的十大技巧...
    2006-12-12
  • java實(shí)現(xiàn)文件復(fù)制上傳操作

    java實(shí)現(xiàn)文件復(fù)制上傳操作

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件復(fù)制上傳操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11

最新評(píng)論