我如何向團隊解釋依賴注入

最近,我們公司開始開發基于Java的新Web應用程序,經過一些評估過程,我們決定使用Spring。
但是許多團隊成員并不了解Spring和Dependency Injection的原理。 因此,我被要求給出一個速成班,介紹什么是Spring上的依賴注入和基礎知識。

我沒有講所有有關IOC / DI的理論,而是想舉例說明。

要求:我們將獲得一些客戶地址,并且需要驗證該地址。
經過一番評估,我們考慮使用Google地址驗證服務。

傳統(不良)方法:

只需創建一個AddressVerificationService類并實現邏輯即可。

假設GoogleAddressVerificationService是Google提供的一項服務,該服務將Address作為字符串并返回經度/緯度。

class AddressVerificationService 
{public String validateAddress(String address){GoogleAddressVerificationService gavs = new GoogleAddressVerificationService();String result = gavs.validateAddress(address);  return result;}
}

這種方法的問題:

1.如果要更改地址驗證服務提供商,則需要更改邏輯。
2.您不能使用某些虛擬AddressVerificationService進行單元測試(使用模擬對象)

由于某些原因,客戶要求我們支持多個AddressVerificationService Providers,因此我們需要確定在運行時使用哪種服務。

為了適應這一點,您可能會想到更改以下類:

class AddressVerificationService
{
//This method validates the given address and return longitude/latitude details.public String validateAddress(String address){String result = null;int serviceCode = 2; // read this code value from a config fileif(serviceCode == 1){GoogleAddressVerificationService googleAVS = new GoogleAddressVerificationService();result = googleAVS.validateAddress(address);} else if(serviceCode == 2){YahooAddressVerificationService yahooAVS = new YahooAddressVerificationService();result = yahooAVS.validateAddress(address);}return result;}
}

這種方法的問題:
?
1.每當您需要支持新的服務提供商時,都需要使用if-else-if添加/更改邏輯。 2.您不能使用某些虛擬AddressVerificationService進行單元測試(使用模擬對象)

IOC / DI方法:

在上述方法中,AddressVerificationService負責控制其依賴項的創建。
因此,只要其依賴項發生更改,AddressVerificationService就會更改。

現在,讓我們使用IOC / DI模式重寫AddressVerificationService。

class AddressVerificationService{private AddressVerificationServiceProvider serviceProvider;public AddressVerificationService(AddressVerificationServiceProvider serviceProvider) {this.serviceProvider = serviceProvider;}public String validateAddress(String address){return this.serviceProvider.validateAddress(address);}}interface AddressVerificationServiceProvider{public String validateAddress(String address);}

在這里,我們注入了AddressVerificationService依賴項AddressVerificationServiceProvider。

現在,讓我們使用多個提供程序服務來實現AddressVerificationServiceProvider。

class YahooAVS implements AddressVerificationServiceProvider{@Overridepublic String validateAddress(String address) {System.out.println("Verifying address using YAHOO AddressVerificationService");return yahooAVSAPI.validate(address);}  }class GoogleAVS implements AddressVerificationServiceProvider{@Overridepublic String validateAddress(String address) {System.out.println("Verifying address using Google AddressVerificationService");return googleAVSAPI.validate(address);}}

現在,客戶可以選擇使用哪個服務提供商的服務,如下所示:

AddressVerificationService verificationService = null;AddressVerificationServiceProvider provider = null;provider = new YahooAVS();//to use YAHOO AVSprovider = new GoogleAVS();//to use Google AVSverificationService = new AddressVerificationService(provider);String lnl = verificationService.validateAddress("HitechCity, Hyderabad");System.out.println(lnl);

對于單元測試,我們可以實現一個Mock AddressVerificationServiceProvider。

class MockAVS implements AddressVerificationServiceProvider{@Overridepublic String validateAddress(String address) {System.out.println("Verifying address using MOCK AddressVerificationService");return "<response><longitude>123</longitude><latitude>4567</latitude>";}}AddressVerificationServiceProvider provider = null;provider = new MockAVS();//to use MOCK AVS  AddressVerificationServiceIOC verificationService = new AddressVerificationServiceIOC(provider);String lnl = verificationService.validateAddress("Somajiguda, Hyderabad");System.out.println(lnl);

