正如大家所知道,spring 常用的两个子项目为IOC,AOP.
所谓的IOC,最主要是完成了对象的创建和依赖的管理注入等等。把控制权从具体业务对象手中转交到平台或者框架中(spring的配置文件中)。如:现有的登陆接口中,有一个login().现在登陆为 账号/密码。当项目上线后,客户改为用 身份证/密码 登陆。 账号/密码 登陆模式后期可能还会用到。在这种情况下,一种简单的实现,就是新建一个类实现 登陆接口。重写login().然后再配置文件中,只需要修改原有登陆接口实现类的名称就可以了。这种就很方便。开发人员只要实现相应的登陆逻辑,并修改配置就行。
下来,我们来看看spring IOC的 初始化过程,来了解spring IOC的实现原理.
spring IOC 容器的初始化分为三步:
a. 对 spring 配置文件的定位。
b. 对配置文件的载入。
c. 向IOC容器中 注册 所有的 bean对象。
在spring IOC的初始化过程中。设计到几个主要的接口:
Resource : 完成对 spring 配置文件的定位。返回 配置文件的 File 对象.
BeanDefinition :声明 spring 配置文件中的 bean 对象 在 容器中 数据结构形式。描述一个bean对象的基本数据结构。
BeanDefinitionReader : 将配置文件 转为 BeanDefinition 的操作类 接口。
BeanFactory,ApplicationContext 这两个接口大家应该都很熟悉 不再说明。
1. 通过 Resource 接口 来实现对配置文件的定位。
IOC容器 会根据 web.xml 配置文件时 前缀的不同,分别调用Resource 接口不容的实现类 来完成对资源文件的查找.
如: 前缀为:classpath: 从classpath路径查找。为:file: 从文件系统同查找。http:作为 URL 加载。
定位到文件的位置后,将配置文件的 InputStreamSource对象取得传入IOC中 ,对象取得传入IOC中. 想了解具体过程 可看源码 XmlBeanDefinitionReader /370 行。
2.完成对配置文件的定位后,下来就是解析XML配置过程,并将每个bean转为 IOC 容器中BeanDefinition 数据对象 。
在解析的过程中 ,经过一次EncodingResource 对象,实现对xml 解码,默认采用的是utf-8 格式解码. 解析XML过程中,采用JDK自带的解析技术完成解析。 想了解具体的解析过程的话,可看 源码中的 BeanDefinitionParserDelegate 类。个人感觉 解析XML 还是用流行的dom4j方便 哈。
3.将 解析后的 BeanDefinition 都注册容器中。也就是一个HashMap.
可看源码 DefaultListableBeanFactory 中的 registerBeanDefinition().