使用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;同时他…

Lineageos14 20180525更新

一、ROM注意事项 拒绝任何无意义二次打包&#xff01; C大停止更新Lineageos14&#xff0c;我来接力。 二、ROM更新日志 20180525更新&#xff1a; 1、常规更新 2、安全补丁2018年5月5日 20180406更新&#xff1a; 1、增加通话录音&#xff0c;常规更新 2、安全补丁2018年3月…

蓝牙连接不上车要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…

如何避免踩坑--初创技术团队组建风险预估

闲来无事翻翻微信&#xff0c;发现有不少朋友公司在招技术负责人&#xff0c;跟他们聊了几句&#xff0c;发现大多数认知都是技术部门的效率与进度达不到要求&#xff0c;机缘巧合下&#xff0c;有幸到了Y公司跟其Boss会面&#xff0c;得知其技术团队效率低下&#xff0c;总是不…

查询空缺_携程旅行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;结果公…

catia怎么将特征参数化_VSLAM中特征点的参数化表示

VSLAM中特征点的参数化表示有很多&#xff0c;最直接的是用三维坐标XYZ来表示&#xff0c;但通常大家更喜欢用逆深度表示&#xff0c;因为逆深度优势在于能够建模无穷远点。Open VINS文档中给出了五种特征参数化表示&#xff1a;Global XYZ&#xff0c;Global Inverse Depth&am…

【广州】Web前端工程师

互联网公司找人咯~ 我们公司&#xff1a;道乐科技&#xff08;Dollar Tech&#xff09;成立于2013年11月&#xff0c;是一家致力于为资产管理和财富管理行业提供技术、产品和运营服务的科技金融企业。三年来&#xff0c;道乐人始终坚持“以客户为中心&#xff0c;为客户提供高品…

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

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

tbslog乱码转换_日文游戏乱码怎么办 乱码转换工具LocaleEmulator

by Nicho Feb.23,2017许多日文游戏有诸多地区限制&#xff0c;在 win7、win8、win10 上玩时候会经常遇到日文游戏乱码的情况&#xff0c;这时候就得用到乱码转换工具了&#xff0c;下面我们就来详细说明下使用方法。常用的有 microsoft locale、applocale、NTLEA 等&…

haarcascades---各种分类器xml文件下载地址

安装好opencv想找个人脸识别的小实验做做&#xff0c;后来发现没有配置文件&#xff0c;于是乎就找到了这个&#xff0c;所以就转载过来了。 下载地址&#xff1a;https://github.com/opencv/opencv/tree/master/data/haarcascades 转载地址&#xff1a;https://blog.csdn.ne…

vue 组件属性监听_vuejs组件内的对象属性监听问题

跟数据类型是有关的。当你把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项&#xff0c;Vue 将遍历此对象所有的属性&#xff0c;并使用 Object.defineProperty 把这些属性全部转为 getter/setter。但是不是所有的变动都可以通过set/get捕捉到&#xff0c;比如一个数组l…

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…