使用dropwizard(3)-加入DI-dagger2

img_17e764d4d3011ebd0a2a577f51ad1293.png
i18n

前言

习惯了Spring全家桶,对spring的容器爱不释手。使用dropwizard,看起来确实很轻,然而,真正使用的时候不得不面临一个问题。我们不可能一个resource就能把所有的业务逻辑囊括!那么,必然就要有负责处理逻辑的代码,有要提取的公共的代码,要做面向接口开发等等。按照简单的用法,Java Bean就自己new,只要通过Jersey提供的web能力发出去就好。这样写下来,到处都需要new,难以测试等等。目前我最care的是,每个request过来都要new一堆重复的对象,垃圾回收频繁。写个单例不就解决了?是的,当然要想到单例,然后发现几乎所有的类都是设计成单例的。然后,一堆单例的代码写的死。这就是样板代码。于是,想到提取工具类,算了,不如用Dagger好了。

什么是Dagger

Dagger是Java里开源的DI框架中最火的之一,主要用在Android领域,很多特性也多针对Android开发的。因为Android开发对省电,性能之类的要求比较高,因此抛弃了反射,直接在编译级别生成工厂。详细学习测试:Dagger2之helloworld原理探究

Demo Source

https://github.com/Ryan-Miao/l4dropwizard

structure

.
├── pom.xml
├── readme.md
└── src└── main├── java│   └── com│       └── test│           ├── HelloWorldApplication.java│           ├── bundles│           │   └── ConnectivityBundle.java│           ├── configuration│           │   ├── HelloWorldConfiguration.java│           │   └── modules│           │       ├── ConnectAndReadConfig.java│           │       └── GithubApiConfig.java│           └── domain│               ├── connect│               │   ├── FeignClientBuilder.java│               │   ├── GithubClient.java│               │   └── GithubConnector.java│               ├── entiry│               │   ├── GithubUser.java│               │   └── Saying.java│               ├── exception│               │   └── UpstreamException.java│               ├── health│               │   └── TemplateHealthCheck.java│               ├── ioc│               │   ├── component│               │   │   └── GithubComponent.java│               │   └── module│               │       ├── ConfigurationModule.java│               │       ├── ConnectorModule.java│               │       └── ServiceModule.java│               ├── resource│               │   ├── GithubResource.java│               │   └── HelloWorldResource.java│               └── service│                   ├── IGithubService.java│                   └── impl│                       └── GithubService.java└── resources└── config└── dev.yml

本文基于之前的dropwizard入门演进.

添加dagger依赖

properties结点下新增

<dagger.verion>2.12</dagger.verion>

在dependencies下新增


<dependency><groupId>com.google.dagger</groupId><artifactId>dagger</artifactId><version>${dagger.verion}</version>
</dependency>

build.plugins下新增plugin

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.6.1</version><configuration><source>${java.version}</source><target>${java.version}</target><encoding>UTF-8</encoding><annotationProcessorPaths><path><groupId>com.google.dagger</groupId><artifactId>dagger-compiler</artifactId><version>${dagger.verion}</version></path></annotationProcessorPaths></configuration>
</plugin>

在IDEA设置中,找到Build>Compiler>Annotation Processors, 选择Enable annotation processing.

创建一个Component

下面创建Component,用来包容Resource类,对外提供Resource类。新建com.test.domain.ioc.component.GithubComponent

package com.test.domain.ioc.component;import com.test.domain.ioc.module.ServiceModule;
import com.test.domain.resource.GithubResource;
import dagger.Component;import javax.inject.Singleton;/**
 * Created by Ryan Miao on 10/26/17.
 */
@Singleton
@Component(modules = {ServiceModule.class})
public interface GithubComponent {GithubResource gitHubResource();
}

显然,这个GithubResource需要注入一个service,于是声明一个ServiceModule, 创建com.test.domain.ioc.module.ServiceModule

package com.test.domain.ioc.module;import com.test.domain.service.IGithubService;
import com.test.domain.service.impl.GithubService;
import dagger.Module;
import dagger.Provides;import javax.inject.Singleton;/**
 * Created by Ryan Miao on 10/26/17.
 */
