系列文章
“一盘沙拉”带你入门Dagger2(一)之HelloWorld
“一盘沙拉”带你入门Dagger2(三)之@Qualifier
“一盘沙拉”带你入门Dagger2(四)之 @Singleton
如果被依赖类的构造函数带有参数,要把这个参数的类型也管理起来
现在要在Salad里新加入一个水果Orange,但是Orange的构造函数里需要传入一个Knife来切水果,那么如何注入这个Orange呢?
新增的两个类
public class Orange { Knife knife; public Orange(Knife knife){ this.knife=knife; knife.cut(); Log.e("TAG", "我是一个桔子"); } }
public class Knife { public Knife() { Log.e("TAG", "我是一个小刀"); } public void cut() { Log.e("TAG", "我可以切水果"); } }
修改SaladModule类,让他管理Orange和Knife
一定要记得引入Knife,因为Salad的依赖Orange依赖了Knife,这是一个依赖链条,要把这个链条上的所有依赖,都管理起来。
@Module public class SaladModule { ......... // 引入构造函数带参数的依赖 @Provides public Orange provideOrange(Knife knife) { return new Orange(knife); } // 因为Salad所依赖的Orange又依赖了Knife,所以这里也要把Knife管理起来 // 同理,如果这个Knife还依赖了别的类,也要在这里引入 @Provides public Knife provideKnife() { return new Knife(); } }
修改SaladComponent,同样记得写Knife
@Component(modules = {SaladModule.class})//指明要在那些Module里寻找依赖 public interface SaladComponent { ......... //Salad的依赖Orange,而Orange又依赖了Knife,所以要把两者都引入 //Orange provideOragne(Knife knife);//★注意:这里千万不能带参数,否则报错 Orange provideOragne(); Knife provideKnife(); //注意:下面的这个方法,表示要将以上的三个依赖注入到某个类中 //这里我们把上面的三个依赖注入到Salad中 //因为我们要做沙拉 void inject(Salad salad); }
在目标类Salad里注入依赖
public class Salad { ......... @Inject//注入桔子 Orange orange; @Inject//注入小刀(如果你想使用小刀对象,这里要注入小刀,否则不用注入) Knife knife; public Salad() { // DaggerSaladComponent编译时才会产生这个类, // 所以编译前这里报错不要着急(或者现在你先build一下) SaladComponent saladComponent = DaggerSaladComponent.create(); saladComponent.inject(this);//将saladComponent所连接的SaladModule中管理的依赖注入本类中 makeSalad(pear, banana, saladSauce); } private void makeSalad(Pear pear, Banana banana, SaladSauce saladSauce) { Log.e("TAG", "我在搅拌制作水果沙拉"); } }
测试
09-01 13:34:35.532 10327-10327/com.demo.dagger2demo2 E/TAG: 我是一个梨 09-01 13:34:35.533 10327-10327/com.demo.dagger2demo2 E/TAG: 我是一个香蕉 09-01 13:34:35.533 10327-10327/com.demo.dagger2demo2 E/TAG: 我是沙拉酱 09-01 13:34:35.534 10327-10327/com.demo.dagger2demo2 E/TAG: 我是一个小刀 09-01 13:34:35.534 10327-10327/com.demo.dagger2demo2 E/TAG: 我可以切水果 09-01 13:34:35.534 10327-10327/com.demo.dagger2demo2 E/TAG: 我是一个桔子 09-01 13:34:35.534 10327-10327/com.demo.dagger2demo2 E/TAG: 我是一个小刀 09-01 13:34:35.534 10327-10327/com.demo.dagger2demo2 E/TAG: 我在搅拌制作水果沙拉