Dagger2 -依赖注入 使用简单Demo

介绍:

1.依赖注入:面向对象编程的一种设计模式,目的是降低类之间的依赖耦合。

2.问题场景:
    a.在类中直接创建另一个类的实例,违背了单一原则。
    b.在构造函数中传入另一个类的实例作为参数,违背了开闭原则。  

3.注入方式:
    a.接口注入
    b.通过set方法注入
    c.通过构造方法注入
    d.通过java 注解(Dragger实现方式)

依赖

//Dagger
compile 'com.google.dagger:dagger:2.4'
//java注解
annotationProcessor 'com.google.dagger:dagger-compiler:2.4'

使用方式:

示例区别:构造函数是否添加@Inject

一:实例化对象,构造函数无参数(无module)

涉及类:DaggerActivity、DaggerActivityComponent、DaggerClass

说明:
  1.非private 对象,通过@Inject 标注
  2.构造函数添加@Inject
  3.添加component,添加inject()方法,标注注入点
    public class DaggerActivity extends Activity {

      @Inject
      protected DaggerClass mDaggerClass;

      @Override
      public void onCreate(@Nullable Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
        
          DaggerDaggerActivityComponent.builder().build().inject(this);
          //可直接调用~~~
          mDaggerClass.ObjectTest();
      }
    }

    @Component
    public interface DaggerActivityComponent {
        void inject(DaggerActivity view);

    }

    public class DaggerClass {
        @Inject
        public DaggerClass() {
        }

        public void ObjectTest() {
            Log.i("lyw", "ObjectTest");
        }
    }

二:实例化对象,构造函数无参数(使用module)

使用场景:第三方库对象的提供 (没有源码的情况下,无法为构造函数添加@Inject)

涉及类:DaggerActivity、DaggerActivityComponent、DaggerClass、DaggerModule

说明
  1.去除DaggerClass 构造函数 注解
  2.添加DaggerModule
  3.DaggerActivityComponent 配置DaggerModule 类
  4.DaggerActivity 中添加关联DaggerModule
    public class DaggerActivity extends Activity {

        @Inject
        protected DaggerClass mDaggerClass;

        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            DaggerDaggerActivityComponent.builder().daggerModule(new DaggerModule()).build().inject(this);
            //可直接调用~~~
            mDaggerClass.ObjectTest();

        }
    }
    
    @Component(modules = {DaggerModule.class})
    public interface DaggerActivityComponent {

        void inject(DaggerActivity view);

    }
    
    
    public class DaggerClass {


        public DaggerClass() {

        }

        public void ObjectTest() {
            Log.i("lyw", "ObjectTest");
        }

    }
    

    @Module
    public class DaggerModule {

        @Provides
        public DaggerClass provideDaggerClass() {
            return new DaggerClass();
        }

    }

三:实例化对象,构造函数有相同类型参数(使用module)

第二种写法升级版

涉及类:DaggerActivity、DaggerActivityComponent、DaggerClass、DaggerModule

说明
  1.修改DaggerClass
  2.修改DaggerModule
    public class DaggerActivity extends Activity {

        @Inject
        protected DaggerClass mDaggerClass;

        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            DaggerDaggerActivityComponent.builder().daggerModule(new DaggerModule("lyw", "28")).build().inject(this);
            //可直接调用~~~
            mDaggerClass.ObjectTest();

        }
    }  
    
    @Component(modules = {DaggerModule.class})
    public interface DaggerActivityComponent {

        void inject(DaggerActivity view);

    }
    
    
    public class DaggerClass {

        private String mName, mAge;

        public DaggerClass(String name, String age) {
            mName = name;
            mAge = age;
        }

        public void ObjectTest() {
            Log.i("lyw", "mName:" + mName + ",mAge:" + mAge);
        }

    }

    @Module
    public class DaggerModule {

        private String mTag1;
        private String mTag2;

        public DaggerModule(String tag1, String tag2) {
            mTag1 = tag1;
            mTag2 = tag2;
        }

        @Provides
        public DaggerClass provideDaggerClass() {
            return new DaggerClass(mTag1, mTag2);
        }

    }

四:实例化对象,构造函数有相同类型参数(使用module--使用限定符,高逼格写法)

第一种写法升级版

涉及类:DaggerActivity、DaggerActivityComponent、DaggerClass、DaggerModule、DaggerUserInfo

说明
  1.增加注解类:DaggerUserInfo
  2.修改DaggerClass
  3.修改DaggerModule
    @Retention(RUNTIME)
    @Documented
    @Qualifier
    public @interface DaggerUserInfo {
        String value() default "";
    }
          
    public class DaggerClass {

        private String mName, mAge;

        @Inject
        public DaggerClass(@DaggerUserInfo("name") String name, @DaggerUserInfo("age") String age) {
            mName = name;
            mAge = age;
        }

        public void ObjectTest() {
            Log.i("lyw", "mName:" + mName + ",mAge:" + mAge);
        }

    }

    @Module
    public class DaggerModule {

        private String mName;
        private String mAge;

        public DaggerModule(String name, String age) {
            mName = name;
            mAge = age;
        }

        @Provides
        @DaggerUserInfo("name")
        public String provideName() {
            return mName;
        }

        @DaggerUserInfo("age")
        @Provides
        public String provideAge() {
            return mAge;
        }
        
    }

其实,第四种装逼写法,可以使用@Name(""),只不过,@Name 默认是String,按需定制吧。

你可能感兴趣的:(Dagger2 -依赖注入 使用简单Demo)