@Module(includes = ConnectorModule.class)
public class ServiceModule {@Singleton@Providespublic IGithubService githubService(GithubService service) {return service;}
}

ServiceModule用来提供service注入,service接着依赖connector层,新建com.test.domain.ioc.module.ConnectorModule

package com.test.domain.ioc.module;import com.test.domain.connect.FeignClientBuilder;
import dagger.Module;
import dagger.Provides;import javax.inject.Singleton;/**
 * Created by Ryan Miao on 10/26/17.
 */
@Module(includes = ConfigurationModule.class)
public class ConnectorModule {@Provides@Singletonpublic FeignClientBuilder feignClientBuilder(){return new FeignClientBuilder();}}

connecttor层中,需要调用GlobalConfiguration的配置项,所以,单独把配置提出来,引入。新增com.test.domain.ioc.module.ConfigurationModule

package com.test.domain.ioc.module;import com.test.configuration.HelloWorldConfiguration;
import dagger.Module;
import dagger.Provides;import javax.inject.Singleton;/**
 * Created by Ryan Miao on 11/20/17.
 */
@Module
public class ConfigurationModule {private final HelloWorldConfiguration configuration;public ConfigurationModule(HelloWorldConfiguration configuration) {this.configuration = configuration;}@Provides@Singletonpublic HelloWorldConfiguration helloWorldConfiguration(){return configuration;}
}

这是依赖的最底层,我们通过手动构造函数的方式注入configuration,这样可以在dropwizard启动时生成module,并且得到configuration。

引入我们的Component

这时候,build一下,dagger就会自动生成我们的工厂。

mvn clean install

然后,在IDEA里的maven plugin里,右键,reimport。防止IDEA不认识dagger自动生成的类。dagger自动生成的类位于target/generated-sources/annotations. 点击刷新按钮,刷新下maven依赖。

然后,在com.test.HelloWorldApplication中,新增

private void registerResources(HelloWorldConfiguration configuration, Environment environment) {GithubComponent component = DaggerGithubComponent.builder().configurationModule(new ConfigurationModule(configuration)).build();environment.jersey().register(component.gitHubResource());
}

DaggerGithubComponent要在maven install之后,dagger生成的。完整启动类如下:

public class HelloWorldApplication extends Application<HelloWorldConfiguration> {public static void main(String[] args) throws Exception {new HelloWorldApplication().run(args);}@Overridepublic String getName() {return "hello-world";}@Overridepublic void initialize(Bootstrap<HelloWorldConfiguration> bootstrap) {bootstrap.addBundle(new ConnectivityBundle());}@Overridepublic void run(HelloWorldConfiguration configuration, Environment environment) throws Exception {final HelloWorldResource resource = new HelloWorldResource(configuration.getTemplate(),configuration.getDefaultName());final TemplateHealthCheck healthCheck =new TemplateHealthCheck(configuration.getTemplate());environment.healthChecks().register("template", healthCheck);environment.jersey().register(resource);environment.jersey().register(healthCheck);registerResources(configuration, environment);}private void registerResources(HelloWorldConfiguration configuration, Environment environment) {GithubComponent component = DaggerGithubComponent.builder().configurationModule(new ConfigurationModule(configuration)).build();environment.jersey().register(component.gitHubResource());}
}

当然,我们的Resource也要改成Inject模式

public class GithubResource {private IGithubService service;@Injectpublic GithubResource(IGithubService service) {this.service = service;}@GET@Timed@Path("/users/{username}")public GithubUser getUserProfile(@PathParam("username") final String username) {return service.getUserProfile(username);}}

启动,运行。一切OK。以后就可以在需要注入的类的构造器上声明@Inject, 或者在module里@Provide,就可以实现构造解耦。测试不要太方便.





唯有不断学习方能改变! -- Ryan Miao

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

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

相关文章

日历对象导哪个包_微信新表情瞬间炸裂,文物表情包永恒萌呆!

11月18日晚微信上架了6个全新表情瞬间炸裂网友一天时间阅读达16.2亿&#xff0c;讨论15.8万次#微信新表情#话题翻白眼、666、让我看看叹气、苦涩、裂开微信新表情虽然666但文物表情包的呆萌也能让人瞬间裂开更能完全诠释我的各(bu)种(wen ding)情绪先对比一下最新的6个表情[翻白…

