“一盘沙拉”带你入门Dagger2(二)之带参数怎么办

系列文章

“一盘沙拉”带你入门Dagger2(一)之HelloWorld

“一盘沙拉”带你入门Dagger2(二)之带参数怎么办

“一盘沙拉”带你入门Dagger2(三)之@Qualifier

“一盘沙拉”带你入门Dagger2(四)之 @Singleton

“一盘沙拉”带你入门Dagger2(五)之 @Scope

如果被依赖类的构造函数带有参数,要把这个参数的类型也管理起来

现在要在Salad里新加入一个水果Orange,但是Orange的构造函数里需要传入一个Knife来切水果,那么如何注入这个Orange呢?

  1. 新增的两个类

    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", "我可以切水果");
    
        }
    }
  2. 修改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();
        }
    }
  3. 修改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);
    
    }
  4. 在目标类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", "我在搅拌制作水果沙拉");
        }
    }
  5. 测试

    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: 我在搅拌制作水果沙拉
    

你可能感兴趣的:(Dagger2)