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:

    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 注入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle创建一个表同已存在表结构一样

oracle创建一个表同已存在表结构一样&#xff08;或者同时将数据导入&#xff09; –只是建立ta表&#xff0c;与emp表结构相同&#xff0c;并不添加数据 –这种构造与现存表相同结构的表&#xff0c;是不会将comment带过来的 create table ta as select * from scott.emp wh…

周敏教授计算机编码与密码学,中国科学院计算机与控制学院博士生导师:张玉清教授...

张玉清 男 博导 信息科学与工程学院电子邮件&#xff1a;zhangyqgucas.ac.cn通信地址&#xff1a;北京石景山区玉泉路19号甲邮政编码&#xff1a;100049部门/实验室&#xff1a;计算机与控制学院职务: 教授&#xff0c;副院长电子邮箱: zhangyqucas.ac.cn研究方向:计算机网络&a…

戴尔G3笔记本使用U盘重装操作系统

戴尔G3笔记本 下载安装大白菜U盘启动盘制作软件根据使用说明完成启动盘制作下载操作系统ISO文件重启电脑&#xff0c;连续按F12&#xff0c;打开如下界面后选择红色线框选项&#xff1a; 进入PE系统界面&#xff0c;打开【大白菜】&#xff0c;看到如下界面&#xff1a;

华南理工网络教育计算机概论,2020年《计算机概论》平时作业华南理工网络教育学院.pdf...

计算机概论平时作业1. 简 述人工智能答&#xff1a;人工智能是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支&#xff0c; 它企图了解智能的实质&#xff0c; 并生产出一种新的能以人类智能相似的方…

python合并csv文件_Python学习——pandas 合并csv文件

import pandas as pd import os import re import numpy as np Folder_Path rC:/Users/Cable-Ching\Desktop/New folder/New folder # 要拼接的文件夹及其完整路径&#xff0c;注意不要包含中文 SaveFile_Path rC:/Users/Cable-Ching\Desktop/New folder/New folder # 拼接后…

ebook_[EBOOK]十大Java性能问题

ebook有兴趣了解更多吗&#xff1f; 然后&#xff0c;您应该在此处下载相关的电子书。 Java中的大多数性能问题都可归因于少数根本原因。 当然&#xff0c;偶尔会有一些奇怪的极端情况突然出现&#xff0c;并在应用程序中造成严重破坏&#xff0c;但是在大多数情况下&#xff…

macOS下的视频格式转换器

1-Click Video Converter Total Video Converter Pro

valid floating point value什么意思_为什么 0.1 + 0.2 = 0.300000004?

往期热门文章&#xff1a;1、《往期精选优秀博文都在这里了&#xff01;》2、求求你&#xff01;数据库不要再使用外键了&#xff1f;3、还在写慢SQL&#xff1f;4、ELK太笨重了&#xff1f;想放弃&#xff1f;快试试日志系统新贵Loki吧&#xff01;5、谁再悄咪咪的吃掉异常&am…

用计算机处理信息教学反思,《人工智能处理信息》教学反思

作业内容《用智能工具处理信息》教学反思《用智能工具处理信息》的学习目标是&#xff1a;1.初步了解人工智能的概念。2.知道人工智能的两个研究领域“自然语言理解”和“模式识别”3.能够辨别“自然语言理解”与“模式识别”的区别。在教学的过程中重视学生学习兴趣的调动。课…

在抽象类中可以没有抽象方法_是否可以在最终课程中使用抽象方法?

在抽象类中可以没有抽象方法这是最近在Java开发人员工作面试的电话面试中向我的一位读者提出的有趣的Java核心问题之一。 即使他知道你 无法用Java将抽象类定型为final &#xff0c;他对方法的措辞感到困惑。 答案很简单&#xff0c;不&#xff0c;在Java的最终类中不可能有抽…

python二维列表排序_使用Python按顺时针方向排序二维坐标列表?