Tensorflow一些常用基本概念与函数(1)

文章转至 作者&#xff1a;林海山波出处&#xff1a;https://me.csdn.net/lenbow版权&#xff1a;本文版权归作者和CSDN博客共有 写这篇博客只为自己学习路上做个笔记&#xff0c;方便自己学习记忆&#xff0c;大家如果想看详细文章可以去原作者主页去看&#xff0c;同时他…

蓝牙连接不上车要hfp_如何正确使用车载蓝牙播放器呢?

车载蓝牙是以无线蓝牙技术为基础而设计研发的车内无线免提系统。可以连接我们设计进行听歌和打电话十分方便&#xff0c;下面诺金小编带大家一起来看看&#xff01;下面诺金小编带大家一起来看看一、首先是把手机和车载蓝牙播放器打开&#xff0c;搜索车载蓝牙播放器“809”&am…

使用Eclipse+PyDev创建Django项目一windows下

开发条件&#xff1a;eclipsepydev插件django editor插件 关于eclipse安装小编就不多做介绍&#xff0c;我自己用的版本如下 1.安装pydev插件 启动Eclipse, 点击Help->Install New Software 弹出如下框 点击add 分别在 Name中填:Pydev, Location中填http://pydev.org/up…

查询空缺_携程旅行2021校招开启,9大类职位,1000+岗位空缺,本科及以上学历...

携程旅行2021秋季校招正式开启&#xff01;携程集团(纳斯达克股票代码&#xff1a;TCOM)是一家领先的在线旅游服务提供商&#xff0c;旗下品牌包括携程、Trip.com、天巡和去哪儿。携程集团能够整合复杂的旅游相关信息并通过其先进的移动端App、网站以及24小时无间断的免费客户服…

Django web开发笔记

一、Django开发环境搭建&#xff1a; 1.安装python&#xff1a;django可运行于版本python 2.7、3.x 2.安装相应的IDE 3.安装pip&#xff1a;sudo apt-get install python-pip(linux为例&#xff09; 4.安装django&#xff1a;1&#xff09;pip安装&#xff1a;sudo pip ins…

android 前置摄像头预览时 镜像翻转_全面屏时代,原来手机前置摄像头都隐藏着一些缺点,你发现了吗?...

随着真全面屏时代的到来&#xff0c;人们已经不再满足于刘海屏、水滴屏以及挖孔屏等&#xff0c;越来越多的手机厂商和消费者开始追求"100%全面屏"。于是如何解决手机前置摄像头便成了最大的难题&#xff0c;毕竟只要在屏幕上放置摄像头必然会影响屏占比&#xff0c;…

Java 调用 Python 方法学习笔记

文章转载自&#xff1a; 作者&#xff1a;IT_xiao_bai 来源&#xff1a;CSDN 原文&#xff1a;https://blog.csdn.net/IT_xiao_bai/article/details/79074988 前一阵自刚好用python做了一个sae的算法模型&#xff0c;结果公…

Java 调用 Python 方法学习笔记---之---java调用python深度学习模型运算并返回运算结果给前端(2)

上一章写到Java 调用 Python 方法学习的三种方法&#xff0c;这里强调第三种方法。第三种方法本质上和第二种方法是一样的&#xff0c;都是应用到 Runtime.getRuntime().exec() 去执行文件。要深度理解这种方法&#xff0c;首先要先理解一下Runtime.getRuntime().exec() 。 R…

Part 2: Containers

要求 安装了1.13或者更高版本的Docker阅读了Part1中的定位&#xff08;我没写&#xff09;介绍 是时候用Docker构建一个app了。我们会从构建这样一个app的最底层开始&#xff0c;容器——我们这节所介绍的内容。在这层之上是服务&#xff0c;服务定义了容器们的在生产中的行为&…

(论文)WS-DAN (弱监督数据增强)

