日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
沒想到吧,Spring中還有一招集合注入的寫法

哈嘍大家好啊,我是Hydra。

十年的環(huán)翠網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。營銷型網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整環(huán)翠建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“環(huán)翠網(wǎng)站設(shè)計”,“環(huán)翠網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

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 userDaoMap;

public Map getDaos(){
return userDaoMap;
}
}

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

可以看到,Map中的value是實現(xiàn)了接口的實例對象,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 userDaoLists;

public List getDaos(){
return userDaoLists;
}
}

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

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

很簡單,修改注入到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 userDaoSet;

public Set 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 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 userDaoLists;

public String choiceFirst(){
return userDaoLists.get(0).getName();
};
}

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


文章題目:沒想到吧,Spring中還有一招集合注入的寫法
轉(zhuǎn)載來源:http://www.dlmjj.cn/article/cceiepd.html