在Spring中有两个非常重要的概念,那就是控制反转和依赖注入;控制反转将依赖对象的创建和管理交由Spring容器,而依赖注入则是在控制反转的基础上讲Spring容器管理的依赖对象注入到应用之中;那么控制反转和依赖注入的原理到底是什么呢?一言以蔽之,那就是:
XML文件解析+Java反射技术;
只要我们了解了如何进行XML解析以及Java的反射技术,那么我们完全可以实现自己的具有控制反转和依赖注入功能的小“框架”;下面我将就这个问题进行一下讨论。
首先是XML文件解析,我们都知道目前很多Java开源框架都有自己的xml配置文件,例如Struts、Hibernate和Spring都有各自的配置文件。但是配置文件无论多么复杂,简单来说都和我们在N久以前使用的ini文件差不多,他们的目标只有一个,那就是“配置”;应用程序中需要的一些信息都被保存在配置文件之中,应用程序通过读取配置文件来获得这些信息,唯一不同的是,xml文件由于其标准化、结构化、可扩展性等等优点,逐渐成为目前许多框架的配置文件的标准选项;当然,我们也应该认识到还是有一些其它选择的,比如Hibernate就可以使用properties文件作为配置文件;
那么具体到今天要讨论的Spring框架而言,对于配置文件的选择是xml文件。根据Spring的规范,配置文件的命名是没有特殊要求的,只是在文件的放置位置上有两种选择:类路径下或者操作系统文件目录下,我想这不应该存在任何问题,我们绝大多数情况都应该把配置文件放置在类路径之下,这我就不赘述了。
对于Spring的控制反转和依赖注入来说,唯一使用到的是配置文件中的<bean>标签,通过这个标签,Spring就完成了对象的创建和依赖对象的注入工作;下面我们就来看看它到底是如何实现的;
- 首先对于配置文件中的<bean>节点,在Spring框架中存在一个对应的定义接口,叫做BeanDefinition;这个类定义了获得在<bean>节点中出现的所有属性的方法,例如className、scope等等;
- 对于<bean>节点的子节点property则完成了属性注入的功能;我们都知道,属性注入有三种方式,那就是构造器注入、属性setter方法注入和注解方式注入;
- 如果是setter方式注入,对于类属性xml配置文件也有两种方法,一是使用property节点的ref属性,一是使用property节点的子节点bean进行内部bean配置;如果是对于基本数据类型进行配置,那么要使用property节点的value属性;
搞清楚了以上的配置,那么如果我们希望实现一个自己的“小框架”,那么我们的步骤就是:
- 定义自己的关于bean节点、property节点的pojo类文件;
- 使用诸如DOM4J等开源包将配置文件读入;
- 使用Java的反射技术将配置文件中的信息setter到我们需要的属性中去;这里面我们可能要使用到common-beanutils.jar包;