背景 近期在做外卖分类的项目&#xff0c;外卖分类属于细粒度图像分类&#xff0c;在分类的过程中要从图片的行人中和非机动车中区分出各类外卖&#xff08;主要是美团、饿了吗&#xff09;。刚好近期发现了一片关于细粒度图像分类较新的论文&#xff08;See Better Before Lo…

罗马音平假名片假名转换器_关于五十音你所要知道的一切!文末附日网高清字帖...

今天开始&#xff0c;木子小花日本语教室将开始同时更新日语文法系列文章 和 日语真题详解系列文章&#xff0c;从五十音图的记忆方法到日语助词的用法整理&#xff0c;从N5的简单句子构成到N1复杂文法的接续记忆方法&#xff0c;力求做出全知乎&#xff08;小声&#xff1a;全…

django的web开发笔记1(智能诊断系统数据概览记录)

接于上一篇&#xff0c;这一篇主要记录如何链接mysql数据库以及从数据库中调用数据信息到页面&#xff0c;同时包含百度地图api的一些使用。 其中包括模块&#xff0c;echert图表绘制数据调用&#xff0c;百度地图数据信息调用以及一些单机效果&#xff0c;页面数据调用等。 1…

左右xcode的重构选项的一些理解

Rename(重命名):对标示符进行重命名,以获得更好的代码可读性,这些标示符包含类,方法或者函数的名称. Extract(抽取):将你在XCode种选择的代码抽取到一个新的方法或函数中. Create SuperClass(创建父类):为Xcode中当前所选的类定义父类 Move Up(上移):将所选择的方法,属性,或实例…

window 如何查看tomcat 实时日志_如何处理生产环境Tomcat的catalina.out日志?

前语&#xff1a;不要为了读文章而读文章&#xff0c;一定要带着问题来读文章&#xff0c;勤思考。作者&#xff1a;jmcui 来源&#xff1a;http://1t.click/x4q# 前言随着每天业务的增长&#xff0c;Tomcat 的catalina.out日志 变得越来越大&#xff0c;占用磁盘空间不说。要…

paddlepaddle测试安装_百度paddlepaddle深度学习7日入门-CV疫情特辑心得

正值疫情严重之日&#xff0c;作为一名研究生被迫待在家里学习&#xff0c;手头的科研项目也严重受挫。。。偶然间&#xff0c;看到微信公众号发布这门课&#xff0c;马上报名&#xff0c;入坑&#xff01;&#xff01;&#xff01;瞬间疫情其间有学习的目标了。。该课程学习依…

apache目录 vscode_VsCode搭建Java开发环境(Spring Boot项目创建、运行、调试)

VsCode搭建Java开发环境(Spring Boot项目创建、运行、调试)安装如下两个主要扩展即可&#xff0c;这两个扩展已关联java项目开发主要使用的maven、springboot等所需要的扩展。开始步骤&#xff1a;在 Visual Studio Code 中打开扩展视图(CtrlShiftX)。输入“java”搜索商店扩展…

android dp转px的公式_Android特效专辑——自定义不一样的Toast

大家都知道&#xff0c;Android的控件有时候很难满足我们的需求&#xff0c;所以我们需要自定义View。自定义的方式很多&#xff0c;有继承原生控件也有直接自定义View的&#xff0c;今天写的是自定义的Toast&#xff0c;当然&#xff0c;这个不是复写Toast,是换一种表达形式&a…

code iban 是有什么组成_深入浅出Zookeeper(四):客户端的请求在服务器中经历了什么...

作者 泊浮目 沃趣科技高级研发工程师出品 沃趣科技1. 前言当我们向zk发出一个数据更新请求时&#xff0c;这个请求的处理流程是什么样的&#xff1f;zk又是使用了什么共识算法来保证一致性呢&#xff1f;带着这些问题&#xff0c;我们进入今天的正文。2. 设计模式&#xff1…

启动activemq_「Java」 - SpringBoot amp; ActiveMQ

一、消息队列消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合、异步消息、流量削锋等问题&#xff0c;实现高性能、高可用、可伸缩和最终一致性架构&#xff0c;是大型分布式系统不可缺少的中间件。目前在生产环境中使用较多的消息队列有ActiveMQ、Rabbit…