1. 什么是IOC
IOC:控制反转,也可以被称为依赖注入
谁控制谁?
- 在以前,对象的创建和销毁都是由用户控制的
- 用了 IOC 之后,对象的创建和销毁就都交给容器来控制了
什么是反转?
- 正转是对象去找实例
- 反转时让实例去找对象
谁依赖谁?
在Spring项目中,将对象理解为Bean,也可以叫Bean对象,这个bean和容器之间有个依赖关系,bean对象的创建时依赖容器的。就好像孩子依赖父母一样
谁注入谁?
通过容器注入了bean对象,而且这个过程是自动化的,也就是说容器会自动找到和bean对象匹配的类型注入到对象中
2. Spring ioc的加载过程
-
首先,通过BeanDefinitionReader读取指定的配置文件生成bean的定义信息,然后到完整的bean定义信息(BeanDefinition对象)注意这里只是存储bean的定义信息,还没有实例化对象
-
在 BeanDefinition 和完整 BeanDefintion 中间通过一个后置增强器,可以对bean的定义信息进行统一修改,只需要实现 BeanFactoryPostProcessor接口即可
package com.Spring.Boot.init; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.stereotype.Component; /** * 扩展方法--后置增强器(可修改bean的定义信息) */ @Component public class ExtBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { // BeanDefinition studentService = beanFactory.getBeanDefinition("studentService"); System.out.println("扩展方法--可进行修改beanDefinition的定义信息"); } } -
得到完整BeanDefinition之后就可以进行创建对象了,创建对象这整个过程被称为bean的声明周期,也就是实例到销毁的过程,请看下面
3.Bean的生命周期
生命周期:从对象的创建到使用到销毁的过程,如下图:
1. 实例化:
- 在堆空间中申请空间,对象的属性值一般是默认值,反射创建对象的过程——createBeanInstance方法
2.初始化:
-
属性赋值:
- 自定义属性赋值—— populateBean 进行set方法完成赋值操作
-
检查aware相关接口并设置依赖:容器对象属性赋值,就是需要容器资源赋给Bean,例如BeanFactory ——在 invokeAwareMethods 判断实现
执行到此步骤之后,对象的创建和属性都完成了,那么此时对象是否可以直接拿来使用了?理论上是可以的,但是Spring要考虑扩展性
-
如关联BeanPostProcessor:执行前置处理方法:可以对Bean进行预处理工作,比如Bean的属性进行修改或者校验等
-
执行初始化方法:如果Bean在Spring配置文件中配置了init-method属性会调用其配置的初始化方法 —— invokeInitMethods
- invokeInitMethods 中实现初始化,此方法还有另一个功能: 检测bean是否实现了InitializingBean接口 ,如果实现了此接口,可以调用afterPropertiesSet方法(也可以自行扩展)
-
如关联BeanPostProcessor:执行后置处理方法:例如:Bean对象的扩展实现:AOP ->进行动态代理
-
可知:AOP是IOC整体流程中的一个扩展点
-
3. 使用:
- 得到实例对象,直接使用实例对象
4.销毁:
- 当Bean不在需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,或者根据spring配置的destroy-method属性,调用实现的destroy()方法