Spring中bean集合注入的方法詳解
哈嘍大家好啊,我是Hydra。
Spring作為項目中不可缺少的底層框架,提供的最基礎的功能就是bean
的管理了。bean
的注入相信大家都比較熟悉了,但是有幾種不太常用到的集合注入方式,可能有的同學會不太了解,今天我們就通過實例看看它的使用。
首先,聲明一個接口:
public interface UserDao { String getName(); }
然后定義兩個類來分別實現這個接口,并通過@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 "#公眾號:碼農參上"; } }
準備工作完成后,我們看看幾種不同類型的集合注入方式。
Map注入
首先來看Map
類型的注入,直接在Service
中注入一個Map
,key
為字符串類型,value
為上面定義的接口類型。
@Service @AllArgsConstructor public class UserMapService { final Map<String, UserDao> userDaoMap; public Map<String,UserDao> getDaos(){ return userDaoMap; } }
通過接口測試,查看這個Map
中的內容:
可以看到,Map
中的value
是實現了接口的實例對象,key
則是beanName
,可以通過@Component
的value
屬性進行自定義。
修改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
中的內容,是我們放入容器中的兩個bean
:
我們知道,List
是一個有序的數據結構,那么如果想要修改List
中bean
的排序,該如何做呢?
很簡單,修改注入到spring容器中的兩個bean
,為它們添加@Order
注解并指定加載順序,數字越小越優(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
注解的值而改變:
數組注入
最后,我們再來看一下數組注入的方式:
@Service @AllArgsConstructor public class UserArrayService { private final UserDao[] userDaoArray; public UserDao[] getDaos(){ return userDaoArray; } }
查看數組中的元素:
并且,和List
比較類似的,數組中bean
的排序會受到@Order
注解數值的影響,有興趣的同學可以自己嘗試一下。
應用
了解了這幾種注入方式后,再簡單提一下它的使用場景。例如,我們可以用Map
注入實現策略模式,來替換代碼中繁雜的if/else
判斷。例如,原始的代碼中判斷邏輯可能是這樣的:
public String choice(String name){ if (name.equals("auth")){ return "Hydra"; }else if (name.equals("official")){ return "#公眾號:碼農參上"; } 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 "#公眾號:碼農參上"; } }
再修改Servie
中的方法,一行代碼即可實現原有的if/else
判斷:
@Service @AllArgsConstructor public class TestService { final Map<String, UserDao> userDaoMap; public String choice2(String name){ return userDaoMap.get(name).getName(); }; }
可能在這個例子中,這種寫法的優(yōu)點體現的不十分明顯,但是當你有一個非常長的if/else
判斷時,這種模式能使你的代碼看上去簡潔很多,并且符合代碼按照功能拆分的原則。
同理,如果你已經通過@Order
注解定義好了bean
的加載順序,也可以將它理解為bean
的優(yōu)先級,例如我想要調用優(yōu)先級最高的符合類型的bean
的方法,那么完全可以這樣寫:
@Service @AllArgsConstructor public class TestService { final List<UserDao> userDaoLists; public String choiceFirst(){ return userDaoLists.get(0).getName(); }; }
通過上面兩個簡單的例子可以看到,集合注入的方式使用起來非常靈活,我們可以在實際使用中,結合各種設計模式,寫出實用而優(yōu)雅的代碼。
以上就是Spring中bean集合注入的方法詳解的詳細內容,更多關于Spring集合注入的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot使用Spring Test進行集成測試的流程步驟
Spring Test 是 Spring Framework 提供的一個測試框架,它可以幫助我們進行集成測試,在本文中,我們將介紹如何使用 Spring Test 進行集成測試,需要的朋友可以參考下2023-06-06官方詳解HDFS?Balancer工具主要調優(yōu)參數
這篇文章主要為大家介紹了HDFS?Balancer工具主要調優(yōu)參數的?官方詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03