通過這種方法,我們可以解決上述基于非IOC / DI的方法的問題。
1.我們可以根據需要提供盡可能多的商品。 只需實現AddressVerificationServiceProvider并將其注入即可。 2.我們可以使用模擬實現使用虛擬數據進行單元測試。

因此,通過遵循“依賴注入”原理,我們可以創建基于接口的松散耦合且易于測試的服務。

參考: 我是如何通過JCG合作伙伴 Siva Reddy在“ 我的技術實驗”博客上 向我的團隊解釋依賴注入的 。


翻譯自: https://www.javacodegeeks.com/2012/06/how-i-explained-dependency-injection-to.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372608.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372608.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372608.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

可以添加自定義的Select控件

1.控件dom <select name"WebSiteTarget" id"WebSiteTarget" class"w1" onchange"editable2(this);"><option value"-1">請選擇城市</option><option>福州</option><option>廈門</op…

innodb_io_capacity =innodb_lru_scan_depth*inoodb_buffer_pool_instances。與 checkpoint

innodb_lru_scan_depth:每個緩沖池刷臟頁的能力 innodb_io_capacity: iops inoodb_buffer_pool_instances8 :緩沖池的個數 .關系&#xff1a; innodb_io_capacity > innodb_lru_scan_depth * inoodb_buffer_pool_instances 轉載于:https://www.cnblogs.com/zengkefu/…

Java中的責任鏈模式

當應有幾個處理器來執行某項操作并為這些處理器定義特定順序時&#xff0c;就需要采用責任鏈設計模式。 在運行時處理器順序的可變性也很重要。模式的UML表示如下&#xff1a; 處理程序定義處理器對象的一般結構。 這里的“ HandleRequest”是抽象處理器方法。 處理程序還具有自…

php的excel源碼下載,PHPExcel-5 - 源碼下載|Windows編程|其他小程序|源代碼 - 源碼中國...

文件名大小更新時間PHPExcel02019-05-11PHPExcel\.gitattributes702019-01-02PHPExcel\.gitignore1082019-01-02PHPExcel\.travis.yml5122019-01-02PHPExcel\16329.xlsx510662019-05-11PHPExcel\19093.xlsx511932019-05-11PHPExcel\43877.xlsx530952019-05-11PHPExcel\62045.xl…

使用Visual Studio Code開發Asp.Net Core WebApi學習筆記(六)-- 依賴注入

本篇將介紹Asp.Net Core中一個非常重要的特性&#xff1a;依賴注入&#xff0c;并展示其簡單用法。 第一部分、概念介紹 Dependency Injection&#xff1a;又稱依賴注入&#xff0c;簡稱DI。在以前的開發方式中&#xff0c;層與層之間、類與類之間都是通過new一個對方的實例進行…

基于JAX-WS的webService開發實例

最近因為工作原因接觸到webService&#xff0c;所以記錄下開發中碰到的問題&#xff0c;方便自己以后復習&#xff0c;順便發揚一下開源精神。剛剛接觸webServie如果有什么錯誤歡迎大家指正。 本地環境&#xff1a;myEclipse10.6 tomcat7 JDK7 jaxws-ri-2.2.10 第一步&#xff…

完整的WebApplication JSF EJB JPA JAAS –第2部分

視圖–創建和JSF設置 本教程是第1部分的繼續。 讓我們創建一個新的Dynamic Web Project 。 如下圖所示創建它&#xff1a; 注意&#xff1a;在某些時候&#xff0c;Eclipse會詢問您是否要添加JSF功能&#xff08;自動完成&#xff09;&#xff0c;然后啟用它。 就像下面的屏幕…

lempel ziv matlab,基于Python的LempelZiv算法的熵估計

此函數允許估計時間序列的熵。它基于Lempel-Ziv壓縮算法。對于長度為n的時間序列&#xff0c;熵估計為&#xff1a;E(1/n和L_i)^-1 ln(n)式中&#xff0c;L逯i是從位置i開始的最短子串的長度&#xff0c;該子串之前沒有從位置1出現到i-1。當n接近無窮大時&#xff0c;估計的熵收…

Android使用繪圖Path總結

Path作為Android中一種相對復雜的繪圖方式&#xff0c;官方文檔中的有些解釋并不是很好理解&#xff0c;這里作一個相對全面一些的總結&#xff0c;供日后查看&#xff0c;也分享給大家&#xff0c;共同進步。 1.基本繪圖方法 addArc(RectF oval, float startAngle, float swee…

