目录
什么是IOC
控制反转,由spring容器管理bean的整个生命周期。通过反射实现对其他对象的控制,包括初始化、创建、销毁等,避免手动创建对象的过程,降低类之间的耦合度。
什么是aop
面向切面编程,将公共逻辑封装成切面,跟业务代码进行分离,减少系统重复代码和降低代码耦合度。
什么是依赖注入
在spring创建对象的过程中,把对象依赖的属性注入到对象中,注入的方法主要由构造器注入和属性注入。
java
public class Service {
private final Dependency dependency;
// 构造器注入
public Service(Dependency dependency) {
this.dependency = dependency;
}
// ...
}
public class Service {
private Dependency dependency;
// 属性注入
public void setDependency(Dependency dependency) {
this.dependency = dependency;
}
// ...
}
自动配置原理
- 在主启动类上添加了@SpringBootApplication注解,这个注解组合了@EnableAutoConfiguration注解
- 在@EnableAutoConfiguration组合了@Import注解,导入了AutoConfigurationImportSelector类
- AutoConfigurationImportSelector这个类实现了ImportSelector中的selectImports方法,通过这个方法会加载META-INF/spring.factories(2.7版本,最新版是import文件)
- 在这个文件里面有很多自动配置类,在读取到全类名后会结合Conditional注解解析注册条件,满足条件的就注入到IOC容器中。
SpringBoot启动流程
spring启动主要是加载各种配置信息,初始化IOC容器并返回
- 首先,当我们在启动类执行SPringApplication run的代码会做两个事情
- 创建SpringApplication对象;
- 执行run方法。
- 其次,在创建SpringApplication对象的时候,在它的构造方法内部主要做3个事情。
- 确认web应用类型,servlet类型,这种类型会自动启动一个tomcat
- 从spring.factories配置文件中,加载默认的ApplicationContextInitializer和ApplicationListener
- 记录当前应用的著启动类,将来做包扫描使用
- 最后,对象创建好后,调用run方法,在里面主要做4个事情
- 准备Enviroment对象,它里面会封装一些当前应用的运行环境参数,比如环境变量等等
- 实例化容器
- 容器创建好后,会为容器做一些准备工作,为容器设置Environment、BeanFactoryPostProcessor后置处理器,加载主类对应的Definition
- 刷新容器,在这里创建Bean实例
- 总结来说,其实SpringBoot启动的时候核心两步,创建SpringApplication对象,调用run方法,在run方法中实例化容器,创建容器中需要的Bean实例,最终返回
IOC容器初始化流程
IOC容器的初始化,核心工作是在AbstractApplicationContext.refresh方法中完成的
在refresh中主要做了这几件事:
- 准备BeanFactory,在这一块需要给BeanFacory设置很多属性,比如类加载器、Environment等
- 执行BeanFactory后置处理器,这一阶段会扫描要放入容器中Bean信息,得到对应的BeanDefinition
- 注册BeanPostProcesor,
- 启动tomcat
- 实例化容器中单例Bean
总结一下,在IOC容器初始化的过程中,首先准备并执行BeanFactory后置处理器,其次得注册Bean后置处理器,并启动tomcat,最后需要借助BeanFactory完成Bean的实例化。
bean的生命周期
bean的生命周期总共有4个阶段,分别是创建对象,初始化对象,使用对象以及销毁对象,而这些工作都是交给Bean工厂的doCreateBean方法完成
- 创建对象阶段,先调用构造方法实例化对象,对象创建完成后,填充对象的内容,也就是依赖注入
- 对象创建完毕,需要进行初始化,初始化之前执行有@PostConstruct注解的方法,初始化的时候执行InitializingBean接口
- 完成初始化后,可以调用Bean
- 容器销毁前,先销毁对象,此时执行DisposableBean接口的回调,如何Bean中有标注@PreDestroy接口的函数,会先执行它
总结一下,Bean的生命周期主要有四个阶段,其中初始化对象和销毁对象可以扩展一些执行代码
SpringMVC执行流程
使用了SpringMVC,所有的请求都需要经过DispatcherServlet前端控制器,这个类提供了一个doDispatch方法,有关请求处理和结果响应的所有流程都会在这个方法中完成
- 用户发起向服务器发起HTTP请求,被前端控制器DispatcherServlet接收
- DispatcherServlet通过HandlerMapping获取到对应HandlerAdapter处理器适配器
- 拦截器preHandler方法
- 通过HandlerAdapter处理器适配器执行目标Controller方法,在这个过程中通过参数解析器和结果处理器分别解析浏览器提交的数据以及处理Controller方法返回结果
- 执行拦截器postHandle方法
- 最后处理响应,如果这个过程有异常抛出,那么执行异常的逻辑,并通过试图解析器ViewResolver解析试图,再渲染试图,最后执行拦截器afterCompletion