本系列只講使用方法和使用中遇到的問題,若是還對dagger2還不瞭解的童鞋兒能夠參考文章:java
http://www.jianshu.com/p/cd2c1c9f68d4android
http://www.jianshu.com/p/94d47da32656app
使用Dagger2的前提須要添加一些依賴:ide
1 在Project的 build.gradle
文件添加如下內容函數
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' } }
2 在Module下的build.gradle
添加如下內容 學習
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
dependencies { apt 'com.google.dagger:dagger-compiler:2.4' compile 'com.google.dagger:dagger:2.4' provided 'org.glassfish:javax.annotation:10.0-b28' }
下面咱們學習一下Dagger2的使用。gradle
<一>目標類和被依賴的類,都是咱們直接可修改的。ui
1 在被依賴類的構造函數上使用@inject註解this
public class NeedProvide { @Inject public NeedProvide(){ } public void printMethod(){ Log.d("Dagger.class","NeedProvide----printMethod()"); } }
2 建立Component,做爲目標類和被依賴類的橋樑,並被@Component註解google
@Component public interface NeedComponent { void inject(TargetActivity activity); }
3 運行一下,讓項目生產XXXComponent
4 在目標類中利用XXXComponent進行依賴注入
DaggerNeedComponent.builder().build().inject(this);
5 依賴注入完畢後,經過@inject使用被依賴類
public class TargetActivity extends AppCompatActivity { @Inject NeedProvide mNeedProvide; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DaggerNeedComponent.builder().build().inject(this); mNeedProvide.printMethod(); } }
這裏有三種角色。目標類TargetActivity,被依賴類NeedProvide,橋樑NeedComponent。
這種方法適用於目標類和被依賴類都是咱們本身建立的時候。在使用第三方庫的時候,沒法直接在類構造函數中添加@Inject
註解。或者被依賴類有多個構造函數的時候,不能註解多個構造函數,這樣會產生歧義,由於Dagger2沒法確認調用哪個構造函數,來生成類的實例對象。此時這種方法就失效了,下面請看第二種方法。
<二>建立Module提供咱們被依賴類,使用@Provides註解修飾
這種方法步驟和上面同樣,只不過修改咱們添加一些註解,直接看代碼。
被依賴類:
public class NeedProvideS { public NeedProvideS(){ } public void printMethod(){ Log.d("Dagger.class","NeedProvideS----printMethod()"); } }
這裏將NeedProvideS類構造器上的@inject註解去掉了(不去掉也行,此處爲了防止第一種方法對本次影響)。
被依賴類的封裝類即Module:
@Module public class ProvideModuleS { @Provides public NeedProvideS provideNeedProvide(){ return new NeedProvideS(); } }
使用Module封裝被依賴類的目的在以前說過。此處咱們看看這個類,類上用@Module註解修飾,方法是提供被依賴類的,因此用@Provides修飾,目的是爲了讓dagger可以查找到。
@Module public class ProvideModuleS { @Provides public NeedProvideS provideNeedProvide(Bean bean){ return new NeedProvideS(bean); } @Provides public Bean provideBean(){ return new Bean(); } }
當咱們某一個方法須要參數的時候,它會自動去查找本類其餘被@Module註解修改的方法。
橋樑:
@Component(modules = ProvideModuleS.class) public interface NeedComponentS { void inject(TargetActivityS activity); }
此處使用了modules屬性,指定提供封裝了被依賴類的封裝類。Component還能夠依賴多個Module。下篇會講。
目標類:
public class TargetActivityS extends AppCompatActivity { @Inject NeedProvideS mNeedProvideS; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DaggerNeedComponentS.builder().build().inject(this); mNeedProvideS.printMethod(); } }
上面咱們介紹了dagger2使用的兩種方法,那若是實際狀況中,兩種方法都用,那麼默認會先使用哪一種方法建立實列那?其實在構建類實例的時候,會按照如下順序執行:
從Module中查找類實例建立方法
以上就是一次注入生成類實例的生成步驟。(copy others,原文連接:http://www.jianshu.com/p/94d47da32656)
Dagger2最基本的使用方法已經介紹完畢了,下一遍我會講解我在實際使用的時候遇到的問題。