Spring面试篇

Spring面试篇

  • 前置知识
    • ApplicationContextInitializer
    • ApplicationListener
    • BeanFactory
    • BeanDefinition
    • BeanFactoryPostProcesssor
    • Aware
    • InitialzingBean,DisposableBean
    • BeanPostProcessor
  • SpringBoot启动流程
  • IOC容器初始化流程
  • Bean生命周期
  • Bean循环依赖
    • 解决
  • SpringMvc执行流程


前置知识

ApplicationContextInitializer

IOC容器对象创建完成后执行,可以对上下文环境做一些操作,例如运行环境属性注册等
在这里插入图片描述

ApplicationListener

监听容器发布的事件,允许程序员执行自己的代码,完成事件的驱动开发,它可以监听容器初始化完成,初始化失败等事件。通常情况下可以使用监听器加载资源,开启定时任务等
在这里插入图片描述

BeanFactory

Bean容器的根接口,提供Bean对象的创建、配置、依赖注入等功能
在这里插入图片描述

BeanDefinition

用于描述Bean,包括Bean的名称,Bean的属性,Bean的行为,实现的接口,添加的注解等等,Spring中,Bean在创建之前,都需要封装成对应的BeanDefinition,然后根据BeanDefinition进一步创建Bean对象
在这里插入图片描述

BeanFactoryPostProcesssor

Bean工厂后置处理器,当BeanFactory准备好了后(Bean初始化之前),会调用该接口的postProcessFactory方法,经常用于新增BeanDefinition
在这里插入图片描述

Aware

感知接口,Spring提供的一种机制,通过实现该接口,重写方法,可以感知Spring应用程序执行过程中的一些变化。Spring会判断当前Bean有没有实现Aware接口,如果实现了,会在特定的时机回调接口对应的方法
在这里插入图片描述

InitialzingBean,DisposableBean

  • afterPropertiesSet方法
    初始化接口,当Bean被实例化好后,会回调里面的函数,经常用于做一些加载资源的工作

  • destroy方法
    销毁接口,当Bean被销毁之前,会回调里面的函数,经常用于做一些释放资源的工作

在这里插入图片描述

直接使用@PostConstruct、@PreDestroy注解
在这里插入图片描述

BeanPostProcessor

Bean的后置处理器,当Bean对象初始化之前以及初始化之后,会回调该接口对应的方法
在这里插入图片描述

SpringBoot启动流程

其本质就是加载各种配置信息,然后初始化IOC容器并返回。

SpringBoot启动的时候核心就两步,创建SpringApplication对象以及run方法的调用,在run方法中会真正的实例化容器,并创建容器中需要的Bean实例,最终返回。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

IOC容器初始化流程

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

首先准备并执行BeanFactory后置处理器,其次得注册Bean后置处理器,并启动tomcat,最后需要借助BeanFactory完成Bean的实例化。
在这里插入图片描述
在这里插入图片描述

Bean生命周期

有四个阶段,创建对象,初始化对象,使用对象,销毁对象,而且这些工作大部分是交给Bean工厂的doCreateBean方法完成的
在这里插入图片描述

Bean循环依赖

Bean的循环依赖指的是A依赖B,B又依赖A这样的闭环问题。

解决

通过三个对象缓存区来解决循环依赖问题

首先,调用A的构造方法实例化A,当前的A还没有处理依赖注入,暂且把它称为半成品,把半成品A封装到一个ObjectFactory中,并存储到springFactories缓存区

要处理B的依赖注入,把半成品A注入给B,B的依赖注入处理完成,B就创建完毕

在这里插入图片描述

SpringMvc执行流程

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

核心的,通过HardlerAdapter处理器适配器执行目标Controller的方法,这个过程中会通过参数解析器和结果处理器分别解析浏览器提交的数据以及处理Controller方法返回的结果。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/601125.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于kthread_stop的疑问(linux3.16)

线程一旦启动起来后,会一直运行,除非该线程主动调用do_exit函数,或者其他的进程调用kthread_stop函数,结束线程的运行。 之前找销毁内核线程的接口时,发现了kthread_stop这个接口。网上说这个函数能够销毁一个内核线程…

Linux 的引导与服务控制

一 开机启动过程 bios加电自检-->mbr-->grub-->加载内核文件-->启动第一个进程 1 bios加电自检 检测硬件是否正常,然后根据bios中的启动项设置,去找内核文件 2 mbr 因为grup太大,第一个扇区存不下所有的grub程序,所以分为…

【Tools】VS基本使用

文章目录 0 前言1 下载安装与基本使用1.1 下载安装1.2 项目创建1.3 编译运行和调试1.4 界面和设置 2 项目属性配置【重点】2.1 打开项目属性配置窗口2.2 静态库和动态库2.3 包含目录&库目录&依赖项&工作目录2.4 代码中添加附加依赖项2.5 配置项目环境变量2.6 修改属…

护眼台灯是智商税吗?眼科医生告诉你哪款护眼台灯最好

青少年近视发病率高达67%,如今,人们都被屏幕包围着,电脑、手机和电视已经成为最重要的信息手段,我们周围的屏幕也隐藏着有害的光污染。 对于4-15岁年龄段的孩子而言,除了学习本身带来的视力损伤外,每天接触…

C语言学习NO.12-字符函数(二)-strcpy,strcat,strcmp长度不受限制的字符串函数

一、strcpy的使用和模拟实现 &#xff08;一&#xff09;strcpy使用 //strcpy的使用 #include <stdio.h>int main() {char arr1[] "abcdef";char arr2[10] "qwertt";char arr3[10] "okl";strcpy(arr2, arr1);printf("arr2 %s\n&…

