springboot常见题目

目录

什么是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;
    }

    // ...
}

自动配置原理

  1. 在主启动类上添加了@SpringBootApplication注解,这个注解组合了@EnableAutoConfiguration注解
  2. 在@EnableAutoConfiguration组合了@Import注解,导入了AutoConfigurationImportSelector类
  3. AutoConfigurationImportSelector这个类实现了ImportSelector中的selectImports方法,通过这个方法会加载META-INF/spring.factories(2.7版本,最新版是import文件)
  4. 在这个文件里面有很多自动配置类,在读取到全类名后会结合Conditional注解解析注册条件,满足条件的就注入到IOC容器中。

SpringBoot启动流程

spring启动主要是加载各种配置信息,初始化IOC容器并返回

  • 首先,当我们在启动类执行SPringApplication run的代码会做两个事情
  1. 创建SpringApplication对象;
  2. 执行run方法。
  • 其次,在创建SpringApplication对象的时候,在它的构造方法内部主要做3个事情。
  1. 确认web应用类型,servlet类型,这种类型会自动启动一个tomcat
  2. 从spring.factories配置文件中,加载默认的ApplicationContextInitializer和ApplicationListener
  3. 记录当前应用的著启动类,将来做包扫描使用
  • 最后,对象创建好后,调用run方法,在里面主要做4个事情
  1. 准备Enviroment对象,它里面会封装一些当前应用的运行环境参数,比如环境变量等等
  2. 实例化容器
  3. 容器创建好后,会为容器做一些准备工作,为容器设置Environment、BeanFactoryPostProcessor后置处理器,加载主类对应的Definition
  4. 刷新容器,在这里创建Bean实例
  • 总结来说,其实SpringBoot启动的时候核心两步,创建SpringApplication对象,调用run方法,在run方法中实例化容器,创建容器中需要的Bean实例,最终返回

IOC容器初始化流程

IOC容器的初始化,核心工作是在AbstractApplicationContext.refresh方法中完成的

在refresh中主要做了这几件事:

  1. 准备BeanFactory,在这一块需要给BeanFacory设置很多属性,比如类加载器、Environment等
  2. 执行BeanFactory后置处理器,这一阶段会扫描要放入容器中Bean信息,得到对应的BeanDefinition
  3. 注册BeanPostProcesor,
  4. 启动tomcat
  5. 实例化容器中单例Bean

总结一下,在IOC容器初始化的过程中,首先准备并执行BeanFactory后置处理器,其次得注册Bean后置处理器,并启动tomcat,最后需要借助BeanFactory完成Bean的实例化。

bean的生命周期

bean的生命周期总共有4个阶段,分别是创建对象,初始化对象,使用对象以及销毁对象,而这些工作都是交给Bean工厂的doCreateBean方法完成

  1. 创建对象阶段,先调用构造方法实例化对象,对象创建完成后,填充对象的内容,也就是依赖注入
  2. 对象创建完毕,需要进行初始化,初始化之前执行有@PostConstruct注解的方法,初始化的时候执行InitializingBean接口
  3. 完成初始化后,可以调用Bean
  4. 容器销毁前,先销毁对象,此时执行DisposableBean接口的回调,如何Bean中有标注@PreDestroy接口的函数,会先执行它

总结一下,Bean的生命周期主要有四个阶段,其中初始化对象和销毁对象可以扩展一些执行代码

SpringMVC执行流程

使用了SpringMVC,所有的请求都需要经过DispatcherServlet前端控制器,这个类提供了一个doDispatch方法,有关请求处理和结果响应的所有流程都会在这个方法中完成

  1. 用户发起向服务器发起HTTP请求,被前端控制器DispatcherServlet接收
  2. DispatcherServlet通过HandlerMapping获取到对应HandlerAdapter处理器适配器
  3. 拦截器preHandler方法
  4. 通过HandlerAdapter处理器适配器执行目标Controller方法,在这个过程中通过参数解析器和结果处理器分别解析浏览器提交的数据以及处理Controller方法返回结果
  5. 执行拦截器postHandle方法
  6. 最后处理响应,如果这个过程有异常抛出,那么执行异常的逻辑,并通过试图解析器ViewResolver解析试图,再渲染试图,最后执行拦截器afterCompletion
相关推荐
yaosheng_VALVE10 小时前
探究全金属硬密封蝶阀的奥秘-耀圣控制
运维·eclipse·自动化·pyqt·1024程序员节
dami_king10 小时前
SSH特性|组成|SSH是什么?
运维·ssh·1024程序员节
一个通信老学姐5 天前
专业125+总分400+南京理工大学818考研经验南理工电子信息与通信工程,真题,大纲,参考书。
考研·信息与通信·信号处理·1024程序员节
sheng12345678rui5 天前
mfc140.dll文件缺失的修复方法分享,全面分析mfc140.dll的几种解决方法
游戏·电脑·dll文件·dll修复工具·1024程序员节
huipeng9266 天前
第十章 类和对象(二)
java·开发语言·学习·1024程序员节
earthzhang20216 天前
《深入浅出HTTPS》读书笔记(19):密钥
开发语言·网络协议·算法·https·1024程序员节
爱吃生蚝的于勒7 天前
计算机基础 原码反码补码问题
经验分享·笔记·计算机网络·其他·1024程序员节
earthzhang20217 天前
《深入浅出HTTPS》读书笔记(20):口令和PEB算法
开发语言·网络协议·算法·https·1024程序员节
一个通信老学姐8 天前
专业140+总分410+浙江大学842信号系统与数字电路考研经验浙大电子信息与通信工程,真题,大纲,参考书。
考研·信息与通信·信号处理·1024程序员节
earthzhang20218 天前
《深入浅出HTTPS》读书笔记(18):公开密钥算法RSA(续)
网络·网络协议·算法·https·1024程序员节