南通seo网站推广费用,芜湖建设网站公司,常州网上挂号预约平台,wordpress用户中心界面dagger2 注入依赖注入是一种软件开发概念#xff0c;其中为对象提供了创建所需的所有对象或值。 GWT用户已经熟悉GIN#xff0c;但已经不推荐使用此工具#xff0c;因此不再支持它#xff0c;因此使用GIN的应用程序当前确实需要告别。 Dagger是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 依存关系 dependencygroupIdjavax.inject/groupIdartifactIdjavax.inject/artifactIdversion1/versionscopeprovided/scope/dependencydependencygroupIdcom.google.dagger/groupIdartifactIddagger-gwt/artifactIdversion2.5/versionscopeprovided/scope/dependencydependencygroupIdcom.google.dagger/groupIdartifactIddagger-compiler/artifactIdversion2.5/versionscopeprovided/scope/dependency Dagger要求在编译时将javax.inject注释放在类路径上。 此外需要将Dagger模块添加到.gwt.xml中 inherits namedagger.Dagger
/inherits 注释处理器 如果使用的是maven则要在调用编译目标时自动执行注释编译器则需要使用高于3.5.1的版本。 否则您将需要在插件配置中同时指定注解处理器和注解处理器路径。 可选地可以将dagger-compiler编译器从依赖项中删除并添加到注释处理器路径中如Thomas Broyer在SO中所指定的 plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.5.1/versionconfigurationsource1.7/sourcetarget1.7/targetannotationProcessorPathspathgroupIdcom.google.dagger/groupIdartifactIddagger-compiler/artifactIdversion${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(modulesImageCompressionModule.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.htmldagger2 注入