1. 程式人生 > >Andriod Dagger2依賴注入

Andriod Dagger2依賴注入

Andriod Dagger2依賴注入

學習Dagger首先要了解什麼是依賴注入(Dependency Injection),為什麼需要依賴注入,瞭解這些以後就可以進入Dagger的學習,現在大部分的專案都在使用Dagger2,我們先就Dagger2進行學習,慢慢了解注入的機制。

what and why(Dependency Injection)

傳統方法:
被依賴的物件(被呼叫者)

public class Book {
    public Book(){

    }
}

需要(依賴)這個物件,需要我們 new 一個物件(呼叫者)

public class MainActivity extends AppCompatActivity {

    Book mBook;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBook=new Book();
    }
}
 

why:

我們之所以需要依賴注入,最重要的就是為了解耦,達到高內聚低耦合的目的,保證程式碼的健壯性、靈活性和後期可維護性,根據業務需求也可以進行更好的變更。

how:

在Gradle中新增依賴

compile 'com.google.dagger:dagger:2.11'
annotationProcessor 'com.google.dagger:dagger-compiler:2.11' 

在被依賴的類的建構函式上新增 @Inject 註解,表示我可以提供這個物件,你們可以用。

public class Xxx {

      @Inject
      public Xxx(){

      } 
} 
或者
 class AddressBookPresenter  : BasePresenter<AddressBookView>() {
    @Inject
    lateinit var addressServiceImpl: AddressServiceImpl
    }
    class AddressServiceImpl @Inject constructor() : AddressService {
    }

既然有了可以使用的物件,那麼就需要有人去用他,這時XxxActivity出現了,表示我需要他,快給我,我是需求者,需要用@Module表示。

@Module
  public class XxxActivity extends AppCompatActivity {

          @Inject
          Xxx mXxx;

          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);

       } 
}
或者
/**
 *Created by 付曉龍
 *on 2018/10/9
 */
@Module
class AddressModule {
    @Provides
    fun addressService(service: AddressServiceImpl): AddressService {
        return service
    }
}

但是加進去了,需求者和提供者都有了,還沒有用啊,該怎麼用啊。這時就輪到@Component發揮作用了。然後,Dagger 預編譯器會根據這個介面自動加上 Dagger- 字首,生成一個實現類 DaggerXXXActivityComponent。

@Component
public interface XxxActivityComponent {
      void inject(XxxActivity xxxActivity);
}

或者

/**
 *Created by 付曉龍
 *on 2018/10/9
 */
@PerComponentScope
@Component(dependencies = arrayOf(ActivityComponent::class), modules = arrayOf(AddressModule::class))
interface AddressComponent {
    fun inject(activity: AddressBookActivity)
    ...
 }
         DaggerAddressComponent.builder().activityComponent(activityCoponent).addressModule(AddressModule()).build().inject(this)

這時提供者、需求者以及傳遞者都有,最後進行需要手動輸入,決定注入的時機。這裡就在 onCreate 注入 Xxx 物件,再次修改 XxxActivity,新增DaggerMainActivityComponent.create().inject(this):

@Module
public class XxxActivity extends AppCompatActivity {

@Inject
Xxx mXxx;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    DaggerXxxActivityComponent.create().inject(this);

    }
}

在這裡插入圖片描述