这应该说明问题&#xff0c;给出一个可视化工具 但对于在同一距离上获得一组点的正确入口点来说&#xff0c;这并不总是有效的import random import pylab import cmath from itertools import groupby pts [(random.randrange(-5,5), random.randrange(-5,5)) for _ in range…

如何维护笔记本电脑的电池

如何保护笔记本电池&#xff1f; 笔记本电脑尽量插电源使用&#xff0c;每个月对电池充电放电1~3次&#xff0c;放电时电量不要低于20%&#xff0c;现在笔记本电脑的电池都有过充保护机制&#xff0c;电池充满了就不会再继续充电&#xff0c;插着电源使用的是电源的电量&#…

微型计算机生产工艺,bb肥生产设备制造工艺流程

原标题&#xff1a;bb肥生产设备制造工艺流程BB肥生产设备与有机肥设备相比较而言设备相对简单&#xff0c;因而BB肥便具有投资小的优点&#xff0c;而且因其配方灵活&#xff0c;非常适合我国正在推广的测土配方肥的需要&#xff0c;是一种非常适合我国国情的肥料。在发达国家…

nodejs异步测试_异步过程的自动化测试

nodejs异步测试自从我开发了具有异步行为的服务器端应用程序以来已经有一段时间了&#xff0c;而该行为还不是事件驱动的系统。 异步行为始终是设计和测试中一个有趣的挑战。 通常&#xff0c;异步行为不应该很难进行单元测试–毕竟&#xff0c;动作的行为不一定必须在时间上进…

pipeline python,Python-什么是sklearn.pipeline.Pipeline?

I cant figure out how the sklearn.pipeline.Pipeline works exactly.There are a few explanation in the doc. For example what do they mean by:Pipeline of transforms with a final estimator.To make my question clearer, what are steps? How do they work?EditTha…

devc++鼠标变成了光标_Excel填充别再用鼠标拖拉了!用这4个方法,效率至少高10倍!...

Hello&#xff0c;各位叨友们好呀&#xff01;我是叨叨君~根据下表对照一下自己&#xff0c;在Excel中需要批量填充公式的时候&#xff0c;你是不是还在用鼠标拖拉的方法&#xff0c;将光标放在单元格的右下角&#xff0c;然后按鼠标左键&#xff0c;向下拖动&#xff0c;填充完…

HDR和SDR的区别

概念不同&#xff0c;HDR是指高动态范围图像&#xff0c;SDR是指标准动态范围图像&#xff1b;||亮度范围表现不同&#xff0c;HDR比SDR有更大更亮的数据存储&#xff1b;||图像细节表现不同&#xff0c;HDR技术可以在使图像在明暗之间获取更多的细节表现。 概念不同&#xff…

运动基元_开发人员的新分布式基元

运动基元面向对象的基元&#xff08;进程内基元&#xff09; 作为Java开发人员&#xff0c;我非常熟悉面向对象的概念&#xff0c;例如类&#xff0c;对象&#xff0c;继承&#xff0c;封装&#xff0c;多态性等。除了面向对象的概念之外&#xff0c;我还非常熟悉Java运行时。它…

html5网站 500.19错误,WIN7操作系统创建IIS后浏览时提示HTTP500.19错误是怎么回事?如何解决?...

WIN7操作系统创建IIS后浏览时提示HTTP500.19错误是怎么回事&#xff1f;如何解决&#xff1f;作者&#xff1a;兴邦开发部人气&#xff1a;发表时间&#xff1a;2015年05月18日[文章内容简介]&#xff1a;WIN7操作系统创建IIS后浏览时提示HTTP500.19错误是怎么回事&#xff1f;…

python if else 必须同时出现吗,Python:Inline if语句else什么也不做

Assigning a Django Models field to a value if it matches a condition.g Car.objects.get(pk1234)g.data_version my_dict[dataVersion] if my_dict else expression_false # Do nothing??How do I do nothing in that case? We cant do if conditional else pass.I kn…