Andriod Dagger2依賴注入
阿新 • • 發佈:2018-11-26
Andriod Dagger2依賴注入
- 學習Dagger首先要了解什麼是依賴注入(Dependency Injection),為什麼需要依賴注入,瞭解這些以後就可以進入Dagger的學習,現在大部分的專案都在使用Dagger2,我們先就Dagger2進行學習,慢慢了解注入的機制。
- what and why(Dependency Injection)
- why:
- how:
學習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);
}
}