国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

Spring 依賴注入最佳實(shí)踐

2020-11-17 13:39 作者:信碼由韁  | 我要投稿

【注】本文譯自:https://springframework.guru/best-practices-for-dependency-injection-with-spring/

? ? 在本文中,我將向你展示如何在 Spring Framework 的依賴項(xiàng)注入中使用 Project Lombok 以獲得最佳實(shí)踐。

? ??Spring 框架本身具有多種執(zhí)行依賴項(xiàng)注入的方式。選項(xiàng)的靈活性是 Spring 框架的優(yōu)勢。但是,并非所有的依賴項(xiàng)注入選項(xiàng)都被視為最佳實(shí)踐。有些實(shí)際上不太好。

依賴注入示例

? ??我提供了一些設(shè)置示例,供我們查看必須使用的各種依賴項(xiàng)注入選項(xiàng)。

? ??讓我們以 Spring Service 為例。就我們的目的而言,該服務(wù)具有一種返回字符串的方法。我們將使用“service”,并使用 Spring將其注入一些模擬控制器中。請記住,我們只是在探索如何使用 Spring Framework 進(jìn)行依賴項(xiàng)注入。

示例 Service

@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í)踐,不推薦這樣做。

? ??我們可以對此進(jìn)行一些改進(jìn),將該字段的訪問權(quán)限設(shè)為私有。Spring Framework 確實(shí)允許你自動(dòng)裝配私有字段。你確實(shí)看到有人這樣做。Spring 將執(zhí)行一些反射魔術(shù)來執(zhí)行依賴項(xiàng)注入。

私有 Field Controller

@Controller

public?class?PrivateFieldController?{

????@Autowired

????private?MyService?myService;

????public?String?saySomething(){

????????return?myService.getHello();

????}

}


? ? 盡管只使用私有字段比較好,但是測試卻成了一個(gè)令人頭痛。你要么需要啟動(dòng) Spring Context,要么使用一些 Spring 實(shí)用程序來執(zhí)行依賴注入以進(jìn)行測試。不是世界末日,但總的來說很煩人。

? ??我們可以通過為私有屬性提供 setter 來改善這一點(diǎn)。Getter 和 Setter 通常被認(rèn)為是面向?qū)ο缶幊讨械淖罴褜?shí)踐。通過注解 setter 方法,指示 Spring 使用 setter 進(jìn)行依賴項(xiàng)注入很簡單。

方法注入

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í)例化注入的屬性后對其進(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í)踐的秘訣在于:

  • 聲明一個(gè) final 屬性接口

  • 為類添加 Project Lomboc 注解 @RequiredArgsConstructor


? ? 現(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ù)。絕對是節(jié)省時(shí)間。并導(dǎo)致更干凈的代碼。未使用的屬性和未使用的構(gòu)造函數(shù)參數(shù)已一去不復(fù)返了。重構(gòu)現(xiàn)在不那么痛苦了!

? ? 本文的源代碼可在 GitHub(https://github.com/spring-framework-guru/sfg-blog-posts/tree/master/di-best-practices)?上找到。

Spring 依賴注入最佳實(shí)踐的評論 (共 條)

分享到微博請遵守國家法律
韶关市| 星座| 拜城县| 南溪县| 襄汾县| 台山市| 道真| 馆陶县| 合作市| 吉林省| 宁南县| 天津市| 西峡县| 尼勒克县| 新化县| 马边| 抚顺县| 建宁县| 周口市| 天全县| 丹巴县| 额敏县| 收藏| 英山县| 出国| 得荣县| 信丰县| 钟祥市| 朔州市| 县级市| 新沂市| 固镇县| 上蔡县| 宜良县| 双江| 合川市| 特克斯县| 平舆县| 财经| 靖江市| 城步|