Andriod Dagger2依赖注入

来源:互联网 发布:telnet 端口 编辑:程序博客网 时间:2024/05/21 18:41

Android Dagger

前言:学习Dagger首先要了解什么是依赖注入(Dependency Injection),为什么需要依赖注入,了解这些以后就可以进入Dagger的学习,现在大部分的项目都在使用Dagger2,我们先就Dagger2进行学习,慢慢了解注入的机制。


what and why(Dependency Injection)

what:

依赖注入(DI):就好比一个人去淘宝买一件衣服,他不需要找到这个做衣服的工厂,也不需要考虑这个衣服是怎么做出来的,只需要在手机上发送一个请求:我需要购买这件衣服。这时,衣服就可以通过快递发到这个人的手里。用程序的话解释就是程序在运行过程中,如果需要调用另一个对象帮助时,不需要在代码中创建被调用者,而是依赖于外部的注入,这就是所谓的依赖注入。

传统方法:
被依赖的对象(被调用者)

public class Book {    public Book(){    }}

需要(依赖)这个对象,需要我们 new 一个对象(调用者)

public class MainActivity extends AppCompatActivity {    Book mBook;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mBook=new Book();    }}

why:

我们之所以需要依赖注入,最重要的就是为了解耦,达到高内聚低耦合的目的,保证代码的健壮性、灵活性和后期可维护性,根据业务需求也可以进行更好的变更。


how:

了解了什么是依赖注入后接下来正式进入主题,开始学习Dagger2。

  • 在Gradle中添加依赖

          compile 'com.google.dagger:dagger:2.11'      annotationProcessor 'com.google.dagger:dagger-compiler:2.11' 
  • 在被依赖的类的构造函数上添加 @Inject 注解,表示我可以提供这个对象,你们可以用。

    public class Xxx {      @Inject      public Xxx(){      } } 
  • 既然有了可以使用的对象,那么就需要有人去用他,这时XxxActivity出现了,表示我需要他,快给我,我是需求者,需要用@Module表示。
 @Module  public class XxxActivity extends AppCompatActivity {          @Inject          Xxx mXxx;          @Override          protected void onCreate(Bundle savedInstanceState) {              super.onCreate(savedInstanceState);              setContentView(R.layout.activity_main);       } }
  • 但是加进去了,需求者和提供者都有了,还没有用啊,该怎么用啊。这时就轮到@Component发挥作用了。然后,Dagger 预编译器会根据这个接口自动加上 Dagger- 前缀,生成一个实现类 DaggerXXXActivityComponent。

    @Componentpublic interface XxxActivityComponent {      void inject(XxxActivity xxxActivity);}
  • 这时提供者、需求者以及传递者都有,最后进行需要手动输入,决定注入的时机。这里就在 onCreate 注入 Xxx 对象,再次修改 XxxActivity,添加DaggerMainActivityComponent.create().inject(this):

    @Modulepublic class XxxActivity extends AppCompatActivity {@InjectXxx mXxx;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    DaggerXxxActivityComponent.create().inject(this);    }}

    如上就是采用 Dagger 2最基本的方式创建并注入。涉及的知识点包括:@Inject 注解、@Module 类 和@Component 接口,下图可以更好的显示其关系。
    这里写图片描述

最基本写完了,接下就是一些Dagger2中比较常用到的注解。

  • @Provides:就是写在Module中我们定义的方法上,表示这个方法提供依赖,并且对外开放,必须写在Module中。
  • @SingleTon:这里说明是单例的对象,对象只会被初始化一次,之后每次都会直接注入相同的对象。
@Modulepublic class MainActivity extends AppCompatActivity {    @Inject    Book mBook;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        DaggerMainActivityComponent.create().inject(this);    }    @Provides    @Singleton    Book providesBook() {        mBook.setId(111);        mBook.setName("xxx");        return mBook;    }}
  • @SubComponent:它是子Component,完全继承父Component的所有依赖注入对象。
  • @Named:其别名,做标记。

总结

这就是Dagger2的一些基本用法,但具体的还得根据自己的项目进行分析研究,还有好多注解没有完善,在日后的学习中不断的完善总结。