Spring的控制反转(IOC),简单来说,就是运用反射技术,
- 动态生成对象
- 将配置文件中的属性值注入到对象中
具体的流程为,
- Resource定位
- BeanDefinition的载入和解析
- BeanDefinition的注册
- 依赖注入
下面详细谈一下各个流程,
Resource定位
Resource资源就是xml配置文件,对xml的抽象,包含了BeanDefinition的定义信息。由于配置信息来源的多样化,所以Resource也有不同的抽象实现,
- ClassPathResource可用来获取类路径下的资源文件。
- FileSystemResource可用来获取文件系统里面的资源。
- UrlResource可用来代表URL对应的资源,它对URL做了一个简单的封装。通过给定一个URL地址,我们就能构建一个UrlResource。
- ByteArrayResource是针对于字节数组封装的资源,它的构建需要一个字节数组。
- ServletContextResource是针对于ServletContext封装的资源,用于访问ServletContext环境下的资源。
- InputStreamResource是针对于输入流封装的资源,它的构建需要一个输入流。
获取到Resource后,需要将Resource中对bean的定义转化为BeanDefinition。
BeanDefinition是对bean的描述,有属性值,构造参数和具体实现提供的其他信息。
过程包括,
- 读取配置文件
- 封装成BeanDefinition对象
BeanDefinition的注册
构建完数据表示后,需要对这些数据进行注册。具体是调用BeanDefinitionRegistry接口的实现类,完成向容器的注册,就是存入一个HashMap中。
依赖注入
运用反射机制,在getBean()方法调用时,生成对应的bean对象。实例化方法分为,
- JVM反射
- CGLIB