最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

哈嘍大家好啊,我是Hydra。

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

首先,聲明一個接口:

public interface UserDao {
    String getName();
}

然后定義兩個類來分別實現(xiàn)這個接口,并通過@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 "#公眾號:碼農(nóng)參上";
    }
}

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

Map注入

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

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

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

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

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

修改UserDaoA,指定名稱:

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

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

List注入

Service中,這次注入泛型為接口UserDao類型的List

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

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

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

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

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

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

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

Set注入

同樣,也可以使用無序的Set注入bean,泛型指定為接口類型。

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

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

查看Set中的元素,和List相同,只不過順序變?yōu)闊o序,不會因為@Order注解的值而改變:

數(shù)組注入

最后,我們再來看一下數(shù)組注入的方式:

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

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

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

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

應(yīng)用

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

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

使用策略模式進行改造,首先修改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 "#公眾號:碼農(nóng)參上";
    }
}

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

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

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

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

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

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

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

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

相關(guān)文章

  • Java JDK8新增Optional工具類講解

    Java JDK8新增Optional工具類講解

    這篇文章主要介紹了Java JDK8新增Optional工具類講解,本文通過老版和jdk8對比對null的處理方式,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Spring MVC 更靈活的控制 json 返回問題(自定義過濾字段)

    Spring MVC 更靈活的控制 json 返回問題(自定義過濾字段)

    本篇文章主要介紹了Spring MVC 更靈活的控制 json 返回問題(自定義過濾字段),具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • 在spring中手寫全局異常攔截器

    在spring中手寫全局異常攔截器

    這篇文章主要介紹了如何在spring中手寫全局異常攔截器,幫助大家更好的理解和使用spring框架,感興趣的朋友可以了解下
    2020-11-11
  • Java實現(xiàn)駝峰、下劃線互轉(zhuǎn)的方法

    Java實現(xiàn)駝峰、下劃線互轉(zhuǎn)的方法

    這篇文章主要介紹了Java實現(xiàn)駝峰、下劃線互轉(zhuǎn)的示例代碼,主要有使用 Guava 實現(xiàn)和自定義代碼轉(zhuǎn),本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • JavaCV實現(xiàn)圖片中人臉檢測的示例代碼

    JavaCV實現(xiàn)圖片中人臉檢測的示例代碼

    這篇文章主要介紹了如何利用JavaCV實現(xiàn)圖片中人臉檢測的功能,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的可以了解一下
    2022-11-11
  • 使用dom4j實現(xiàn)xml轉(zhuǎn)map與xml轉(zhuǎn)json字符串

    使用dom4j實現(xiàn)xml轉(zhuǎn)map與xml轉(zhuǎn)json字符串

    這篇文章主要為大家詳細介紹了如何使用dom4j實現(xiàn)xml轉(zhuǎn)map與xml轉(zhuǎn)json字符串功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2024-11-11
  • 關(guān)于Springboot的擴展點DisposableBean的原理解析

    關(guān)于Springboot的擴展點DisposableBean的原理解析

    這篇文章主要介紹了關(guān)于Springboot的擴展點DisposableBean的原理解析,DisposableBean是一個接口,為Spring bean提供了一種釋放資源的方式 ,只有一個擴展方法destroy(),需要的朋友可以參考下
    2023-05-05
  • AsyncHttpClient的TimeoutTimerTask連接池異步超時

    AsyncHttpClient的TimeoutTimerTask連接池異步超時

    這篇文章主要為大家介紹了AsyncHttpClient的TimeoutTimerTask連接池異步超時源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • springboot 使用自定義的aspect的示例代碼

    springboot 使用自定義的aspect的示例代碼

    這篇文章主要介紹了springboot 使用自定義的aspect的示例代碼,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Java語言實現(xiàn)掃雷游戲(1)

    Java語言實現(xiàn)掃雷游戲(1)

    這篇文章主要為大家詳細介紹了Java語言實現(xiàn)的掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評論

曲阜市| 潼南县| 徐闻县| 定西市| 大足县| 巴东县| 双鸭山市| 本溪市| 峨边| 蒙自县| 洞口县| 波密县| 镇赉县| 得荣县| 沽源县| 田阳县| 伊吾县| 邵阳市| 谢通门县| 达拉特旗| 长垣县| 托克逊县| 湖口县| 且末县| 四会市| 万州区| 长子县| 宁安市| 濉溪县| 始兴县| 四川省| 乐业县| 元谋县| 旺苍县| 璧山县| 澄迈县| 会宁县| 公主岭市| 瑞丽市| 周至县| 彰化市|