并且如果后来它的构造函数或者是具体实现类发生了改变,那都与你现在所写的代码无关,它们的改变不会迫害你去更新现有的代码.
而在传统的软件开发过程中,我们通常要在一些控制器中去主动依赖一些对象,如果这些对象的依赖方式在未来频繁地发生改变,那我们的程序是无法经受住考验的.
这就是所谓控制反转,它将获得依赖对象的方式反转了.
2.常见的依赖注入框架
- 在服务器后端,一般使用
Spring
框架进行依赖注入。 - 在
Android
上,一般使用Dagger
系列进行依赖注入。
3.实现自己的依赖注入框架
有些同学可能知道Dagger
实现了Java的依赖注入标准(JSR-330
),这个标准使用的有些注解确实让人有点摸不着头脑,而且Dagger
使用的门槛也较高,估计应该有不少人看了许多《Dagger
完全入门》之类的文章,然而到最后还是没搞懂Dagger
到底是怎么一回事.
所以我就想,能不能搞一个稍微亲民一点的依赖注入框架让我直接先能用上.我不是大神,所以它不一定要实现JSR-330
,也不一定使用注解处理器来追求极致的效率,但它必须要好理解,里面的概念必须是常见的.
在参考了服务器上Spring
框架的依赖注入后,我决定使用xml
作为依赖注入的配置文件,本来想上Github
看看有没有现成的轮子可以让我"抄抄"之类的,谁知道逛了一圈下来之后才发现Android
开发者除了Dagger
和Dagger2
根本没得选,这更加坚定了我造轮子的信心.
使用xml
是有优势的,xml
是最常见的配置文件,它能更明确的表达依赖关系。所以就有了Liteproj
这个库与Dagger
不同,Liteproj
不使用Java
来描述对象间的依赖关系,而是像Spring
一样使用xml
.
Liteproj
目前的实现中也没有使用注解处理器而是使用了反射,因为Liteproj
追求的并非是极致的性能,而是便于理解和上手以及轻量化和易用性,它的诞生并不是为了取代Dagger2
或者其他的一些依赖注入工具,而是在它们所没有涉及的领域做一个补全。
客官请移步 : Liteproj
4.xml解析
既然选择了xml
,那么就要需要解决解析xml
的问题.
经过考虑之后最终选择了dom4j作为xml
解析依赖库.其实Android
本身自带了xml
的解析器,而且它的效率也不错,那我为什么还要使用dom4j
呢,那当然是因为它好用啊。Android
自带的xml
解析器是基于事件驱动的,而dom4j
提供了面向对象的xml
操作接口,我觉得这会给我的编码带来极大的便利,可以降低开发难度.
比如dom4j
中的Document->Element->Attribute
等抽象,非常好地描述了xml
的结构,你甚至无需看它的文档就能简单上手,这可比XmlPullParser
中定义的一堆常量和事件好理解多了.
而且dom4j
也是老牌的xml
解析库,大名鼎鼎的hibernate
也使用它来解析xml
配置文件.
解析xml
,首先要解决assets
文件夹下的xml
文件解析问题,这个还算比较好处理,使用AssetManager
获取Java
标准流,然后把他交给dom4j
解析就可以了。
但是想要解析res/xml
文件夹下的xml
就比较麻烦了,熟悉安卓的人应该都知道,打包后的APK
,res
文件夹下除了raw
文件夹会原样保留,其他文件夹里的内容都会被编译压缩,为了解析res/xml
下的<