javascript
spring 构造函数注入_Spring依赖注入–字段vs设置器vs构造函数注入
spring 構(gòu)造函數(shù)注入
歡迎使用Spring Dependency Injection –字段,設(shè)置器,構(gòu)造函數(shù)注入教程。 了解場(chǎng)注入 , 二傳手注入和構(gòu)造函數(shù)注入之間的區(qū)別。 借助代碼示例,我們將看到使用每個(gè)示例的好處以及為什么選擇一個(gè)而不是另一個(gè)。
有關(guān)Spring依賴(lài)注入的更多信息:
- Spring Setter依賴(lài)注入示例
- Spring構(gòu)造函數(shù)依賴(lài)注入示例
- Spring字段依賴(lài)注入示例
- Spring依賴(lài)注入和控制反轉(zhuǎn)
總覽
在Spring框架中,依賴(lài)注入分為三種類(lèi)型。 它們是場(chǎng)注入 , setter注入和構(gòu)造器注入 。 您可以絕對(duì)使用它們中的任何一個(gè),它們的結(jié)果完全相同。 但是,基于易用性,可讀性,編碼標(biāo)準(zhǔn)或更好的編碼實(shí)踐,幾乎沒(méi)有差異。 在我們Swift了解這些差異之前,我們將了解所有三種類(lèi)型的依賴(lài)注入 。
基于字段的依賴(lài)注入
@Component public class MyClass { @Autowired private DogsController controller; @Autowired private DogsService service; @Autowired private DogsDao dao; @Autowired private ApplicationProperties properties; //... // Business methods // }基于Setter的依賴(lài)注入
@Component public class MyClass { private DogsController controller; private DogsService service; private DogsDao dao; private ApplicationProperties properties; @Autowired public void setController(DogsController controller) { this .controller = controller; } @Autowired public void setService(DogsService service) { this .service = service; } @Autowired public void setDao(DogsDao dao) { this .dao = dao; } @Autowired public void setProperties(ApplicationProperties properties) { this .properties = properties; } //... // Business methods // }基于構(gòu)造函數(shù)的依賴(lài)注入
@Component public class MyClass { private DogsController controller; private DogsService service; private DogsDao dao; private ApplicationProperties properties; @Autowired public MyClass(DogsController controller, DogsService service, DogsDao dao, ApplicationProperties properties) { this .controller = controller; this .service = service; this .dao = dao; this .properties = properties; } //... // Business methods // }我們?yōu)樗腥N類(lèi)型的依賴(lài)項(xiàng)注入提供了代碼參考。 讓我們?cè)诿嫦驅(qū)ο笤O(shè)計(jì)原則的一些重要方面進(jìn)行評(píng)估。
可讀性
可讀性是人類(lèi)對(duì)一個(gè)軟件程序或一個(gè)軟件程序的理解程度的判斷。 開(kāi)發(fā)人員花費(fèi)30%的時(shí)間編寫(xiě)軟件,并花費(fèi)70%的時(shí)間維護(hù)軟件。 可讀性提高了軟件的可維護(hù)性。 當(dāng)開(kāi)發(fā)人員查看課程時(shí),他/她應(yīng)該能夠Swift專(zhuān)注于課程的重要部分,而不會(huì)被樣板代碼或其他框架組件所分散。
讓我們對(duì)所有三個(gè)應(yīng)用可讀性度量
- 場(chǎng)注入 :最好的。 更少的樣板代碼。 重點(diǎn)是業(yè)務(wù)邏輯。
- 構(gòu)造函數(shù)注入 :更好。 構(gòu)造函數(shù)在視覺(jué)上與方法分開(kāi)。
- 二傳手注射:最糟糕。 添加了4個(gè)實(shí)例方法。 從業(yè)務(wù)方法中刪除焦點(diǎn)。
用軟件編程的術(shù)語(yǔ)來(lái)說(shuō),如果以任何方式無(wú)法在創(chuàng)建后修改其狀態(tài),則將該對(duì)象稱(chēng)為不可變 。 不變性是良好的面向?qū)ο缶幊痰闹匾瓌t。 不變性為類(lèi)帶來(lái)了線程安全性,狀態(tài)安全性和可讀性。
如果我們從不變性的角度來(lái)看上面的例子。
- 構(gòu)造函數(shù)注入 :支持不變性。
- Setter注入 :無(wú)固定性。
- 場(chǎng)注入 :無(wú)固定性。
國(guó)家安全
對(duì)象很可能由使用者或基礎(chǔ)框架實(shí)例化。 對(duì)象本身應(yīng)為實(shí)例化器提供規(guī)則或準(zhǔn)則,以便他們將以正確的狀態(tài)調(diào)用對(duì)象。 如果對(duì)象沒(méi)有規(guī)定這種狀態(tài)安全性,則有可能將對(duì)象實(shí)例化為不完整或不正確的狀態(tài)。
注意 :以上所有示例都是狀態(tài)安全的,因?yàn)镾pring正在解析它們的依賴(lài)項(xiàng),并且Spring會(huì)正確初始化所有字段,這些字段是@Autowired一部分。 但是某些使用者可能會(huì)使用new關(guān)鍵字實(shí)例化您的對(duì)象。 我們應(yīng)該研究Spring框架之外的狀態(tài)安全性。
讓我們將State Safety措施應(yīng)用于我們看到的所有示例。
- 構(gòu)造函數(shù)注入 :狀態(tài)安全。 該對(duì)象被實(shí)例化為完整狀態(tài)或完全不被實(shí)例化。
- setter注入 :消費(fèi)者使用無(wú)參數(shù)構(gòu)造函數(shù)。 而且可能會(huì)錯(cuò)過(guò)調(diào)用設(shè)置器之一或兩次以不同的值調(diào)用同一設(shè)置器(復(fù)制粘貼錯(cuò)誤)
- 字段注入 :使用者使用無(wú)參數(shù)構(gòu)造函數(shù)。 沒(méi)有有效的方法來(lái)設(shè)置對(duì)象的狀態(tài)。 唯一的選擇是使用反射設(shè)置私有字段。
實(shí)例字段太多
讓我們考慮具有6、7或更多字段的對(duì)象的情況。 當(dāng)您將上述示例用于大量字段時(shí),會(huì)發(fā)生什么情況。
場(chǎng)注入 :看起來(lái)仍然更好,而且可讀性強(qiáng)。 依賴(lài)項(xiàng)部分隔離在一個(gè)地方。
@Component public class MyClass { @Autowired private Service1 service1; @Autowired private Service2 service2; @Autowired private Service3 service3; @Autowired private Service4 service4; @Autowired private Service5 service5; @Autowired private Service6 service6; @Autowired private Service7 service7; @Autowired private Service8 service7; ????//... // Business methods // }構(gòu)造函數(shù)注入 :丑陋! 構(gòu)造函數(shù)注入確實(shí)看起來(lái)很丑。 對(duì)于消費(fèi)者來(lái)說(shuō)也不容易使用。
@Component public class MyClass { private Service1 service1; private Service2 service2; private Service3 service3; private Service4 service4; private Service5 service5; private Service6 service6; private Service7 service7; private Service8 service7; @Autowired public MyClass(Service1 service1, Service2 service2, Service3 service3, Service4 service4, Service5 service5, Service6 service6, Service7 service7, Service8 service71) { this .service1 = service1; this .service2 = service2; this .service3 = service3; this .service4 = service4; this .service5 = service5; this .service6 = service6; this .service7 = service7; this .service7 = service71; } //... // Business methods // }二傳手注射 :不好。 它添加了8個(gè)額外的實(shí)例方法,僅用于設(shè)置依賴(lài)項(xiàng)。
@Component public class MyClass { private Service1 service1; private Service2 service2; private Service3 service3; private Service4 service4; private Service5 service5; private Service6 service6; private Service7 service7; private Service8 service7; @Autowired public void setService1(Service1 service1) { this .service1 = service1; } @Autowired public void setService2(Service2 service2) { this .service2 = service2; } @Autowired public void setService3(Service3 service3) { this .service3 = service3; } @Autowired public void setService4(Service4 service4) { this .service4 = service4; } @Autowired public void setService5(Service5 service5) { this .service5 = service5; } @Autowired public void setService6(Service6 service6) { this .service6 = service6; } @Autowired public void setService7(Service7 service7) { this .service7 = service7; } @Autowired public void setService7(Service8 service7) { this .service7 = service7; } //... // Business methods // }我們是否應(yīng)該考慮“實(shí)例字段太多”?
通過(guò)“ 實(shí)例字段太多”檢查 ,我們發(fā)現(xiàn)字段注入是最好的。 真正的問(wèn)題是,我們是否應(yīng)該重視太多領(lǐng)域的問(wèn)題?
答案是不。
我們所有人都喜歡并遵循單一責(zé)任原則 。 如果您的班級(jí)依賴(lài)太多東西,則說(shuō)明設(shè)計(jì)不正確。 采用更好的設(shè)計(jì),您將不會(huì)看到這些問(wèn)題。 我們不應(yīng)該支持不良的設(shè)計(jì)案例。 因此,我們將不重視“實(shí)例字段太多”的情況。
在特殊的情況下,不可避免的是有太多的字段,而丑陋的構(gòu)造函數(shù)是一個(gè)大問(wèn)題,您應(yīng)該致電并進(jìn)行Field Injection 。
結(jié)論
根據(jù)上面的代碼示例和事實(shí),很明顯, 基于構(gòu)造的依賴(lài)注入在所有情況下始終表現(xiàn)得更好。 即使我們從Spring Dependency Injection的角度來(lái)看我們的課程,構(gòu)造函數(shù)注入仍然是最佳選擇。
注意:所有設(shè)計(jì)原則或更好的編碼標(biāo)準(zhǔn)以及我們?cè)诖颂幱懻摰膬?nèi)容都只是準(zhǔn)則,而不是規(guī)則。 您只是足夠聰明,可以接聽(tīng)電話(huà)并證明您要走的路。
快樂(lè)編碼!
翻譯自: https://www.javacodegeeks.com/2019/02/field-setter-constructor-injection.html
spring 構(gòu)造函數(shù)注入
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的spring 构造函数注入_Spring依赖注入–字段vs设置器vs构造函数注入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 扩展方法 枚举值_扩展枚举功能的两种方法
- 下一篇: 怎么减肥效果最好