在寫作業(yè)項(xiàng)目的時(shí)候了解了一下安卓中的一些常用框架提针,然后發(fā)現(xiàn)了現(xiàn)在實(shí)際項(xiàng)目中很常見的Dagger2框架,于是對(duì)其進(jìn)行了一些學(xué)習(xí)曹傀,下面分享一下我的學(xué)習(xí)體會(huì)
什么是Dagger2
Dagger2是一個(gè)Android中依賴注入的框架辐脖,依賴注入大家應(yīng)該都很熟悉了在用Spring進(jìn)行開發(fā)時(shí)應(yīng)該經(jīng)常會(huì)碰到。簡(jiǎn)單來(lái)說(shuō)就是經(jīng)常出現(xiàn)需要在一個(gè)對(duì)象里去創(chuàng)建另一個(gè)對(duì)象的情況卖毁,類之間相互依賴產(chǎn)生耦合導(dǎo)致代碼難以維護(hù)揖曾。Dagger2就是通過(guò)注解的方式落萎,把已經(jīng)初始化好的類的實(shí)例注入到目標(biāo)類中
在安卓應(yīng)用中使用Dagger2
引入Dagger2
配置Dagger2要在gradle中加入依賴
project的gradle:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.1'
//加上下面這個(gè)亥啦,因?yàn)闀?huì)用到apt
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
app的gradle:
dependencies {
compile 'com.google.dagger:dagger:2.9'
apt 'com.google.dagger:dagger-compiler:2.9'
}
使用Dagger2的注解
Dagger2中常用的注解一共有4個(gè):@Inject,@Provides练链,@Module翔脱,@Component。這部分剛開始看的很懵逼媒鼓,感覺非辰煊酰混亂,用一張圖簡(jiǎn)要描述一下(個(gè)人覺得參考文獻(xiàn)1的圖非常的通俗易懂绿鸣,感興趣的同學(xué)可以參考那篇博文)
- @Inject
@Inject就是用來(lái)標(biāo)注要依賴的類疚沐。一處用在被依賴的類的構(gòu)造函數(shù),一處用在目標(biāo)類中被依賴的類的對(duì)象實(shí)例處潮模。 - @Component
@Component就是在@Inject標(biāo)注的被依賴類的實(shí)例和構(gòu)造函數(shù)間搭起了橋梁亮蛔。大概的工作過(guò)程就是:Component會(huì)查找目標(biāo)類中用Inject注解標(biāo)注的屬性,查找到相應(yīng)的屬性后會(huì)接著查找該屬性對(duì)應(yīng)的用Inject標(biāo)注的構(gòu)造函數(shù)擎厢,然后初始化該屬性的實(shí)例并把實(shí)例進(jìn)行賦值究流,通過(guò)inject方法注入辣吃。 - @Module
@Module也是用來(lái)標(biāo)注依賴的,但是@Inject需要標(biāo)注在構(gòu)造函數(shù)上芬探,對(duì)于一些不能修改的第三方類庫(kù)等就可以用@Module來(lái)標(biāo)注神得,基本形式見下
@Module
public class ModuleClass{
//A是第三方類庫(kù)中的一個(gè)類,通常Module使用provide的方法名
A provideA(){
return A();
}
}
- @Provides
@Provides和上面的@Module一起解決第三方類庫(kù)依賴注入的,用@Provides標(biāo)注Module中的provide方法偷仿。然后Component在搜索到目標(biāo)類中用Inject注解標(biāo)注的屬性后哩簿,Component就會(huì)去Module中去查找用Provides標(biāo)注的對(duì)應(yīng)的創(chuàng)建類實(shí)例方法進(jìn)行注入。
一個(gè)簡(jiǎn)單的實(shí)例
下面用一個(gè)簡(jiǎn)單的例子來(lái)加深理解
public class MainActivity extends AppCompatActivity implements MainContract.View {
@Inject
MainPresenter mainPresenter;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainComponent.builder()
.mainModule(new MainModule(this))
.build()
.inject(this);
//調(diào)用Presenter方法加載數(shù)據(jù)
mainPresenter.loadData();
...
}
}
public class MainPresenter {
private MainContract.View mView;
@Inject
MainPresenter(MainContract.View view) {
mView = view;
}
public void loadData() {
//調(diào)用model層方法酝静,加載數(shù)據(jù)
...
//回調(diào)方法成功時(shí)
mView.updateUI();
}
@Module
public class MainModule {
private final MainContract.View mView;
public MainModule(MainContract.View view) {
mView = view;
}
@Provides
MainView provideMainView() {
return mView;
}
}
@Component(modules = MainModule.class)
public interface MainComponent {
void inject(MainActivity activity);
}
上面的注入過(guò)程大概就是:首先MainActivity需要依賴MainPresenter卡骂,因此用@Inject對(duì)MainPresenter進(jìn)行標(biāo)注,表明這是要注入的類形入。然后全跨,我們對(duì)MainPresenter的構(gòu)造函數(shù)也添加注解@Inject,此時(shí)構(gòu)造函數(shù)里有一個(gè)參數(shù)MainContract.View說(shuō)明MainPresenter需要依賴MainContract.View亿遂,所以我們定義了一個(gè)類浓若,叫做MainModule,提供一個(gè)方法provideMainView來(lái)提供這個(gè)依賴蛇数,這個(gè)MainView是通過(guò)MainModule的構(gòu)造函數(shù)注入進(jìn)來(lái)的挪钓,接著我們需要定義Component接口類,并將Module包含進(jìn)來(lái)耳舅,最后通過(guò)
DaggerMainComponent.builder()
.mainModule(new MainModule(this))
.build()
.inject(this);
完成注入
參考文獻(xiàn):
Android:dagger2讓你愛不釋手-基礎(chǔ)依賴注入框架篇
依賴注入神器:Dagger2詳解系列
Dagger2從入門到放棄再到恍然大悟