Andriod Dagger2依赖注入

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。

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

    @Module
    public class XxxActivity extends AppCompatActivity {
    
    @Inject
    Xxx mXxx;
    @Override
    protected 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:这里说明是单例的对象,对象只会被初始化一次,之后每次都会直接注入相同的对象。
@Module
public 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的一些基本用法,但具体的还得根据自己的项目进行分析研究,还有好多注解没有完善,在日后的学习中不断的完善总结。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值