基础知识
IOC
| 全称 | Inversion Of Control,控制反转 |
|---|---|
| 本质 | 一种编程思想 |
| 定义 | 将对象自身创建依赖关系的控制,反转为由外部容器进行管理和维护。这意味着不再由对象自己来创建和管理它们的依赖,而是由外部容器负责实例化这些依赖,并将其注入到对象中。 |
| 作用 | 减少代码之间的耦合,提高组件的可维护性和重用性 |
DI
| 全称 | Dependency Injection,依赖注入 |
|---|---|
| 本质 | 一种设计模式 |
| 定义 | 对象创建时,其所有依赖的对象不再由对象本身创建,而是由外部容器注入。依赖注入有以下几种实现方式:1. 构造器注入:通过构造函数,将依赖对象作为参数传入;2. Setter注入:通过setter方法,将依赖对象作为参数传入;3. 接口注入:通过接口来定义规范,依赖对象必须实现改接口,由外部容器负责注入;4. 注解注入:通过注解标注的方式,由外部容器负责注入 |
| 作用 | 降低对象之间的耦合性,提升代码的灵活性的可维护性 |
Spring IOC、IOC、DI之间的关系
Spring IOC是对IOC这一理念的实践,借助DI的方式将依赖设置给对象。
Spring IOC概述
Spring IOC本质上是一个管理对象生命周期的容器,负责对象的实例化、初始化、依赖注入、销毁。它的好处是:
- 隐藏了对象的创建以及依赖注入过程,让用户可以将重点放在实际的业务开发上,达到简化开发效果。
- 降低了对象之间的耦合性,方便测试。
Spring IOC容器主要组成部分
Bean
Bean是Spring IOC容器管理的基础单元,每一个被容器管理的对象都是一个Bean。Bean是一个抽象的概念,源码中实际上并不存在Bean这个类。
BeanDefinition接口
BeanDefinition意为Bean定义,它描述了Bean的各种属性及其依赖关系,Spring IOC容器通过BeanDefinition来管理Bean的生命周期,一个BeanDefinition就对应一种Bean。相对于Bean来说,BeanDefinition是一个具象的概念,源码中实际存在BeanDefinition接口及其实现类。
- get\setBeanClassName,定义Bean的Class名称
- get\setScope(),定义Bean的作用域
- get\setDependsOn(),定义Bean的依赖关系
- get\setInitMethodName(),定义Bean的初始化方法名
- get\setDestoryMethodName(),定义Bean的销毁方名
BeanFactory接口
BeanFactory接口是Spring IOC容器的核心接口,它定义了从容器中获取Bean、获取Bean类型、判断Bean是否存在等基础功能。
- getBean方法,可根据Bean名字、Bean的类型从容器获取Bean
- getType方法,可根据Bean名字,获取Bean类型
- isSingleton方法,可根据Bean名字判断Bean是否为Singleton(单例模式)
- isPrototype方法,可根据Bean名字判断Bea是否为prototype(原型模式)
- 定义了根据Bean名字判断Bean是否存在的containBean()
ApplicationContext接口
ApplicationContext接口是BeanFactory接口的高级形式。由于它继承自BeanFactory接口,所以支持从容器中获取Bean等基础功能;又因为它继承了ResourceLoader接口,使其具备了获取Resource(资源)的能力。
- 继承自BeanFactory的子接口(HierarchicalBeanFacotry,ListableBeanFactory),具备IOC容器基础能力
- 继承了ApplicationEventPublisher接口,具备消息发布的能力
- 继承了MessageSource接口,具备获取message的能力,支持国际化和参数化
- 继承自ResourceLoader的子接口(ResourcePatternResolver),具备获取资源(Resource)的能力
Resource
Resouce是承载Bean的资源,资源中定义的Bean都会加载到Spring IOC容器中。定义资源的方式一般分为以下:
- xml文件(使用)
- @Component注解修饰的类(使用@Service、@Reposity、@Resource、@Controller)
- 配置类(使用@Configuration以及@Bean)
ResourceLoader
ResouceLoader是资源加载器,它定义了获取Reource的接口方法。实现该接口将具备获取Resouce的能力。
BeanDefinitionReader
BeanDefinitionReader是BeanDefinion的读取接口,它的实现类具备从Resource(xml的方式定义的)中读取BeanDefinition能力,并借助BeanDefinitionRegistry接口,可将BeanDefinition注册到Spring IOC容器中。
ClassPathBeanDefinitionScanner
ClassPathBeanDefinitionScanner是BeanDefinion的扫描器,它具备从Resource(从包名中扫描被 @Component、@Repository, @Service, @Controller注解标注的)中读取BeanDefinition的能力,并借助BeanDefinitionRegistry接口,可将BeanDefinition注册到Spring IOC容器的能力。
BeanDefinitionRegistry
BeanDefinitionRegistry接口是BeanDefinition注册器,它定义了往Spring IOC容器中注册、注销、获取BeanDefinition等接口方法。它的实现类具备操作Spring IOC容器中BeanDefinition的能力。
BeanPostProcessor
BeanPostProcessor接口是Bean后置处理器,当Spring IOC启动过程中,实现BeanPostProcessor接口的对象将在Bean初始化过程中被Spring IOC容器调用。
- 在Bean初始化之前,被Spring IOC容器调用postProcessBeforeInitialization()
- 在Bean初始化之后,被Spring IOC容器调用postProcessAfterInitialization()
Spring IOC容器各组成部分之间的关系
最后
你的点赞是对我最大的鼓励。近期将更新Spring IOC源码阅读--Spring IOC容器的初始化过程。
参考
- juejin.cn/post/723780…
- 《Spring 技术内幕》