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:

  1. 依存关系

    <dependency><groupId>javax.inject</groupId><artifactId>javax.inject</artifactId><version>1</version><scope>provided</scope></dependency><dependency><groupId>com.google.dagger</groupId><artifactId>dagger-gwt</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>com.google.dagger</groupId><artifactId>dagger-compiler</artifactId><version>2.5</version><scope>provided</scope></dependency>

    Dagger要求在编译时将javax.inject注释放在类路径上。 此外,需要将Dagger模块添加到.gwt.xml中:

    <inherits name="dagger.Dagger">
    </inherits>
  2. 注释处理器

如果使用的是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的概念也应该相同。

  1. 简单的依赖注入

假设我们有一个压缩图像的服务。 该服务取决于其他两个服务:下载图像的服务和压缩后上传图像的服务。 所有对象都有零个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);}}
  1. 定义模块

如果您需要特殊的设置来构造对象,例如设置一些值或指定构造函数参数,则需要创建一个模块。 假设我们需要为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);}
  1. 定义应用程序组件

现在,我们定义了模块和对象,我们将创建DI组件,该组件将用于获取注入的对象实例。

@Component(modules=ImageCompressionModule.class)
public interface AppComponent {ImageCompressor getImageCompressor();
}
  1. 使用注入的对象

我们的应用程序组件的实例可以通过以下方式获取:

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中进行依赖注入相关推荐

  1. 使用Dagger 2在GWT中进行依赖注入

    依赖注入是一种软件开发概念,其中为对象提供了创建所需的所有对象或值. GWT用户已经熟悉GIN,但已不推荐使用此工具,因此不再支持,因此使用GIN的应用程序当前确实需要告别. Dagger是GWT的新 ...

  2. java filter注入_如何使用Filter过滤请求中的SQL注入攻击

    在doFilter方法中编写判断逻辑 public void doFilter(ServletRequest request, ServletResponse response, FilterChai ...

  3. ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理

    ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...

  4. ASP.NET Core - 在ActionFilter中使用依赖注入

    上次ActionFilter引发的一个EF异常,本质上是对Core版本的ActionFilter的知识掌握不够牢固造成的,所以花了点时间仔细阅读了微软的官方文档.发现除了IActionFilter.I ...

  5. dagger2 注入_如何使用Dagger 2在您的应用程序中实现依赖注入

    dagger2 注入 Kriptofolio应用程序系列-第4部分 (Kriptofolio app series - Part 4) Dependency injection will signif ...

  6. phalapi可以依赖注入么_[7.8]-phalapi-进阶篇2(DI依赖注入和单例模式) | PhalApi(π框架) - PHP轻量级开源接口框架...

    phalapi-进阶篇2(DI依赖注入和单例模式) 前言 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 离上一次更新过去了快两周,在其中编写了一个关于DB ...

  7. .NET中的依赖注入

    .NET 依赖注入 依赖注入是什么 内置Log 使用拓展方法注册服务组(Register groups of services with extension methods) .NET框架提供的服务( ...

  8. 转: 理解AngularJS中的依赖注入

    理解AngularJS中的依赖注入 AngularJS中的依赖注入非常的有用,它同时也是我们能够轻松对组件进行测试的关键所在.在本文中我们将会解释AngularJS依赖注入系统是如何运行的. Prov ...

  9. JavaEE开发之Spring中的依赖注入与AOP编程

    上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...

最新文章

  1. C++ transform for_each
  2. 斯坦福2019秋季课程CS224W
  3. J2EE常用资源管理方式总结
  4. switch中default的用法
  5. 6.最小角回归(Least Angle Regression)
  6. VC网络通信API概览
  7. (译) JSON-RPC 2.0 规范(中文版)
  8. 智能客户端ios_为什么现在的客户端开发越来越不吃香了
  9. LeetCode 1652. 拆炸弹(前缀和)
  10. 更新macOS Monterey后遇到的各种Bug问题及解决方法
  11. 做柜员还是程序员_应届生放弃互联网大厂回家乡银行:程序员五万比不上柜员五千...
  12. c++前置声明的一点总结
  13. python平台无关性_Java是如何实现平台无关性的
  14. 十二款世界顶级杀毒软件下载---有序列号全可免费升级
  15. mysql8安装步骤教程
  16. error: Failed dependencies: perl(Data::Dumper) is needed by MySQL-server-5.6.46-1.el7.x8
  17. 如何用计算机测量图片景深,用比较仔细的测量搞清楚“景深”(1.实测景深与公式比较)...
  18. excel中录制宏只执行一半的命令,没有执行全部如何解决?
  19. C#:TopK:1万个数取前最大的100,堆排序
  20. bom成本分析模型_拆解苹果HomePod发现BoM成本高达248.4美元

热门文章

  1. 模板:网络流(Dinic算法)
  2. AT4437-[AGC028C]Min Cost Cycle【结论,堆】
  3. P3346-[ZJOI2015]诸神眷顾的幻想乡【广义SAM】
  4. 牛客-牛牛的猜球游戏
  5. P1081-开车旅行【倍增,链表,dp】
  6. P1768-天路【负环,SPFA,01分数规划,二分答案】
  7. M-SOLUTIONS Programming Contest 2020总结
  8. 博客文章列表(一)——JAVA
  9. vue.js 接收url参数
  10. 关于TCP/IP必须知道的几个基础问题