您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)使用Spring 如何實(shí)現(xiàn)注入依賴,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
示例 Service
public class MyService { public String getHello(){ return "Hello"; } }
我們的 Field 擁有一項(xiàng)公有屬性的服務(wù)。我們可以注解該字段,Spring 將注入該服務(wù)的實(shí)例。
屬性注入
Field Controller
@Controller public class FieldController { @Autowired MyService myService; public String saySomething(){ return myService.getHello(); } }
這只是一個(gè)公有屬性,沒有 setter。顯然,這不是一個(gè)好的實(shí)踐,不推薦這樣做。
我們可以對(duì)此進(jìn)行一些改進(jìn),將該字段的訪問權(quán)限設(shè)為私有。Spring Framework 確實(shí)允許你自動(dòng)裝配私有字段。你確實(shí)看到有人這樣做。Spring 將執(zhí)行一些反射魔術(shù)來執(zhí)行依賴項(xiàng)注入
私有 Field Controller
public class PrivateFieldController { @Autowired private MyService myService; public String saySomething(){ return myService.getHello(); } }
盡管只使用私有字段比較好,但是測(cè)試卻成了一個(gè)令人頭痛。你要么需要啟動(dòng) Spring Context,要么使用一些 Spring 實(shí)用程序來執(zhí)行依賴注入以進(jìn)行測(cè)試。不是世界末日,但總的來說很煩人。
我們可以通過為私有屬性提供 setter 來改善這一點(diǎn)。Getter 和 Setter 通常被認(rèn)為是面向?qū)ο缶幊讨械淖罴褜?shí)踐。通過注解 setter 方法,指示 Spring 使用 setter 進(jìn)行依賴項(xiàng)注入很簡(jiǎn)單。
方法注入
Setter Controller
@Controller public class SetterController { private MyService myService; @Autowired public void setMyService(MyService myService) { this.myService = myService; } public String saySomething(){ return myService.getHello(); } }
這是使用私有字段時(shí)的明顯改進(jìn)。有人會(huì)抱怨這要寫太多代碼。但是實(shí)際上,自 South Park 的第一季以來,此類任務(wù)已在現(xiàn)代 IDE 中實(shí)現(xiàn)了自動(dòng)化。
構(gòu)造函數(shù)注入
下一個(gè)選項(xiàng)是使用構(gòu)造函數(shù)。到目前為止,這是我們研究過的最佳方法。 使用構(gòu)造函數(shù)設(shè)置注入的屬性時(shí),不必提供自動(dòng)裝配注釋。這是一個(gè)很好的功能,可以節(jié)省一些鍵入時(shí)間。從 Spring Framework 版本4.2開始,用于依賴項(xiàng)注入的構(gòu)造函數(shù)的注釋是可選的。
Constructor Controller
@Controller public class ConstructorController { private MyService myService; public ConstructorController(MyService myService) { this.myService = myService; } public String saySomething(){ return myService.getHello(); } }
基于構(gòu)造函數(shù)的依賴注入無疑被認(rèn)為是最佳實(shí)踐。曾經(jīng)有一段時(shí)間我個(gè)人偏愛基于 setter 的注入,但是后來又轉(zhuǎn)向基于構(gòu)造函數(shù)的注入。
我們?nèi)匀豢梢愿纳莆覀兊氖纠,F(xiàn)在有兩個(gè)主要問題。 第一,我們的服務(wù)類型是具體類型。硬類型的依賴注入不是最佳實(shí)踐。
第二個(gè)問題是,我們要注入的屬性未聲明為final。因此,從理論上講,該類可以在實(shí)例化注入的屬性后對(duì)其進(jìn)行修改。依# 賴注入最佳實(shí)踐
依賴項(xiàng)注入的最佳實(shí)踐是利用接口,構(gòu)造函數(shù)和 final 屬性。
我已經(jīng)設(shè)置了“最佳實(shí)踐”服務(wù)接口,并提供了服務(wù)實(shí)現(xiàn)---使用了 Spring Service 注解。
最佳實(shí)踐服務(wù)接口
public interface BpService { String getHello(); }
最佳實(shí)踐服務(wù)實(shí)現(xiàn)
@Service public class BpServiceImpl implements BpService { @Override public String getHello() { return "The Best Hello!"; } }
使用 Project Lombok
現(xiàn)在,使用 Project Lombok 進(jìn)行依賴注入的最佳實(shí)踐的秘訣在于:
現(xiàn)在,Project Lombok 將為聲明為 final 的所有屬性生成一個(gè)構(gòu)造函數(shù)。Spring 會(huì)自動(dòng)使用 Lombok 提供的構(gòu)造函數(shù)來自動(dòng)裝配該片段。
Lombok Controller
@RequiredArgsConstructor @Controller public class BpFinalConstructorController { private final BpService bpService; public String saySomething(){ return bpService.getHello(); } }
這是執(zhí)行此操作的真正好方法。您的代碼保持非常干凈。使用 Spring時(shí),通常需要多個(gè)自動(dòng)裝配屬性。
當(dāng)您需要添加另一個(gè) bean 時(shí),只需聲明一個(gè) final 屬性。
如果您重構(gòu)并且不再需要 Spring 托管的依賴項(xiàng),則只需刪除 final 屬性。
你不再需要維護(hù)設(shè)置器或構(gòu)造函數(shù)代碼。Project Lombok 減輕了您的日常工作。
我在日常編碼中一直使用這種技術(shù)。絕對(duì)是節(jié)省時(shí)間。并導(dǎo)致更干凈的代碼。未使用的屬性和未使用的構(gòu)造函數(shù)參數(shù)已一去不復(fù)返了。重構(gòu)現(xiàn)在不那么痛苦了!
關(guān)于使用Spring 如何實(shí)現(xiàn)注入依賴就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。