使用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.pswp.cn/news/540122.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540122.shtml
英文地址,請注明出處:http://en.pswp.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…