成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

沒(méi)想到吧,Spring中還有一招集合注入的寫(xiě)法

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

哈嘍大家好啊,我是Hydra。

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

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

public interface UserDao {
String getName();
}

然后定義兩個(gè)類來(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)備工作完成后,我們看看幾種不同類型的集合注入方式。

Map注入

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

@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ò)@Component的value屬性進(jìn)行自定義。

修改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;
}
}

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

圖片

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

很簡(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,泛型指定為接口類型。

@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)锧Order注解的值而改變:

圖片

數(shù)組注入

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

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

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

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

圖片

并且,和List比較類似的,數(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í)最高的符合類型的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)雅的代碼。

責(zé)任編輯:武曉燕 來(lái)源: 碼農(nóng)參上
相關(guān)推薦

2022-03-21 08:55:53

RocketMQ客戶端過(guò)濾機(jī)制

2023-08-10 08:00:00

2018-01-26 23:23:23

JDBC MySQL數(shù)據(jù)庫(kù)

2021-01-27 18:13:35

日志nginx信息

2017-12-26 15:41:26

2019-04-12 09:24:46

Spring Clou服務(wù)注冊(cè)

2021-08-01 12:34:01

跳水人工智能AI

2017-02-09 17:00:00

iOSSwiftKVC

2022-01-05 17:13:28

監(jiān)控HTTPS網(wǎng)站

2012-12-28 13:47:36

Raspberry PGeek

2021-12-06 08:59:40

RabbitMQ單例寫(xiě)法

2019-03-08 10:08:41

網(wǎng)絡(luò)程序猿代碼

2021-11-29 05:37:24

Windows Def操作系統(tǒng)微軟

2009-04-28 07:48:29

蓋茨打工基金會(huì)

2020-08-14 08:19:25

Shell命令行數(shù)據(jù)

2023-09-07 06:48:38

Intel顯卡AMD

2018-10-22 15:29:50

2022-11-02 07:46:31

GoFrameGcache緩存

2020-12-31 06:12:38

Siri Windows電腦

2023-10-31 12:29:25

模型訓(xùn)練
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩一二三 | 97伦理电影网 | 欧美久久久久久 | 免费激情网站 | 91精品国产91久久久久久吃药 | 国产成人综合一区二区三区 | 欧美日韩在线高清 | 蜜臀网| 日韩久久久久 | 日本超碰 | www.色午夜.com | 色精品视频 | 国产视频第一页 | www.日韩 | 国产91丝袜 | 羞羞的视频免费在线观看 | 亚洲精品9999 | 日本在线中文 | 日韩一区二区在线视频 | 一区二区三区在线免费观看视频 | 激情五月激情综合网 | 在线观看午夜视频 | 99热精品6 | 欧美黄在线观看 | 日韩中文字幕一区二区 | 欧美mv日韩mv国产网站91进入 | 91精品国产综合久久香蕉麻豆 | 羞羞的视频免费看 | 国产精品一区二区三区在线 | 欧美精品久久久久久久久久 | 国产日韩欧美激情 | 亚洲影视在线 | 日韩欧美视频免费在线观看 | 国产高清精品在线 | 欧美 日韩 国产 成人 在线 | 亚洲国产精品精华素 | 男女视频91 | 国产免费一区二区三区网站免费 | 国产午夜精品一区二区三区 | 九九久久久 | 粉嫩粉嫩芽的虎白女18在线视频 |