Android Dagger2的使用

Dagger是用来做依赖注入的,是一个完全静态的,在编译时进行依赖注入的框架,解决了基于反射带来的开发和性能上的问题,

使用场景:在一个对象里去创建另一个对象的实例,这种行为是产生耦合的常见形式,过多的相互依赖会导致

代码难以维护,很容易碰到修改一个地方其他很多地方也都得修改

在需要依赖的勒种不要通过new来创建依赖而是通过方法提供的参数注入进来,

这样我们需要依赖的类和提供依赖的类就实现了方法分隔开了,

dagger2是一个依赖注入的框架,在编译期间自动生成代码,负责依赖对象的创建,

用dagger2提供依赖有什么好处:为了进一步解耦和方便测试,我们会使用依赖注入的方式构建对象,

不用new来创建对象。在mvp中,presenter层会持有view和model层的依赖,

依赖注入主要用于解耦,通过依赖注入创建对象,不在使用new来创建对象。

依赖注入的目的是,给你提供一个依赖对象

Android Dagger2的使用_第1张图片

@Inject

ApiService apiService;



protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);


    setContentView(R.layout.activity_main);

    //主要两个问题:

    //1)自定义Module需要传递上下文怎么办

    //2)自定义module中的方法中需要参数对象怎么处理

    //Dagger会自动创建这个类,以Dagger开头+UserComponent,编译时注入,按ctrl+F9编译即可

    //DaggerUserComponnent.create().inject(this);

    //userMagager.register();

    //Dagger的关系非常简单,MainActivity中需要对象,那么就在Module中提供对象,而他们之间的桥梁就是componnent

    //自定义类Module的构造方法中需要传入一个上下文对象,那么在MainActivity中就需要传递进去

    //使用下面的这种方式进行参数传递:this就是上下文



    /**

     * 模块化开发:自定义module之间相互include compent之间相互依赖

     * 通过@Named @Qualifier:区别不同对象的实例

     * 同一类可能要创建两个对象,处理不同的业务逻辑

     * 通过类型进行注入,根据@Inject标记的变量类型ApiSercice,在Module中寻找返回值

     * 为ApiService的方法进行调用,但是如果Module中由多个方法,他们的返回值都为ApiService,那么就需要使用@Named注解用于区别

     */

    DaggerUserComponent.builder().userModule( new UserModule(this)).build().inject(this);

   // DaggerUserComponent.builder().

   // DaggerUserComponent.create().inject(this);

    apiService.register();

/**

 * Created by admin on 2018/3/16.

 * 自定义类用于提供依赖

 * 自定义module中的方法要以provide开头

 * 通过构造方法传递Context

 * 如果自定义module需要传参数,需要在Activity使用build进行

 *

 * 如果自定义类module中的方法需要一个对象参数,怎么处理,需要一个方法去提供这个对象,

 * 1)在类的构造方法上添加@Inject注解

 * 2)自己写一个方法去提供参数对象

 */

@Module

public class UserModule {

    //在Module中传递上下文对象

    private Context mContext;

    public UserModule(Context context){

        this.mContext = context;

    }

    @Provides

    ApiService provideApiService(){

        return new ApiService();

    }

    @Provides

    UserStore provideUserStore(){

        return new UserStore();

    }

    //如果自定义Module中的方法需要对象参数,怎么处理

    //1)通过Module中的方法进行提供比如provideUserStoe()

    //2)通过类的构造函数进行提供对象,注释掉上面的provideUserStore()方法

    //3)代码执行顺序:创建参数对象的方法先执行比如构造

    @Provides

    UserManager1 provideUserManager(UserStore userStore){

        return new UserManager1(userStore);

    }

}

import dagger.Component;


/**

 * Created by admin on 2018/3/16.

 * 连机器,桥梁

 */

@Component(modules = {UserModule.class,HttpModule.class})

public interface UserComponent {

    //当前只能写MainActivity不能写Activity要不然会出现空指针

    void inject(MainActivity activity);

}


你可能感兴趣的:(android)