iOS 解决push证书不受信任

重新下载&#xff1a;https://www.apple.com/certificateauthority/

leetcode:2784. 检查数组是否是好的(python3解法)

难度&#xff1a;简单 给你一个整数数组 nums &#xff0c;如果它是数组 base[n] 的一个排列&#xff0c;我们称它是个 好 数组。 base[n] [1, 2, ..., n - 1, n, n] &#xff08;换句话说&#xff0c;它是一个长度为 n 1 且包含 1 到 n - 1 恰好各一次&#xff0c;包含 n 两…

Java反射篇----第三篇

系列文章目录 文章目录 系列文章目录前言一、反射使用步骤(获取 Class 对象、调用对象方法)二、获取 Class 对象有几种方法三、利用反射动态创建对象实例前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章…

Rust:qmetaobject 框架的环境变量和搜索路径设置

一、编译错误 安装qmetaobject后&#xff0c;编译出现下面错误信息&#xff0c;原因是环境变量和搜索路径没有正确设置。 qt_gui>cargo run warning: unused manifest key: buildCompiling qttypes v0.2.11 error: failed to run custom build command for qttypes v0.2.1…

【MYSQL】MYSQL 的学习教程(十一)之 MySQL 不同隔离级别,都使用了哪些锁

聊聊不同隔离级别下&#xff0c;都会使用哪些锁&#xff1f; 1. MySQL 锁机制 对于 MySQL 来说&#xff0c;如果只支持串行访问的话&#xff0c;那么其效率会非常低。因此&#xff0c;为了提高数据库的运行效率&#xff0c;MySQL 需要支持并发访问。而在并发访问的情况下&…

【IPC通信--信号】

信号处理函数 • 信号发送函数 – kill(), sigqueue(), raise(), alarm(), setitimer(), pause() &#xff0c; abort() • 信号安装函数 – signal(), sigaction() • 信号集操作函数 – sigemptyset(), sigfillset(), sigaddset(), sigdelset(), sigismember() 信号发送函数—…

将yolov8的检测框从正框修改为旋转框需要做那些修改?

将yolov8项目修改为yolov8_obb项目需要修改模型结构(增加角度预测)、dataloader(使其支持dota格式数据)、修改TaskAlignedAssigner(使其支持带角度的bbox)、修改loss(新增对角度的训练)、修改metric(将hbb指标titile修改为obb)、修改绘图代码(使其能绘制旋转框)。 …

常用类型_日期..

1.Date java.util.Date是开发中常用的日期处理类(并非java.sql.Date类) 现在这么一个需求&#xff1a; 就是获取当前时区的时间 public class Main{public static void main(String[] args) {// d1和d2表示的时间都是一样的 所以推荐使用第一种写法 比较简洁Date d1 new Da…

MybatisPlus—快速入门

目录 1.使用MybatisPlus的基本步骤 1.1引入MybatisPlus的起步依赖 1.2 定义Mapper 2.MybatisPlus常用注解 2.1 TableName 2.2 TableId 2.3 TableField 2.4 小结 3. 常用配置 4. 总结 1.使用MybatisPlus的基本步骤 1.1引入MybatisPlus的起步依赖 MyBatisPlus官方提…

124基于matlab的禁忌搜索算法和蚁群优化算法优化TSP路径

基于matlab的禁忌搜索算法和蚁群优化算法优化TSP路径&#xff0c;动态输出路径规划过程及输出最小距离。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。需要直接拍下&#xff0c;拍下后发邮箱。标价为程序价格&#xff0c;不包含售后。程序保证可直接运行。 …

【本科生通信原理】【实验报告】【北京航空航天大学】实验一:通信原理初步

一、实验目的&#xff1a; 熟悉 MATLAB开发环境、掌握 MATLAB基本运算操作&#xff1b;熟悉和了解 MATLAB图形绘制基本指令&#xff1b;熟悉使用 MATLAB分析信号频谱的过程&#xff1b;掌握加性白高斯噪声信道模型 二、实验内容&#xff1a; 三、实验程序&#xff1a; 1、 f…

爬取彼案壁纸

代码展现&#xff1a; 具体代码&#xff1a; import requests import re import os filename 壁纸\\ if not os.path.exists(filename): os.mkdir(filename) for i in range(2,11): url fhttp://www.netbian.com/index_{i}.htm headers {User-Agent: …

日常测试工作中哪些是必须知道的 SQL 语句?

SQL 简介 SQL(Structured Query Language&#xff0c;结构化查询语言)是一套用于管理关系数据库管理系统(RDBMS)&#xff0c;基于 ANSI&#xff08;American National Standards Institute 美国国家标准化组织&#xff09;标准的计算机语言&#xff0c;比较重要的版本是 SQL92…

在Ubuntu22.04上离线部署Tailchat(一)

一&#xff1a;Tailchat介绍 Tailchat 是一款插件化易拓展的开源 IM 应用。可拓展架构赋予 Tailchat 无限可能性。前端微内核架构 后端微服务架构 使得 Tailchat 能够驾驭任何定制化/私有化的场景&#xff0c;是面向企业与私域用户打造&#xff0c;高度自由的群组管理与定制化…

大一,如何成为一名fpga工程师?

​ 1、数电&#xff08;必须掌握的基础&#xff09;&#xff0c;然后进阶学模电&#xff08;选学&#xff09;&#xff0c; 2、掌握HDL&#xff08;HDLverilogVHDL&#xff09;可以选择verilog或者VHDL&#xff0c;建议verilog就行。 3、掌握FPGA设计流程/原理&#xff08;推…