如何使用DI
@Inject
用來標記 使用Dagger 實例化的類以及 成員
@Component(modules = [])
用來綁定 使用者與被使用者
@Module @Provides/@Binds
用來提供一些@Inject 不能自動創(chuàng)建實例的對象
普通的實例創(chuàng)建
public class Application{
Car car = new Car();
}
DI 的聲明
public class Application{
@Inject Car car;
}
public class Car{
@Inject
public Car(){
}
}
@Component
public interface CarComponent{
void inject(Application app);
}
DI 使用:
public class Application{
public Application() {
DaggerMainComponent.create().inject(this);
}
}
Dagger.jpg
在使用Module的情況下類似
但是由于三方的依賴類 無法在構造函數(shù)上添加@Inject注解
所以只能通過手動創(chuàng)建實例
@Component(modules = LiveDataModule.class)
public abstract class LiveDataComponent {
void inject(DataViewModel dataViewModel){
DataViewModel_MembersInjector.injectData(dataViewModel,new MutableLiveData<>());
}
}
這一步與Dagger自動生成的類似
@Override
public void inject(Application app) {
injectApplication(app);}
private MainActivity injectMainActivity(MainActivity instance) {
MainActivity_MembersInjector.injectCar(instance, new Car());
MainActivity_MembersInjector.injectBlankFragment(instance, new BlankFragment());
return instance;
}
對于@Providers 與@Binds
//使用Binds 注解來提供方法
@Module
public interface CarModule {
@Binds public IEngine bindEngine(EngineImpl impl);
}
//使用Provides 注解來提供方法
@Module
public abstract class CarModule {
@Provides
public static IEngine provideEngine(EngineImpl impl){
return impl;
}
}
public class EngineImpl implements IEngine{
@Inject public EngineImpl(){}
}
@Provides 注解生成的inject流程
private IEngine getIEngine() {
return CarModule_ProvideEngineFactory.provideEngine(new EngineImpl());}
@Override
public void inject(MainActivity activity) {
injectMainActivity(activity);}
private MainActivity injectMainActivity(MainActivity instance) {
MainActivity_MembersInjector.injectEngine(instance, getIEngine());
return instance;
}
public static IEngine provideEngine(EngineImpl impl) {
return Preconditions.checkNotNull(CarModule.provideEngine(impl), "Cannot return null from a non-@Nullable @Provides method");
}
@Binds 注解生成的inject流程
@Override
public void inject(MainActivity activity) {
injectMainActivity(activity);}
private MainActivity injectMainActivity(MainActivity instance) {
MainActivity_MembersInjector.injectEngine(instance, new EngineImpl());
return instance;
}
區(qū)別 | @Provides | @Binds |
---|---|---|
Module 類型 | 抽象類 | 接口 |
方法類型 | 靜態(tài)方法 | 抽象方法 |
Impl實例獲取 | 通過ProviderFactory獲取 | 直接new 實例 |