1,添加dependences{
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
compile 'com.google.dagger:dagger:2.6'
annotationProcessor 'com.google.dagger:dagger-compiler:2.6'
}
2,代码结构:
--DaggerDemo
--di
--DaggerModule
--DaggerComponent
--mvp
--DaggerModel
--DaggerView
--DaggerPresenter
--DaggerActivity
3, DaggerView对应代码:
public interface DaggerView {
void showText(String s);
}
4, DaggerModel对应代码:
public class DaggerModel {
public static String getText(){
return "hello";
}
}
5,DaggerPresenter对应代码:
public class DaggerPresenter {
DaggerView mDaggerView;
@Inject
public DaggerPresenter(DaggerView daggerView){
mDaggerView=daggerView;
}
public void showText(){
mDaggerView.showText(DaggerModel.getText());
}
}
6,DaggerActivity对应代码:
public class DaggerActivity extends AppCompatActivity implements DaggerView {
@BindView(R.id.text1)
TextView mTextView;
@Inject
DaggerPresenter mDaggerPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dagger);
ButterKnife.bind(this);
DaggerDaggerComponent.builder()
.daggerModule(new DaggerModule(this))
.build()
.inject(this);
// mDaggerPresenter=new DaggerPresenter(this);
mDaggerPresenter.showText();
}
@Override
public void showText(String s) {
mTextView.setText(s);
}
}
说明:Presenter里的构造方法的@Inject可看作依赖注入的依赖对象,而Activity中成员变量的@Inject可看作依赖注入的注入目的地,两者通过@Component 实现注入
7,DaggerModule对应代码:
@Module
public class DaggerModule {
private final DaggerView mDaggerView;
public DaggerModule(DaggerView daggerView){
mDaggerView=daggerView;
}
@Provides
DaggerView provideDaggerView(){
return mDaggerView;
}
}
8,DaggerComponent对应代码:
@Component(modules = DaggerModule.class)
public interface DaggerComponent {
void inject(DaggerActivity daggerActivity);
}
说明:实际上 ,dependency injector只是取代new方法
具体步骤:1,先在需要注入依赖的class里声明成员变量并使用@Inject标注
2,@Module中的@Providers提供的对像 和 @Inject标注的对象的构造方法 都可以提供依赖(相当于注射剂),前者优先
3,@Component负责从中寻找<1>中所需对象,如果在注射剂中寻找的对象有依赖对象,则重复<2><3>