dagger2 注入_使用Dagger 2在GWT中进行依赖注入
dagger2 注入
依賴注入是一種軟件開發概念,其中為對象提供了創建所需的所有對象或值。 GWT用戶已經熟悉GIN,但已經不推薦使用此工具,因此不再支持它,因此使用GIN的應用程序當前確實需要告別。 Dagger是GWT的新依賴注入框架。 對于那些不熟悉該框架的人,Dagger的目的是為Android提供DI,但現在已用于通用DI。 它也適用于GWT。 在本文中,我們將簡要介紹Dagger,以及如何使用Dagger為GWT項目設置DI。
GWT有什么用?
與使用生成器(將來會在GWT中刪除)的GIN不同,Dagger使用編譯時注釋處理器。 使用Dagger的項目在升級GWT版本時會遇到較少的麻煩。 另一方面,DI通常會引入復雜性,因此很難調試注入過程中發生的錯誤。 GIN堆棧跟蹤有時是不可讀的。 Dagger的目標之一就是減少這一缺點。 Dagger生成的代碼接近于人類編寫的代碼,因此更容易了解幕后發生的事情,因此開發人員在調試時不會有太多麻煩。
在GWT項目中使用Dagger:
Dagger要求在編譯時將javax.inject注釋放在類路徑上。 此外,需要將Dagger模塊添加到.gwt.xml中:
<inherits name="dagger.Dagger"> </inherits>如果使用的是maven,則要在調用編譯目標時自動執行注釋編譯器,則需要使用高于3.5.1的版本。 否則,您將需要在插件配置中同時指定注解處理器和注解處理器路徑。 可選地,可以將dagger-compiler編譯器從依賴項中刪除,并添加到注釋處理器路徑中,如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>值得注意的是,在開發模式下,每次注入的類發生更改時,都必須重新運行注釋處理器。 在maven下,可以使用流程類目標運行注釋處理器。 我尚未測試Gradle,但是使用Gradle的概念也應該相同。
假設我們有一個壓縮圖像的服務。 該服務取決于其他兩個服務:下載圖像的服務和壓縮后上傳圖像的服務。 所有對象都有零個args構造函數。
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);}}如果您需要特殊的設置來構造對象,例如設置一些值或指定構造函數參數,則需要創建一個模塊。 假設我們需要為ImageDownloader對象提供一個超時值:
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);} }然后,我們需要指定一個提供ImageDownloader的模塊:
@Module public class ImageCompressionModule {@Providespublic ImageDownloader getImageDowloader(){return new ImageDownloader(15);}現在,我們定義了模塊和對象,我們將創建DI組件,該組件將用于獲取注入的對象實例。
@Component(modules=ImageCompressionModule.class) public interface AppComponent {ImageCompressor getImageCompressor(); }我們的應用程序組件的實例可以通過以下方式獲取:
AppComponent component = DaggerAppComponent.builder().imageCompressionModule(new ImageCompressionModule()).build();如果使用的是IDE,則會注意到它抱怨DaggerAppComponent。 這很正常,因為DaggerAppComponent僅在運行注釋處理器之后才可用。
最后,我們可以使用我們的對象:
ImageCompressor compressor = component.getImageCompressor();compressor.compress("http://www.g-widgets.com/GWTcon.jpg");結果:
downloading image at http://www.g-widgets.com/GWTcon.jpg compressing image uploading compressed image to http://www.g-widgets.com/GWTcon.jpg結語:
Dagger 2是GWT的下一代依賴注入。 我們已經在這篇文章中看到了框架的基本功能。 可以在Dagger的主要用戶指南中找到更多高級DI功能: https : //google.github.io/dagger/users-guide 。 Dagger的GWT版本與后端版本的工作方式相同:代碼可以在客戶端和服務器端都可以工作,因此,如果在JVM中進行調試有好處,可以將DI移植到后端可能很有用。
完整代碼可在以下網址獲得: https : //github.com/zak905/dagger2-gwt-example
翻譯自: https://www.javacodegeeks.com/2017/07/dependency-injection-gwt-using-dagger-2.html
dagger2 注入
總結
以上是生活随笔為你收集整理的dagger2 注入_使用Dagger 2在GWT中进行依赖注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: map iterator_一个简单的Ma
- 下一篇: 电脑桌面删除的ppt怎么恢复电脑系统pp