什么是依赖注入?

首先了解下什么是控制反转?控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。而控制反转有两种,最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。(from wikipedia)

依赖注入的“依赖”就是面向对象中类与类之间的依赖关系。如下面,Animal与Tiger就是依赖关系:

1
2
3
4
5
6
7
8
class Animal{
Tiger tiger;
//……
Animal(){
tiger=new Tiger();
}
}

这是一种直接在构造器中初始化的依赖,当然可以通过参数传递的形式,达到依赖注入(通过外部来传入依赖的方式):

1
2
3
4
5
6
7
8
class Animal{
Tiger tiger;
//……
Animal(Tiger tiger){
this.tiger=tiger;
}
}

而Java中依赖注入一般使用注解形式,通过在定义的字段前面加注解,如@Inject即可实现自动注入,当然这需要依赖注入的框架来实现。

1
2
3
4
5
6
7
class Animal{
@Inject
Tiger tiger;
//……
Animal(Tiger tiger){
}
}

Java中流行的依赖注入框架有Google Guice、Spring 等,而在 Android 上比较流行的有Dagger、ButterKnife、RoboGuice,还有Android自身的Annotaions等。

见大神Trinea的详细解释

ButterKnife是大神jakewharton的作品,它可以说是Dagger的简洁版吧,比较侧重如View的依赖注入,如果只是想少使用findViewById的话,感觉使用ButterKnife就够了。目前个人刚开始接触依赖注入,所以也在逐渐了解吧。

更详细的学习资料:
Butterknife 的使用
Dagger 源码解析
Android 与Inject(依赖注入)的不解之缘(对比ButterKnife和Dagger的使用)
Android Annotations浅析