Dagger学习笔记

1.理解依赖注入

  • 依赖注入(Dependency Injection,简称 DI)
  • 是用于实现控制反转(Inversion of Control,缩写为 IoC)最常见的方式之一,控制反转是面向对象编程中的一种设计原则,用以降低计算机代码之间耦合度。
  • 控制反转的基本思想是:借助“第三方”实现具有依赖关系的对象之间的解耦。一开始是对象 A 对 对象 B 有个依赖,对象 A 主动地创建 对象 B,对象 A 有主动控制权,实现了 Ioc 后,对象 A 依赖于 Ioc 容器,对象 A 被动地接受容器提供的对象 B 实例,由主动变为被动,因此称为控制反转。
  • 注意,控制反转不等同于依赖注入,控制反转还有一种实现方式叫“依赖查找”(Denpendency Lookup)
  • Alt text

2.使用方式

2-1用@inject来提供依赖

  • 创建两个实体类,Food构造方法不需要传参数,但是我们也用@Inject标注了,这是因为在Person构造方法中需要传入Food.

  • ->Food类(构造方法用@inject标注)

       public class Food {
          @Inject
          public Food(){
              
          }
              
          public String getApple(){
             return "苹果";
          }
       }
    

*->Person类(构造方法用@inject标注)

     public class Person {
        public Food food;
        @Inject
        public Person(Food food){
            this.food = food;
        }      
            
        public String eated(){
            return food.getApple();
        }        
     }
  • Component作为桥梁,将MainActivity与Food连接

  •   @Component
      public interface FoodComponent {
          void injectFood(MainActivity mainActivity);
      }
    
  • 创建Component后,build项目,会生成一个DaggerComponent。这个实现类提供了将实例化好的对象注入到所需的MainActivity中

      public class MainActivity extends AppCompatActivity {
          @Inject
          Person person;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              DaggerFoodComponent
                      .builder()
                      .build().injectFood(this);
              Log.d("caesar","------------------------>"+person.eated());
          }
      }
    

2-2用@Module来提供依赖 [用于提供大量的依赖]

生产实例的工厂,他掌握各个需要注入的类的实例化方法,当 Dagger 需要为某个类注入实例时,会到 @Module 注解的类中,查找这个类的实例化方法。当然这一过程是需要通过使用 @Provides 注解的有返回值的方法,来告知 Dagger 的

  • ->Food类(构造方法去除@Inject标注)

      public class Food {
          public Food(){
          
          }
          
          public String getApple(){
                  return "苹果";
          }
      }
    
  • ->Person类(构造方法去除@Inject标注)

      public class Person {
          public Food food;
          
          public Person(Food food){
              this.food = food;
          }
          
          public String eated(){
              return food.getApple();
          }
      }
    
  • ->Module类
    注:
    (1)不能使用@Inject标注构造函数来提供依赖的对象实例:
    (2)接口没有构造函数第三方库的类不能被标注
    (3)构造函数中的参数必须配置

    @Provides标注的方法来提供依赖实例,方法的返回值就是依赖的对象实例
    @Module标注Module类

      @Module
      public class FoodModule {
      
          @Provides
          public Food provideFood(){
              return new Food();
          }
      
          @Provides
          public Person providePerson(Food food){
              return new Person(food);
          }
      }
    
  • ->Component桥梁,注:@Component(modules = {FoodModule.class})把可以提供依赖实例的 Module 告诉 Component

      @Component(modules = {FoodModule.class})
      public interface FoodComponent {
          void injectFood(MainActivity mainActivity);
      }
    

3.作用域scope

  • 1.@ActivityScope 【自定义scope注解】
    保证引用与Activity的生命周期一致
    (举个例子我们可以在这个Activity中持有的所有fragment之间分享一个任何类的单例)
    具体代码:

      @Scope
      @Documented
      @Retention(RUNTIME)
      public @interface ActivityScope {}
    
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,288评论 19 139
  • 部分内容参考自:[Android]使用Dagger 2依赖注入 - DI介绍(翻译)[Android]使用Dagg...
    AItsuki阅读 47,887评论 66 356
  • Dagger2入门详解 参考文章 Dagger官网 Dagger Document API 从零开始的Androi...
    DakerYi阅读 1,203评论 0 7
  • 几个问题 看到Dagger2这个词的时候,相信很多人会有很多的疑问如下:Dagger2如何使用在例子中?Injec...
    codeHoward阅读 7,114评论 4 10
  • 最近在公司的服务器上安装了GitSever,开始从SVN转向到Git了,整理了一些在Git常用的命令。 取得Git...
    上善若水_900e阅读 265评论 0 0