当前位置: 首页 > 工具软件 > GWT INjection > 使用案例 >

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

田鸿彩
2023-12-01

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

<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;
	
	@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. 定义应用程序组件

现在,我们定义了模块和对象,我们将创建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

 类似资料: