關(guān)于Dagger2中@Binds的使用

在Dagger2中,一般都是使用@provide方法注入接口。
在我們使用MVP模式搭建Android app的時(shí)候,一般我們會(huì)這樣做,創(chuàng)建一個(gè)接口presenter命名為HomePresenter。

public interface HomePresenter {
   Observable<List<User>> loadUsers()
}

然后創(chuàng)建一個(gè)這個(gè)接口的實(shí)例,叫做HomePresenterImp,

public interface HomePresenter {
  Observable<List<User>> loadUsers();
}
public class HomePresenterImp implements HomePresenter {
  public HomePresenterImp(){
  }  
  @Override
  public Observable<List<User>> loadUsers(){
    //Return user list observable
  }
}

但是請(qǐng)注意,在HomePresenterImp這個(gè)類中,我并沒有使用@Inject在構(gòu)造方法上。所以,我們要在module中我們經(jīng)常會(huì)使用一個(gè)叫provide的注解提供這個(gè)類的對(duì)象,就像這樣。

@Module
public class HomeModule {

  @Provides
  public HomePresenter providesHomePresenter(){
    return new HomePresenterImp();
  }
}

但是,如果我們需要添加一個(gè)依賴到presenter叫UserService,那就意味著,我們也要在module中添加一個(gè)provide方法提供這個(gè)UserService,然后在HomePresenterImp類中加入一個(gè)UserService參數(shù)的構(gòu)造方法;
或者
我們可以使用@Binds這個(gè)注解就想這樣:

@Module
public abstract class HomeModule {

  @Binds
  public abstract HomePresenter bindHomePresenter(HomePresenterImp homePresenterImp);
}

這個(gè)就是告訴dagger,這個(gè)HomePresenter是用的HomePresenterImp類實(shí)現(xiàn)的。當(dāng)然,你會(huì)注意到這個(gè)class是抽象類。這就意味著我們可以添加抽象方法。
那么現(xiàn)在。只要在HomePresenterImp類中的構(gòu)造方法加上@Inject注解,這樣,我們就不需要添加依賴參數(shù)來提供provide方法了。
我們只要簡(jiǎn)單的在構(gòu)造方法中使用@Inject;

@PerActivity
public class HomePresenterImp implements HomePresenter {
  private UserService userService;
  @Inject
  public HomePresenterImp(UserService userService){
   this.userService = userService;
  }
  @Override
  public Observable<List<User>> loadUsers(){
    return userService.getUsers();
  }
}

如果你有提供實(shí)例類的方法只調(diào)用構(gòu)造函數(shù)注入接口。在dagger中使用@Binds注解可以代替原有的樣板模式。
英文好的就看英文吧,英文翻譯過來,有些地方還是有點(diǎn)不能很好的解釋清楚。
附上鏈接(需要翻墻):android.jlelse.eu/inject-interfaces-without-providing-in-dagger-2-618cce9b1e29

需要源碼的朋友我就提供一個(gè)patloew大神寫的MVVM模式中有用到@Binds的Demo,可以去對(duì)照運(yùn)行。還有不懂的可以在下面留言??梢韵嗷ソ涣?。
附上鏈接:GitHub - patloew/countries: An example Android app using Retrofit

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容