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

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(212)   2023-12-04 07:14:57

依赖注入是一种软件开发概念,其中为对象提供创建所需的所有对象或值。 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. Dependencies
      <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 注释在编译时放在类路径上。另外,.gwt.xml中需要添加Dagger模块:

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

那么如果你使用的是maven,你需要使用高于3.5.1版本的compiler plugin才能在编译目标被调用时自动执行注解编译。否则,您将需要在插件配置中同时指定 annotationProcessors 和 annotationProcessorsPaths。可选地,dagger-compiler 编译器可以从依赖项中删除并添加到 annotationProcessorsPaths,如 SO 中的 Thomas Broyer 所指定:

<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 下,注释处理器可以使用 process-classes 目标运行。我没有测试过 Gradle,但是使用 Gradle 的概念应该是相同的。

    <李>
    1. 简单的依赖注入

假设我们有一个压缩图片的服务。该服务依赖于另外两个服务:一个是下载图片的服务,一个是压缩后上传图片的服务。所有对象都有零参数构造函数。

public class ImageCompressor {
	
	@Inject public ImageDownloader downloader;
	@Inject public ImageUploader uploader;
	
	@Inject
	public ImageCompressor(){	
	}

	
	public void compress(String url) {
		downloader.download(url);
		GWT.log("compressing image");
		uploader.upload(url);
	}

}
public class ImageDownloader {
	
	@Inject
	public ImageDownloader() {

	}

	public void download(String url) {
		GWT.log("downloading image at " + url);
	}
	
	
}
public class ImageUploader {
	
	@Inject
	public 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 anymore
	public ImageDownloader(int timeout) {
                 this.timeout = timeout;
	}

	public void download(String url) {
		GWT.log("downloading image at " + url);
	}	
}

然后我们需要指定一个模块来提供我们的 ImageDownloader:

@Module
public class ImageCompressionModule {

	@Provides
	public ImageDownloader getImageDowloader(){
		return new ImageDownloader(15);
	}
    <李>
    1. 定义 App 组件

现在我们定义了模块和对象,我们将创建用于获取注入对象实例的 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 的下一代依赖注入。我们已经在这篇文章中看到了该框架的基本功能。更多高级 DI 功能可以在 Dagger 的主要用户指南中找到:https://google.github.io/dagger/users-guide。 Dagger 的 GWT 版本与后端版本的工作方式相同:代码可以在客户端和服务器端工作,因此将 DI 移植到后端可能会很有用,以防在 JVM 中调试时出现问题。

完整代码位于:https://github.com/zak905/dagger2-gwt-example

标签2: Java教程
地址:https://www.cundage.com/article/jcg-dependency-injection-gwt-using-dagger-2.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...