




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android注解使用之Dagger2實(shí)現(xiàn)項(xiàng)目依賴(lài)關(guān)系解耦
Dagger2
一句話:一款快速的注解框架,應(yīng)用于Android、Java,由Google開(kāi)發(fā)和維護(hù),是
Square
的
Dagger
項(xiàng)目的分支。
gitHub:/google/dagger
Dagger2采用依賴(lài)注入方式,依賴(lài)注入是一種面向?qū)ο蟮木幊棠J?,它的出現(xiàn)是為了降低耦合性,所謂耦合就是類(lèi)之間依賴(lài)關(guān)系,所謂降低耦合就是降低類(lèi)和類(lèi)之間依賴(lài)關(guān)系。依賴(lài)關(guān)系
Java的面向?qū)ο缶幊烫匦?,通常?huì)在一個(gè)Java對(duì)象中引用另一個(gè)Java對(duì)象,舉例說(shuō)明一下:public
class
ClassA
{
private
ClassB
classB;
public
ClassA(){
classB
=new
ClassB();
}
public
void
doSomething(){
classB.doSomething();
}
}通過(guò)上面的例子可以看出,ClassA需要借助ClassB才能完成一些特定操作,但是我們?cè)贑lassA直接實(shí)例化了ClassB,這樣耦合就產(chǎn)生了,第一違背了單一職責(zé)原則,ClassB的實(shí)例化應(yīng)該由自己完成,不應(yīng)該由ClassA來(lái)完成,第二違背了開(kāi)閉原則,一旦ClassB的構(gòu)造函數(shù)產(chǎn)生變化,就需要修改ClassA的構(gòu)造函數(shù)。通過(guò)依賴(lài)注入降低這種耦合關(guān)系:1.通過(guò)構(gòu)造參數(shù)傳參的方式public
class
ClassA
{
private
ClassB
classB;
public
ClassA(ClassB
classB){
this.classB
=classB;
}
public
void
doSomething(){
classB.doSomething();
}
}2.通過(guò)set方法的方式public
class
ClassA
{
private
ClassB
classB;
public
ClassA(){
}
public
void
setClassB(ClassB
classB)
{
this.classB
=
classB;
}
public
void
doSomething(){
classB.doSomething();
}
}3.通過(guò)接口注入的方式interface
ClassBInterface
{
void
setB(ClassB
classB);
}public
class
ClassA
implements
ClassBInterface
{
private
ClassB
classB;
public
ClassA()
{
}
@Override
public
void
setB(ClassB
classB)
{
this.classB
=
classB;
}
public
void
doSomething()
{
classB.doSomething();
}
}4.通過(guò)注解注入public
class
ClassA
{
@Inject
ClassB
classB;
public
ClassA()
{
}
public
void
doSomething()
{
classB.doSomething();
}
}Dagger2采用的就是注解注入的方式,然后編譯自動(dòng)生成目標(biāo)代碼的方式實(shí)現(xiàn)宿主與被依賴(lài)者之間的關(guān)系。Dagger2在Android的使用方式及簡(jiǎn)單說(shuō)明在Android中的使用方式很簡(jiǎn)單:只需在Module的build.gradle中添加一下配置dependencies
{
compile
'com.google.dagger:dagger:2.x'
annotationProcessor
'com.google.dagger:dagger-compiler:2.x'}
Dagger2annotation講解@Module修飾的類(lèi)專(zhuān)門(mén)用來(lái)提供依賴(lài)@Provides修飾的方法用在Module類(lèi)里@Inject
修飾需要依賴(lài)的地方(可以是構(gòu)造方法、field或者一般的方法)@Component連接@Module和注入的橋梁Dagger2舉例說(shuō)明
以項(xiàng)目中實(shí)際場(chǎng)景緩存管理為例,來(lái)體驗(yàn)一下解耦效果。設(shè)計(jì)遵循單一職責(zé)原則。LCache類(lèi)/**
*
Created
by
lichaojun
on
2017/3/30.
*
處理緩存
*/public
class
LCache
{
private
static
final
String
DEFAULT_CACHE_NAME="LCache";//默認(rèn)緩存名字
private
static
final
int
DEFAULT_MAX_CACHE_SIZE=1024;//默認(rèn)緩存名字
private
String
cacheName=DEFAULT_CACHE_NAME;//緩存名字
private
int
maxCacheSize=DEFAULT_MAX_CACHE_SIZE;
public
LCache
(){
}
@Inject
public
LCache(String
cacheName,int
maxCacheSize){
this.cacheName=cacheName;
this.maxCacheSize=maxCacheSize;
}
public
void
saveCache(String
key
,String
value){
Log.e(LCacheManager.TAG,"cacheName:
=
"+cacheName);
Log.e(LCacheManager.TAG,"maxCacheSize:
=
"+maxCacheSize);
Log.e(LCacheManager.TAG,"saveCache:
key
=
"+key
+"
value
=
"+value);
}
public
void
readCache(String
key){
Log.e(LCacheManager.TAG,"readCache:
key:
=
"+key);
}
}LExecutor類(lèi)public
class
LExecutor
{
private
static
final
int
DEFAULT_CPU_CORE
=
Runtime.getRuntime().availableProcessors();//默認(rèn)線程池維護(hù)線程的最少數(shù)量
private
int
coreSize
=
DEFAULT_CPU_CORE;//線程池維護(hù)線程的最少數(shù)量
@Inject
public
LExecutor(int
coreSize)
{
this.coreSize
=
coreSize;
}
public
void
runTask(Runnable
runnable)
{
if
(runnable
==
null)
{
return;
}
Log.e(LCacheManager.TAG,"coreSize:
=
"+coreSize);
Log.e(LCacheManager.TAG,
"runTask");
runnable.run();
}
}LCacheModule類(lèi)@Modulepublic
class
LCacheModule
{
/**
*
提供緩存對(duì)象
*
@return
返回緩存對(duì)象
*/
@Provides
@Singleton
LCache
provideLCache()
{
return
new
LCache("lcj",500);
}
}LExecutorModule類(lèi)@Modulepublic
class
LExecutorModule
{
/**
*
提供app
多任務(wù)最少維護(hù)線程個(gè)數(shù)
*
@return
返回多任務(wù)最少維護(hù)線程個(gè)數(shù)
*/
@Provides
@Singleton
LExecutor
provideLExecutor()
{
return
new
LExecutor(10);
}
}@Component(modules
=
{LCacheModule.class,LExecutorModule.class})
@Singletonpublic
interface
LCacheComponent
{
LCache
lCache();
//
app緩存
LExecutor
lExecutor();
//
app多任務(wù)線程池
void
inject(LCacheManager
lCacheManager);
}/**
*
Created
by
lichaojun
on
2017/3/30.
*
緩存處理管理
*/
public
class
LCacheManager
{
public
static
final
String
TAG=LCacheManager.class.getSimpleName();
private
LCacheComponent
cacheComponent;
private
static
class
SingletonHolder
{
private
static
LCacheManager
instance
=
new
LCacheManager();
}
private
LCacheManager(){
cacheComponent
=
DaggerLCacheComponent.builder().lCacheModule(new
LCacheModule()).build();
cacheComponent.inject(this);
}
public
static
LCacheManager
getInstance()
{
return
SingletonHolder.instance;
}
public
void
saveCache(final
String
key
,
final
String
value)
{
cacheComponent.lExecutor().runTask(new
Runnable()
{
@Override
public
void
run()
{
cacheComponent.lCache().saveCache(key,value);
}
});
}
public
void
readCache(final
String
key){
cacheComponent.lExecutor().runTask(new
Runnable()
{
@Override
public
void
run()
{
cacheComponent.lCache().readCache(key);
}
});
}
}LCacheManager.getInstance().saveCache("key","who
is
lcj
?");看下打印結(jié)果:通過(guò)Dagger2的方式剛開(kāi)始可能會(huì)覺(jué)得突然間一個(gè)簡(jiǎn)單的事情,變得復(fù)雜了,其實(shí)沒(méi)有,通過(guò)Dagger2很好的處理好了依賴(lài)關(guān)系,具體說(shuō)明,比如我們緩存LCache需要添加一個(gè)最大緩存?zhèn)€數(shù)變化,如果按照之前的方式,我們首先需要對(duì)LCache進(jìn)行修改,比如修改構(gòu)造函數(shù)增加maxCacheSize,然后必須對(duì)LCacheManager進(jìn)行修改,現(xiàn)在通過(guò)Dagger2的方式的話,我們只需修改LCacheModule就可以了,LCache實(shí)例化和相關(guān)參數(shù)和LCacheManager之間并沒(méi)有太大的依賴(lài)關(guān)系。
基于上面的緩存處理需求,我們需要實(shí)現(xiàn)讀寫(xiě)分別使用不同的多任務(wù)LExecutor,并且LExecutor的最小線程數(shù)為5,我們會(huì)在LCacheComponent添加提供writeLExecutor函數(shù),如下:@Component(modules
=
{LCacheModule.class,LExecutorModule.class})
@Singletonpublic
interface
LCacheComponent
{
LCache
lCache();
//
app緩存
LExecutor
lExecutor();
//
app多任務(wù)線程池
LExecutor
writeLExecutor();
//
app
寫(xiě)緩存多任務(wù)線程池
void
inject(LCacheManager
lCacheManager);
}在LExecutorModule中添加提供依賴(lài)初始化的provideWriteLExecutor函數(shù)。如下:@Modulepublic
class
LExecutorModule
{
/**
*
提供app
多任務(wù)最少維護(hù)線程個(gè)數(shù)
*
@return
返回多任務(wù)最少維護(hù)線程個(gè)數(shù)
*/
@Provides
@Singleton
LExecutor
provideLExecutor()
{
return
new
LExecutor(10);
}
/**
*
提供app
多任務(wù)最少維護(hù)線程個(gè)數(shù)
*
@return
返回多任務(wù)最少維護(hù)線程個(gè)數(shù)
*/
@Provides
@Singleton
LExecutor
provideWriteLExecutor()
{
return
new
LExecutor(5);
}
}然后寫(xiě)完之后Rebuild一下項(xiàng)目,以為萬(wàn)事大吉了,結(jié)果報(bào)了如下錯(cuò)誤,怎么辦呢,難道Dagger2就這么不堪一擊嗎,當(dāng)然不是解決這個(gè)問(wèn)題很容易,使用@Named注解解決這個(gè)問(wèn)題,我們只需要在LCacheComponent的writeLExecutor()和LExecutorModule的provideWriteLExecutor()函數(shù)上添加相同的@Named("WriteLExecutor")即可。對(duì)于Module的provide函數(shù)也是
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 租憑魚(yú)塘合同范本
- 涵洞購(gòu)銷(xiāo)合同范本
- U-49900-生命科學(xué)試劑-MCE
- Cyclohexanone-d4-生命科學(xué)試劑-MCE
- 電商模式下的新經(jīng)濟(jì)業(yè)態(tài)解讀
- 短視頻在餐飲品牌國(guó)際化推廣中的應(yīng)用
- 電子競(jìng)技產(chǎn)業(yè)的市場(chǎng)競(jìng)爭(zhēng)格局分析
- 個(gè)人建筑用工合同范本
- 煤礦膠帶輸送機(jī)司機(jī)職業(yè)技能理論考試題庫(kù)160題(含答案)
- 2025廣東佛山大瀝鎮(zhèn)鎮(zhèn)屬企業(yè)員工招聘9人筆試參考題庫(kù)附帶答案詳解
- 沈陽(yáng)市地圖課件
- EMS能源管理系統(tǒng)V1.4.0用戶(hù)需求說(shuō)明書(shū)V1.0-20160916
- 伯利茲城大藍(lán)洞
- 物權(quán)法習(xí)題集
- 《工業(yè)機(jī)器人現(xiàn)場(chǎng)編程》課件-任務(wù)3.1 涂膠機(jī)器人工作站工程現(xiàn)場(chǎng)
- 實(shí)訓(xùn)4瀝青路面滲水試驗(yàn)
- 專(zhuān)業(yè)勞務(wù)派遣服務(wù)行業(yè)可行性分析報(bào)告
- 金屬非金屬礦山安全生產(chǎn)法規(guī)
- 《商務(wù)溝通-策略、方法與案例》課件 第五章 網(wǎng)絡(luò)溝通
- 市場(chǎng)調(diào)查 第三版 課件全套 夏學(xué)文 單元1-8 市場(chǎng)調(diào)查認(rèn)知 - 市場(chǎng)調(diào)查報(bào)告的撰寫(xiě)與評(píng)估
- 身心活化健康評(píng)估老年康體指導(dǎo)初級(jí)
評(píng)論
0/150
提交評(píng)論