如何使用DI
@Inject
用来标记 使用Dagger 实例化的类以及 成员
@Component(modules = [])
用来绑定 使用者与被使用者
@Module @Provides/@Binds
用来提供一些@Inject 不能自动创建实例的对象
普通的实例创建
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);
}
}
在使用Module的情况下类似
但是由于三方的依赖类 无法在构造函数上添加@Inject注解
所以只能通过手动创建实例
@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;
}
区别 | @Provides | @Binds |
---|---|---|
Module 类型 | 抽象类 | 接口 |
方法类型 | 静态方法 | 抽象方法 |
Impl实例获取 | 通过ProviderFactory获取 | 直接new 实例 |