dagger2简单使用

来源:互联网 发布:朝鲜生活 知乎 编辑:程序博客网 时间:2024/05/18 06:27

最近用dagger2感觉很不错,比如某个对象需要在很多地方用到只需要一个注解就行。还有人家是用来解耦的代码越多优势越明显。

使用初步

  1. https://github.com/google/dagger这里有它的依赖方式。
  2. 首先要知道一些事情,其实dagger2内部与我们平常使用类对象是一致的,同样是new得到的,只不过在我们看来变成了注解。

进入正题

基本使用需要用到的注解有:@Inject 、@Component 、@Module 、@Provides;

开始使用:

一 、我们需要哪个类的对象就需要在这个类的构造器上加入这个注解,这样dagger就可以new对象了。例如我需要在GetMyDagger中使用MyDagger对象,那么就需要在MyDagger的构造器上写上@Inject;

public class MyDagger {    @Inject    public MyDagger() {    }    public void method(){        Log.i("dagger","------------dagger--------------");    }}

二、第一步中我们有了类的构造器,相当于我们有了类的对象,下面将要用的@Component ,有了对象产生的地方 ,与需要对象的地方@Component 的做作用就是将产生的对象送到需要的地方,当然它也有自己写法如下:

//一般这个接口名是 需要对象的类类名+Component@Component public interface GetMyDaggerComponent {    //inject 这个方法名随意写    void inject(GetMyDagger getMyDagger);}

三、到此我们需要Make Project(编译一下),编译完成会在 You Project ->build ->generated ->source ->apt ->debug ->全包名 ->dagger 路径下生成DaggerGetMyDaggerComponent这个类,这个类实现了上面的GetMyDaggerComponent 接口;

四、在需要使用类对象的地方直接声明再加上@Inject,dagger2会帮我们将对象注入进来;例如下面只要MyDagger构造器上加了@Inject注解;

public class GetMyDagger extends Activity{    @Inject    MyDagger myDagger;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        //这一步很关键是将 MyDagger类和GetMyDagger建立了联系        //这一步之前myDagger 依然是null,这一步之后才可以使用        DaggerGetMyDaggerComponent.create().inject(this);       //这里将会有一个log被打印 在MyDagger的method方法中的那个        myDagger.method();    }}

五、实际使用构造器中一般都需要传参数,那么下面就说说@Module和@Provides;
将上面的代码改一下如下:

public class MyDagger {    @Inject    public MyDagger(Param param) {    }    public void method(){        Log.i("dagger","------------dagger--------------");    }}

这次new MyDagger需要需要参数了,Dagger不会凭空产生一个对象,当然需要我们告诉它这个参数从哪来:

@Modulepublic class ParamProvider{    @Provides    public Param provideParam(){        retuen new Param();    }   }

@Module :表示这个类是提供构造器所需参数的
@Provides:我们在提供Param对象的方法上面加入这个注解,那么MyDagger类构造器中所需的Param参数将会被传入值
六、再说一点@Qualifier 我可以用这个注解自定义限定符 如下

@Qualifier public @interface ApplicationConext{}

一个自定义注解写好了,改一下ParamProvider这个类 ,这次provideParam方法需要传入Context ,如果我们只是需要Application的Context而不是某个Activity的Context,那么就用上面写的那个自定义注解:

@Modulepublic class ParamProvider{    //用@ApplicationConext注解Context之后 context只能是prvideApplicationConext()提供的context;    @Provides    public Param provideParam(@ApplicationConext Context context){        retuen new Param();    }    @ApplicationConext    public Context prvideApplicationConext(){        //假设我们在MyApplication类中有一个持有静态context        return MyApplication.context;    }   }

最后

其实Dagger还有很多功能比如@Scope,@Module调用另一个@Module
@Component调用另一个@Component,对于解耦很强,清晰明了的注解;


可能有很多臆断的地方,望指正,谢谢;

原创粉丝点击