使用Dagger 2在GWT中进行依赖注入
依賴(lài)注入是一種軟件開(kāi)發(fā)概念,其中為對(duì)象提供了創(chuàng)建所需的所有對(duì)象或值。 GWT用戶(hù)已經(jīng)熟悉GIN,但已不推薦使用此工具,因此不再支持,因此使用GIN的應(yīng)用程序當(dāng)前確實(shí)需要告別。 Dagger是GWT的新依賴(lài)注入框架。 對(duì)于那些不熟悉該框架的人,Dagger的目的是為Android提供DI,但現(xiàn)在已用于通用DI。 它也適用于GWT。 在本文中,我們將簡(jiǎn)要介紹Dagger,以及如何使用Dagger為GWT項(xiàng)目設(shè)置DI。
GWT有什么用?
與使用生成器(將來(lái)會(huì)在GWT中刪除)的GIN不同,Dagger使用編譯時(shí)注釋處理器。 使用Dagger的項(xiàng)目在升級(jí)GWT版本時(shí)會(huì)遇到較少的麻煩。 另一方面,DI通常會(huì)引入復(fù)雜性,因此很難調(diào)試注入過(guò)程中發(fā)生的錯(cuò)誤。 已知GIN堆棧跟蹤有時(shí)是不可讀的。 Dagger的目標(biāo)之一就是減少這一缺點(diǎn)。 Dagger生成的代碼接近于人類(lèi)編寫(xiě)的代碼,因此更容易了解幕后發(fā)生的事情,因此開(kāi)發(fā)人員在調(diào)試時(shí)將不會(huì)有太多麻煩。
在GWT項(xiàng)目中使用Dagger:
Dagger要求在編譯時(shí)將javax.inject批注放在類(lèi)路徑上。 此外,需要將Dagger模塊添加到.gwt.xml中:
<inherits name="dagger.Dagger"> </inherits>如果使用的是maven,則要在調(diào)用編譯目標(biāo)時(shí)自動(dòng)執(zhí)行注釋編譯器,則需要使用高于3.5.1的版本。 否則,您將需要在插件配置中同時(shí)指定注釋處理器和注釋處理器路徑。 可選地,可以將dagger-compiler編譯器從依賴(lài)項(xiàng)中刪除,并添加到注釋處理器路徑中,如Thomas Broyer在SO中所指定的:
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.5.1</version><configuration><source>1.7</source><target>1.7</target><annotationProcessorPaths><path><groupId>com.google.dagger</groupId><artifactId>dagger-compiler</artifactId><version>${dagger.gwt.version}</version></path></annotationProcessorPaths></configuration> </plugin>值得注意的是,在開(kāi)發(fā)模式下,每次注入的類(lèi)發(fā)生更改時(shí),都需要重新運(yùn)行注釋處理器。 在maven下,可以使用流程類(lèi)目標(biāo)運(yùn)行注釋處理器。 我尚未測(cè)試Gradle,但是使用Gradle的概念也應(yīng)該相同。
假設(shè)我們有一個(gè)壓縮圖像的服務(wù)。 該服務(wù)依賴(lài)于其他兩個(gè)服務(wù):下載圖像的服務(wù)和壓縮后上載圖像的服務(wù)。 所有對(duì)象都有零個(gè)args構(gòu)造函數(shù)。
public class ImageCompressor {@Inject public ImageDownloader downloader;@Inject public ImageUploader uploader;@Injectpublic ImageCompressor(){ }public void compress(String url) {downloader.download(url);GWT.log("compressing image");uploader.upload(url);}}public class ImageDownloader {@Injectpublic ImageDownloader() {}public void download(String url) {GWT.log("downloading image at " + url);}}public class ImageUploader {@Injectpublic ImageUploader() {}public void upload(String url) {GWT.log("uploading compresesed image at " + url);}}如果您需要特殊的設(shè)置來(lái)構(gòu)造對(duì)象,例如設(shè)置一些值或指定構(gòu)造函數(shù)參數(shù),則需要?jiǎng)?chuàng)建一個(gè)模塊。 假設(shè)我們需要為ImageDownloader對(duì)象提供一個(gè)超時(shí)值:
public class ImageDownloader {int timeout;//@Inject we cannot use inject on the constructor anymorepublic ImageDownloader(int timeout) {this.timeout = timeout;}public void download(String url) {GWT.log("downloading image at " + url);} }然后,我們需要指定一個(gè)提供ImageDownloader的模塊:
@Module public class ImageCompressionModule {@Providespublic ImageDownloader getImageDowloader(){return new ImageDownloader(15);}現(xiàn)在,我們定義了模塊和對(duì)象,我們將創(chuàng)建DI組件,該組件將用于獲取注入的對(duì)象實(shí)例。
@Component(modules=ImageCompressionModule.class) public interface AppComponent {ImageCompressor getImageCompressor(); }我們的應(yīng)用程序組件的實(shí)例可以通過(guò)以下方式獲取:
AppComponent component = DaggerAppComponent.builder().imageCompressionModule(new ImageCompressionModule()).build();如果您使用的是IDE,則您會(huì)注意到它抱怨DaggerAppComponent。 這很正常,因?yàn)镈aggerAppComponent僅在運(yùn)行注釋處理器之后才可用。
最后,我們可以使用我們的對(duì)象:
ImageCompressor compressor = component.getImageCompressor();compressor.compress("http://www.g-widgets.com/GWTcon.jpg");結(jié)果:
downloading image at http://www.g-widgets.com/GWTcon.jpg compressing image uploading compressed image to http://www.g-widgets.com/GWTcon.jpg包起來(lái):
Dagger 2是GWT的下一代依賴(lài)注入。 在本文中,我們已經(jīng)看到了框架的基本功能。 可以在Dagger的主要用戶(hù)指南中找到更多高級(jí)DI功能: https : //google.github.io/dagger/users-guide 。 Dagger的GWT版本與后端版本的工作方式相同:該代碼可在客戶(hù)端和服務(wù)器端均可使用,因此,如果存在從JVM調(diào)試中受益的問(wèn)題,將DI移植到后端可能很有用。
完整代碼可在以下網(wǎng)址獲得: https : //github.com/zak905/dagger2-gwt-example
翻譯自: https://www.javacodegeeks.com/2017/07/dependency-injection-gwt-using-dagger-2.html
總結(jié)
以上是生活随笔為你收集整理的使用Dagger 2在GWT中进行依赖注入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 邮票用英语怎么说 邮票用英语是什么
- 下一篇: 毛玠怎么读 毛玠的读音