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

依赖注入是一种软件开发概念,其中为对象提供了创建所需的所有对象或值。 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

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

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

相关文章

Java Web Token - JWT

JWT认证过程&#xff1a;https://www.codetd.com/article/3602378 JWT官方文档&#xff1a;https://jwt.io/introduction/转载于:https://www.cnblogs.com/leodaxin/p/10648358.html

中断和异常,陷阱的区别和联系

对于中断&#xff0c;异常和陷阱的各种关系&#xff0c;总结如下&#xff1a; 表 2.1. 中断&#xff0c;异常和陷阱的区别和联系 对CPU来说是 和当前CPU所执行的指令的关系CPU接下来的事情程序员和用户的态度中断被动的异步的没关系跳转到对应的ISR希望有对应的中断&#xff0c…

matlab global(全局变量)

如果想让某个函数中定义的变量能够被其他函数调用&#xff0c;需要用到全局变量。注意&#xff0c;在这两个函数中都要用global修饰这个变量。如&#xff1a; function t1 global x; x0; function t2 global x; yx end

win 2016 ssh_多台WIN10之间的SSH免密登录

网上有很多关于使用win10-ssh客户端登录linux-ssh服务端的介绍&#xff0c;但很少介绍多台win10-ssh服务端之间互访的。以下记录如何免密登录win10-ssh服务。1、安装OpenSSH。网上有很多介绍通过添加win10可选功能安装openssh&#xff0c;此处不赘述。如果通过添加可选功能出现…

Windows下安装及使用NVM

所谓nvm就是一个可以让你在同一台机器上安装和切换不同版本node的工具。这里是一篇安装及使用教程。 第一步&#xff1a;下载nvm 到github上下载最新版本https://github.com/coreybutler/nvm-windows/releases nvm-noinstall.zip&#xff1a; 这个是绿色免安装版本&#xff0c;…

Operating System-Thread(5)弹出式线程使单线程代码多线程化会产生那些有关问题

Operating System-Thread(5)弹出式线程&&使单线程代码多线程化会产生那些问题本文主要内容 弹出式线程&#xff08;Pop-up threads)使单线程代码多线程化会产生那些问题 一、弹出式线程&#xff08;Pop-up threads) 以在一个http到达之后一个Service的处理为例子来介绍…

cad2016中选择全图字体怎么操作_CAD2016 软件安装教程

安装包下载地址[软件名称]: CAD 2016[安装环境]: Win 10/Win 8/Win 7/Win xp[CAD2016 32-64bit下载链接]:https://pan.baidu.com/s/1AaeIZrJ6IlvBg3QiY3apWw[提取码]&#xff1a;oqcg(建议复制粘贴链接与提取码)安装中有问题可以咨询微信&#xff1a;XYSHY2CAD 2016介绍AutoCAD…

JavaScipt30(第八个案例)(主要知识点:canvas)

承接上文&#xff0c;这是第8个案例&#xff0c;要实现的效果是按住鼠标不放&#xff0c;进行拖动时可以在画布上画出不同粗细不同颜色的曲线。 附上项目链接: https://github.com/wesbos/JavaScript30 主要思路&#xff1a;鼠标按下时&#xff0c;记录当前x,y坐标&#xff0c;…

死锁的产生、预防和避免

死锁是由于并发进程只能按互斥方式访问临界资源等多种因素引起的&#xff0c;并且是一种与执行时间和速度密切相关的错误现象。死锁的一般定义&#xff1a;若在一个进程集合中&#xff0c;每一个进程都在等待一个永远不会发生的事件而形成一个永久的阻塞状态&#xff0c;这种阻…

python numpy.random模块中提供啦大量的随机数相关的函数

1. numpy中产生随机数的方法 1)rand()   产生[0,1]的浮点随机数,括号里面的参数可以指定产生数组的形状 2)randn()  产生标准正太分布随机数&#xff0c;参数含义与random相同 3)randint()  产生指定范围的随机数&#xff0c;最后一个参数是元祖&#xff0c;他确定数组的…

eclipse复制代码连接数据库404_再见,Eclipse ...

点击上方“Java基基”&#xff0c;选择“设为星标”做积极的人&#xff0c;而不是积极废人&#xff01;源码精品专栏 中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业…

单页vue路由router

Vue.js vue-router 可以很简单的实现单页应用。 <router-link> 是一个组件&#xff0c;该组件用于设置一个导航链接&#xff0c;切换不同 HTML 内容。 to 属性为目标地址&#xff0c; 即要显示的内容。 以下实例中我们将 vue-router 加进来&#xff0c;然后配置组件和路…

python 多线程为什么鸡肋?

什么是全局解释器锁GIL Python代码的执行由Python 虚拟机(也叫解释器主循环&#xff0c;CPython版本)来控制&#xff0c;Python 在设计之初就考虑到要在解释器的主循环中&#xff0c;同时只有一个线程在执行&#xff0c;即在任意时刻&#xff0c;只有一个线程在解释器中运行。对…

usb端点轮询_使用Spring Integration轮询http端点

usb端点轮询如果您想用Spring Integration编写一个流程来轮询HTTP端点并从http端点收集一些内容以进行进一步处理&#xff0c;那有点不直观。 Spring Integration提供了几种与HTTP端点集成的方式- Http出站适配器–将消息发送到http端点 Http出站网关–将消息发送到http端点…

tensorflow下载

以下下载的为tensorflow版本为1.2.1 GPU python3.6 python3.5 https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-1.2.1-cp35-cp35m-win_amd64.whlhttps://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-1.2.1-cp36-cp36m-win_amd64.wh…

make时候说找不到makefile_找不到对象,应不应该接受相亲?听听三个过来人怎么说...

找我分享你的故事&#xff0c;点击右上角关注&#xff0c;你就是我的人了&#xff01;相信每一个人都有这样一个愿望&#xff1a;希望在自己感情的世界里面能够遇到一个执子之手&#xff0c;与子偕老的人共度余生。可是不是每个人都能够那么幸运的&#xff0c;那么轻易的就遇上…

Synchronized总结

一、synchronized加锁原理 synchronized可以保证方法或者代码块在运行时&#xff0c;同一时刻只有一个线程可以进入到临界区&#xff0c;同时它还可以保证共享变量的内存可见性。 Java中每一个对象都可以作为锁&#xff0c;这是synchronized实现同步的基础&#xff1a; &#x…

dpkg命令

dpkg命令如果ubuntu要安装新软件&#xff0c;已有deb安装包&#xff08;例如&#xff1a;iptux.deb&#xff09;&#xff0c;但是无法登录到桌面环境。那该怎么安装&#xff1f;答案是&#xff1a;使用dpkg命令。dpkg命令常用格式如下&#xff1a;sudo dpkg -I iptux.deb#查看i…

linux进程间的通信(C): 共享内存

一、共享内存介绍共享内存是三个IPC(Inter-Process Communication)机制中的一个。它允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在进行的进程之间传递数据的一种非常有效的方式。大多数的共享内存的实现&#xff0c;都把由不同进程之间共享的内存安排为同一段…