2017.3.23下午

下午通過對OSPF基本原理進一步的學習&#xff0c;對上午學習的內容進行了復習。 轉載于:https://www.cnblogs.com/bgd140206206/p/6606192.html

編寫Eclipse插件教程–第1部分

Eclipse是三個最受歡迎的Java開發IDE之一。 其成功的原因之一是其可擴展性。 對于任何知道該怎么做并且已經做到的人來說&#xff0c;編寫eclipse插件都可以非常輕松快捷。 不幸的是&#xff0c;第一次在Eclipse中進行操作可能會非常耗時且令人沮喪。 Eclipse框架非常龐大&…

簡單Window下 Android Studio的安裝

&#xff08;1&#xff09;首先安裝JDK 下載JDK 本人覺得官方網站下JDK比較慢&#xff0c;可以直接百度JDK&#xff0c;&#xff08;如果是64位 百度搜索記得64位&#xff09; 類似于這樣的下載 安裝可以看下教程&#xff0c;包括環境變量的配置 如何安裝JDK &#xff08;2&…

日期處理一之NSLalendar的使用

一、日期和時間模式 日期和時間格式由日期和時間模式字符串組成&#xff0c;在日期和時間模式字符串中未加引號的A到‘Z’和a到‘z’被解釋為模式字母&#xff0c;用來表示日期或時間。字符串元素&#xff0c;文本可以使用單引號&#xff08;‘’&#xff09;引起來使用。定義以…

java的使用Pair要導入什么包,第三方jar包的使用

被導入的外部類所在源文件通常要打包成jar包&#xff0c;java中的jar文件裝的是 .class 文件。它是一種壓縮格式和zip兼容&#xff0c;被稱為jar包。JDK提供的許多類&#xff0c;也是以jar包的形式提供的。在用的時候呢&#xff0c;你的文件里有很多個類&#xff0c;把這些類和…

十大最受歡迎的新Eclipse插件

Eclipse Marketplace仍然是發現有趣且相關的Eclipse插件的地方。 通過Eclipse Marketplace客戶端&#xff0c;每月成功安裝100,000多個基于Eclipse的產品。 我們提供了過去30天 以來所有時間最受歡迎的插件列表。 我認為看看過去12個月中最受歡迎的新插件會很有趣。 以下列出了…

在桌面顯示我電腦

打開Windows PowerShell&#xff08;一個像是命令提示符的東西[藍底白字]&#xff0c;但不是命令提示符&#xff09;&#xff0c;在Windows PowerShell內輸入cmd回車&#xff0c;當返回如下信息&#xff1a; Microsoft Windows [版本 6.2.9200](c) 2012 Microsoft Corporation。…

《Java技術》第二次作業計科1501趙健宇

&#xff08;一&#xff09;學習總結 1.使用Eclipse關聯jdk源代碼,查看String類的equals&#xff08;&#xff09;方法 equals&#xff08;&#xff09;方法截圖 “”比較的是地址。equals方法他同樣使用號進行內存地址的比較。但是equals方法重寫如果號比較不相等&#xff0c;…

注射php,UPDATE注射(mysqlphp)的兩個模式

一.測試環境&#xff1a;OS:Windowsxpsp2php:php4.3.10(mysql4.1.9apache1.3.33二.測試數據庫結構&#xff1a;-----start-----數據庫:test----------------------------------------------------------------表的結構userinfo--CREATETABLEuserinfo(groudidvarchar(12)NOTNULL…

JUnit的內置Hamcrest Core Matcher支持

在用JUnit和Hamcrest改進assertEquals的文章中&#xff0c;我簡要討論了Hamcrest “ 核心 ”匹配器與JUnit的現代版本“結合”在一起的情況。 在那篇文章中&#xff0c;我特別關注了JUnit的assertThat&#xff08;T&#xff0c;Matcher&#xff09;靜態方法與Hamcrest核心is()匹…

FormsAuthentication使用指南,實現登錄

一般情況下&#xff0c;在我們做訪問權限管理的時候&#xff0c;會把用戶的正確登錄后的基本信息保存在Session中&#xff0c;以后用戶每次請求頁面或接口數據的時候&#xff0c;拿到Session中存儲的用戶基本信息&#xff0c;查看比較他有沒有登錄和能否訪問當前頁面。Session的…