文章目录
Spring 复习
IOC
IOC:
即“控制反转”,是一种设计思想,将创建的对象交由Spring容器管理的生命周期,降低代码耦合性。
IOC主要实现方式:
主要使用依赖注入,Spring中的依赖注入方式有:构造方法注入、setter注入、接口注入。
目的:
帮助我们解耦各种有依赖关系的业务对象之间的绑定关系。
IOC -Provider
虽然不需要我们⾃⼰来做绑定关系,但是这部分的⼯作还是需要有⼈来实现的,所以IoC Provider就担任了这个角色,同时IOC Provider的职责也不仅仅这些,其基础职责如下:
1.业务对象的构建管理
IOC中,业务对象不需要关心所依赖的对象如何构建获取,这部分任务由IOC Provider。
2.业务对象之间的依赖绑定
通过结合之前构建和管理的所有业务对象,以及各个业务对象之间可识别的依赖关系,将这些对象所依赖的对象注⼊绑定。从⽽保证每个业务对象在使⽤的时候,可以出狱就绪状态。
SpringIOC容器
担任了IoC Provider的职责,同时在此基础上,还增加了对Bean⽣命周期的管理、AOP⽀持内容。
从整体来看Spring的IoC容器的作⽤,共分为两部分:
1、容器启动阶段:
以某种⽅式将配置的Bean信息(XML、注解、Java编码)加载如整个Spring应⽤。
2、Bean实例化阶段:
将加载的Bean配置信息组装成应⽤需要的业务对象在此基础上,还充分运⽤了这两个阶段不同的特点,都预留了拓展钩⼦,供我们根据业务场景进⾏⾃定义拓展。
2、一些核心的接口、类:
1. Resource:
⽤于解决 IoC 容器中的内容从哪⾥来的问题,也就是 配置⽂件从哪⾥读取、配置⽂件如何读取 的问题
2. BeanDefinition:
⽤于解决 Bean 的具体定义问题,包括 Bean 的名字是什么、它的类型是什么,它的属性赋予了哪些值或者引⽤,也就是 如何在 IoC 容器中定义⼀个 Bean,使得 IoC 容器可以根据这个定义来⽣成实例的问题。
3. BeanFactoy:
⽤于解决 IoC 容器在 已经获取 Bean 的定义的情况下,如何装配、获取 Bean 实例 的问题。
4. ApplcationContext:
对上述的内容进⾏了功能的封装,解决 根据地址获取 IoC 容器并使⽤ 的问题。
从Bean的⻆度来看,其整个生命周期如下:
Spring只帮我们管理单例Bean的⽣命周期,对于prototype类型的bean,Spring在创建好交给使⽤者使⽤之后,就不在管理其后续的⽣命周期了。
大致整体流程:
- BeanDefinitionReader读取Bean的配置信息(XML等),将读取到的每个Bean的配置信息使⽤
BeanDefinition表示,同时注册到相应的BeanDefinitionRegistry(⼀个map)中 。 - 通过实现了BeanFactoryPostProcessor的类,⾃定义修改BeanDefinition中的信息(如果有的话)
- Bean的实例化:
(1) 采⽤策略化bean的实例, 两种⽅式:cglib、反射
(2) 获取Bean的实例之后,根据BeanDefinition中信息,填充Bean的属性、依赖 - 检测各种Aware接⼝,BeanFactory的、ApplicationContext的等
- 调⽤BeanPostProcessor接⼝的前置处理⽅法,处理符合要求的Bean实例
- 如果实现了InitializingBean接⼝,执⾏对应的afterPropertiesSet()⽅法
- 如果定义了init-method,执⾏对应的⾃定义初始化⽅法
- 调⽤BeanPostProcessor接⼝的前置处理⽅法,处理符合要求的Bean实例
- 使⽤
- 判断Bean的Scope,如果是prototype类型,不再管理
- 如果是单例类型,如果实现了DisposableBean接⼝,执⾏对应的destoy⽅法
- 如果定义了destory-method,执⾏对应的⾃定义销毁⽅法
扩展:
1、BeanFactoryPostProcess
Spring提供的容器扩展机制,允许我们在bean实例化之前修改bean的定义信息即BeanDefinition的信息
2、BeanPostProcessor
也是Spring提供的容器扩展机制,不同于BeanFactoryPostProcessor的是,BeanPostProcessor在bean实例化后
修改bean或替换bean。BeanPostProcessor是后⾯实现AOP的关键。