springboot理论知识汇总(图文解析)

2023-11-12

MVC

HTTP请求处理流程

参数绑定

  • 不同注解修饰的参数都有支持的方法参数处理器,例如@RequestParam对应的是RequestParamMethodArgumentResolver
  • 在请求处理流程中的调用目标方法环节,会使用对应的参数处理器解析参数

过滤器、拦截器、AOP执行顺序

IOC

bean的加载过程

  1. 注册BeanFactory后置处理器
  2. 通过BeanFactory后置处理器扫描出所有需要spring管理的类
  3. 通过BeanFactory后置处理器封装成BeanDefinition加载到BeanFactory
  4. 创建非延迟加载的bean实例

Bean实例化的过程

  1. 执行实例化前操作
  2. 创建Bean实例
  3. 将Bean缓存起来
  4. 给Bean填充属性值
  5. 初始化Bean
    (1) 执行BeanPostProcessor-postProcessBeforeInitialization
    (2) 执行InitializingBean->afterPropertiesSet
    (3) 执行initMethod
    (4) 执行BeanPostProcessor-postProcessAfterInitialization

spring是如何解决属性循环依赖的

Bean实例化的过程如上,第三步缓存bean就是为了解决循环依赖的,例如:A与B属性循环依赖。

  1. A执行第二,三步,调用构造函数并将实例加入缓存;
  2. A执行第四步时找不到B实例,于是先去执行B的实例化;
  3. B执行到第4步时从缓存中能够找到A实例,于是B实例化成功;
  4. 接着再执行A的实例化。

为什么spring无法解决构造方法中的循环依赖

调用构造函数后是第二步就要执行的事情,第二步都通过不了,自然就无法执行第三步加入缓存中。

Bean的生命周期

  1. BeanDefined
  2. BeanFactoryPostProcessor对BeanDefined后置处理
  3. InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation实例化前执行
  4. Bean实例化
  5. InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation实例化后执行
  6. 属性注入
  7. BeanNameAware.setBeanName
  8. BeanFactoryAware.setBeanFactory
  9. ApplicationContextAware.setApplicationContext
  10. BeanPostProcessor的前置方法
  11. InitializingBean.afterPropertiesSet方法
  12. @PostConstruct修饰的方法
  13. BeanPostProcessor的后置操作
  14. DisposableBean.destory销毁
  15. @PreDestroy修饰的方法

有几种注入方式

set 注入,构造器注入和方法注入

BeanFactory和FactoryBean的区别

  • BeanFactory是Spring容器中的一个很重要的类,它对于Bean的创建有一个统一的流程
  • FactoryBean是一个工厂Bean,可以生成某一个类型Bean实例,它最大的一个作用是:可以让我们自定义Bean的创建过程

spring的工厂模式是怎么实现的?

  • spring的工厂模式实际上是抽象工厂模式
  • 它允许用户为指定Bean自定义工厂
  • 其他Bean会采用默认的一套流程生成Bean

自定义工厂类

  • 自定义工厂类实现FactoryBean接口
  • 实现getObject方法(获取对象的方法)
  • @Component改名

AOP

代理模式有哪几种

静态代理、JDK动态代理、CGLib动态代理

  • 静态代理,即对象的适配器模式
  • JDK动态代理,生成被代理接口的匿名类作为代理类
    1. 动态代理类实现InvocationHandler接口
    2. Proxy.newProxyInstance生成代理对象
    3. 被代理类需要有接口
  • CGLib动态代理,生成被代理类的子类作为代理类
    1. 创建Enhancer
    2. 创建MethodInterceptor接口实现类
    3. Enhancer.setSuperclass(被代理类)
    4. Enhancer.setCallback
    5. Enhancer.create生成代理类

JDK动态代理的原理

  1. 为接口创建代理类的字节码文件
  2. 使用ClassLoader将字节码文件加载到JVM
  3. 创建代理类实例对象,执行对象的目标方法
  4. 通过反射方式调用被代理类相应的方法

springboot如何选择代理模式

  • 有接口,使用JDK动态代理(1.8后JDK动态代理效率高于CGLib动态代理)
  • 无接口,使用CGLib动态代理

MyBatis

事务控制的原理

  • 调用spring管理的bean的方法,实际上是通过代理类实现的
  • 当识别到方法被@ Transactional修饰时,会执行事务拦截器
  • 在事务拦截器中,开启事务
  • 在事务拦截器中,调用目标对象方法
  • 在事务拦截器中,提交事务或者回滚事务。

事务传播行为

  • REQUIRED (要求):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  • SUPPORTS (支持):如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  • MANDATORY (强制):如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  • REQUIRES_NEW (要求新的):创建一个新的事务,如果当前存在事务,则把当前事务挂起。
  • NOT_SUPPORTED (不支持):以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  • NEVER (都不):以非事务方式运行,如果当前存在事务,则抛出异常。
  • NESTED (嵌套):如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 REQUIRED 。
  • 指定方法:通过使用 propagation 属性设置,例如:@Transactional(propagation = Propagation.REQUIRED)
  • 默认值为REQUIRED

JDBC四大核心类

  • DriverManager,用于注册数据库连接
  • Connection,与数据库连接对象
  • Statement/PrepareStatement,操作数据库SQL语句的对象
  • ResultSet,结果集或一张虚拟表

MyBatis也有四大核心类:

  • SqlSession对象,该对象中包含了执行SQL语句的所有方法。类似于JDBC里面的Connection。
  • Executor接口,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。类似于JDBC里面的Statement/PrepareStatement。
  • MappedStatement对象,该对象是对映射SQL的封装,用于存储要映射的SQL语句的id、参数等信息。
  • ResultHandler对象,用于对返回的结果进行处理,最终得到自己想要的数据格式或类型。可以自定义返回类型。

Mybatis 原理

在spring中,Mapper接口我们都没有实现的方法却可以通过依赖注册的方式使用,是为什么呢?

  • mybatis使用动态代理的方式实现了Mapper接口
  • MapperFactoryBean,spring动态代理的方式将实现的mapper对象又进行了一层分装
  • 最终,当执行mapper时,将先去获取ThreadLocal中获取sqlSession,无则创建,然后调用sqlsession.Mapper的方式获得到最终的Mapper对象。

一级缓存和二级缓存

  • 一级缓存是sqlsession级别的缓存,当调用close/clearCache或udpate时清空缓存,由于无事务时,一条sql的执行就会调用close方法,所以一级缓存只作用无同一事务中。
  • 二级缓存是应用级别的缓存,以namespace为维度。当namespace下发生增删改操作时清空缓存,分布式环境和多表操作存在问题,不推荐使用。

其他

springboot的启动流程

springboot自动装配原理

  1. Import相关
  • 注解嵌套关系 @SpringBootApplication -> @EnableAutoConfiguration注解 -> @Import({AutoConfigurationImportSelector.class})
  • Import会将selectImports方法返回的所有全路径限定类名都会被spring扫描
  1. AutoConfigurationImportSelector相关
  • 核心方法调用链 selectImports -> getAutoConfigurationEntry -> getCandidateConfigurations -> loadSpringFactories
  • 将扫描classpath下面类路径为META-INF/spring.factories的所有文件(包括jar包),提取出key为org.springframework.boot.autoconfigure.EnableAutoConfiguration的所有数据。
  1. ConditionalOnClass注解
  • 官方组件一般都被ConditionalOnClass注解修饰,这是由于官方组件factories文件都不和jar包放一起。
  • 它表示标记的类存在时才会被spring装配,即导入了目标jar包时才会被spring装配

当spring的事务隔离级别同mysql的事务隔离级别不一致时

  • jdbc 的使用流程有四部,注册驱动,建立连接,发起请求,输出结果
  • 其中建立连接可以指定事务隔离级别
  • 于是当spring设置的事务隔离级别同数据库不一致时,以spring为准。

@Transactional不起作为的四个原因

  • 默认RuntimeException异常才回滚,可指定
  • 异常捕捉后没有抛出
  • 修饰非public方法(事务拦截器实现的,当为非public方法时不会去获取Transactional注解信息)
  • 在类内部调用调用类内部@Transactional标注的方法(由于动态代理的机制,可以通过将内部方法调用替换为代理类方法调用来避免)
  • 修饰接口,只有通过JDK动态代理才能起作用。
  • 存储引擎
  • 事务传播等级

springboot有哪些优点

  • 独立运行,内嵌了各种 servlet 容器,Tomcat、Jetty 等,现在不再需要打成war 包部署到容器中,Spring Boot 只要打成一个可执行的 jar 包就能独立运行,所有的依赖包都在一个 jar 包内
  • 简化配置,spring-boot-starter-web 启动器自动依赖其他组件,简少了 maven 的配置。
  • 自动配置,能根据当前类路径下的类、jar 包来自动配置 bean,如添加一个 spring
    boot-starter-web 启动器就能拥有 web 的功能,无需其他配置。
  • 无代码生成和XML配置,配置过程中无代码生成,也无需 XML 配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的
  • 应用监控

spring-boot-starter-parent的作用

  • 统一版本
  • 指定编码

springboot如何多环境快速切换

  • 添加application-dev.properties
  • application.properties文件中添加配置spring.profiles.active = dev

springboot如何实现热部署

导入spring-boot-devtools包

springboot封装starter组件核心

  • resources目录下创建META-INF/spring.factories文件,定义要被spring管理的配置文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.mystarter.config.MyConfig

  • 可在类上添加@Conditional标签限定实例化条件。

Spring Boot 配置加载顺序

  1. properties文件;
  2. YAML文件;
  3. 系统环境变量;
  4. 命令行参数;

Spring Boot做了什么

  • 简化配置
  • 起步依赖
  • 内嵌容器

注解大全

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot理论知识汇总(图文解析) 的相关文章

  • 如何查看Pocketsphinx词典中是否存在该单词?

    我只是想看看字典文件中是否存在字符串 字典文件位于问题底部 我想检查语音识别器是否可以识别单词 例如 识别器将无法识别字符串ahdfojakdlfafiop 因为字典中没有定义 所以 我可以检查某个单词是否在 pocktsphinx 词典中
  • HTTP 状态 404 - 请求的资源不可用

    在使用 MyEclipse IDE 中的 Tomcat 服务器和 Struts 2 框架时 我遇到了反复出现的问题 我将我的程序作为服务器应用程序运行 当它运行时 默认的index jsp 文件将成功打开 但应用程序的其他过去都不起作用 当
  • java.lang.Class: 在 java 程序中初始化 log4j 属性文件时出错

    我正在尝试使用 log4j 运行独立的 java 程序 但在调试时收到以下消息 控制台上没有 log4j 相关日志 log Logger 1343 java lang Class ERROR in 18b4aac2 有人可以建议这里出了什么
  • 由于连接超时,无法通过 ImageIO.read(url) 获取图像

    下面的代码似乎总是失败 URL url new URL http userserve ak last fm serve 126 8636005 jpg Image img ImageIO read url System out printl
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • 有没有好的方法来解析用户代理字符串?

    我有一个Java接收模块User Agent来自最终用户浏览器的字符串的行为需要略有不同 具体取决于浏览器类型 浏览器版本甚至操作系统 例如 FireFox 7 0 Win7 Safari 3 2 iOS9 我明白了User Agent由于
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • 服务器到 Firebase HTTP POST 结果为响应消息 200

    使用 Java 代码 向下滚动查看 我使用 FCM 向我的 Android 发送通知消息 当提供正确的服务器密钥令牌时 我收到如下所示的响应消息 之后从 FCM 收到以下响应消息 Response 200 Success Message m
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • @EnableTransactionManagement 的范围是什么?

    我试图了解正确的放置位置 EnableTransactionManagement多个 JavaConfig 上下文的情况下的注释 考虑以下场景 我在 JPAConfig java 和 AppConfig java 中有 JPA 配置以及一组
  • 从 Stax XMLStreamReader 读取以解组部分

    我正在使用 Stax 游标 API 从大型 xml 文件中提取数据 当前 我转到特殊标签的开头并使用 JAXB 解组该标签 这对于格式良好的 xml 文件效果很好 但不久前我有一个文档 其中数十万个标签中有一个未关闭 JAXB 使用 XML
  • 在 Selenium WebDriver 上如何从 Span 标签获取文本

    在 Selenium Webdriver 上 如何从 span 标记检索文本并打印 我需要提取文本UPS Overnight Free HTML代码如下 div id customSelect 3 class select wrapper
  • ExceptionHandler 不适用于 Throwable

    我们的应用程序是基于 Spring MVC 的 REST 应用程序 我正在尝试使用 ExceptionHandler 注释来处理所有错误和异常 I have ExceptionHandler Throwable class public R
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或
  • 为什么 BufferedWriter 不写入文件?

    我有这个代码 String strings Hi You He They Tetrabenzene Caaorine Calorine File file new File G words txt FileWriter fWriter Bu
  • Java中有类似分支/跳转表的东西吗?

    Java有类似分支表或跳转表的东西吗 分支表或跳转表是 根据维基百科 http en wikipedia org wiki Branch table 用于描述使用分支指令表将程序控制 分支 转移到程序的另一部分 或可能已动态加载的不同程序
  • Java 推断泛型类型

    我正在寻找类似的推断捕获泛型类型的概念 类似于以下方法片段 但不是捕获泛型类型的类 public
  • 使用 eclipse IDE 配置 angularjs

    我想开始使用 AngularJs 和 Java Spring 进行开发 我使用 Eclipse 作为 IDE 我想配置我的 Eclipse 以使这些框架无缝工作 我知道我可能要求太多 但相信我 我已经做了很多研究 你们是我最后的选择 任何帮

随机推荐

  • 华为OD机试 Java 实现【整型数组合并】【牛客练习题】

    一 题目描述 将两个整型数组按照升序合并 并且过滤掉重复数组元素 输出时相邻两数之间没有空格 二 输入描述 输入说明 按下列顺序输入 输入第一个数组的个数 输入第一个数组的数值 输入第二个数组的个数 输入第二个数组的数值 三 输出描述 输出
  • Qt添加第三方字体

    最近开发项目时 据说不能用系统自带的微软雅黑字体 于是找一个开源的字体 思源黑体 这个是google和Adobe公司合力开发的可以免费使用 本篇记录一下Qt使用第三方字体的方式 字体从下载之家下载http www downza cn sof
  • C#文件后缀名详解

    sln 解决方案文件 为解决方案资源管理器提供显示管理文件的图形接口所需的信息 csproj 项目文件 创建应用程序所需的引用 数据连接 文件夹和文件的信息 aspx Web 窗体页由两部分组成 视觉元素 HTML 服务器控件和静态文本 和
  • 什么是P = NP?问题

    文章目录 引言 天才基本法 什么是P NP问题 P NP 成立吗 总结 提示 以下是本篇文章正文内容 Java系列学习将会持续更新 引言 今天我们先放松一下 这篇文章并不是Java课程的学习 而是带大家认识一个学术问题 但是请大家放心 这里
  • libevent多线程使用事项

    在linux平台上使用c开发网络程序的同志们一般情况下都对鼎鼎大名的libevent非常的熟悉了 但是一些新进入此领域的new new people们对此都是一头雾水 原本的迷茫再加上开源软件一贯的 帮助文件 缺失作风 让我们这些新手们显的
  • 免费C/C++编译器

    不好意思 等到现在才想到要写这篇文章 怎么说呢 情况是这样的 刚开始我学习C语言时 是想在机器上安装visual c 的 因为Turbo C太古老了 用起来不方便 所以很自然地想安装vc 不过不知道大家有没有发现vc很大 而且有些机子就是安
  • 线程是什么意思

    线程是操作系统能够进行运算调度的最小单位 它被包含在进程之中 是进程中的实际运作单位 一条线程指的是进程中一个单一顺序的控制流 一个进程中可以并发多个线程 每条线程并行执行不同的任务 在Unix System V及SunOS中也被称为轻量进
  • Structural Time Series modeling in TensorFlow Probability

    在邯郸学步后 想要深入用好Tensorflow中的STS model 还是要静下心来 好好阅读点材料 f t f 1
  • 分页插件pagehelper配置和 使用;

    先看结论 在看代码是实现 代码就这么多 现在来看配置 配置 1 pom xml加入这个依赖 com github pagehelper pagehelper 3 7 5 com github jsqlparser jsqlparser 0
  • 关于HashMap扩容造成死循环的介绍

    一 造成死循环的原因 HashMap扩容导致死循环的主要原因在于扩容后链表中的节点在新的hash桶使用头插法插入 新的hash桶会倒置原hash桶中的单链表 那么在多个线程同时扩容的情况下就可能导致产生一个存在闭环的单链表 从而导致死循环
  • 虚幻4学习笔记(10)蓝图接口、拾取物品-射线检测

    虚幻4学习笔记 蓝图接口 拾取物品 射线检测 骨架网格体和静态网格体的区别 骨架网格体设置碰撞 B站UP谌嘉诚课程 https www bilibili com video BV164411Y732 蓝图接口 添加 内容浏览器 右键 蓝图
  • 多模态简介

    1 多模态定义 多模式深度学习是一个机器学习子领域 旨在训练人工智能模型来处理和发现不同类型数据 模式 之间的关系 通常是图像 视频 音频和文本 通过结合不同的模态 深度学习模型可以更普遍地理解其环境 因为某些线索仅存在于某些模态中 想象一
  • VMware Tools安装(实现物理机与虚拟机文件互拷)

    1 开启虚拟机 2 点击VMware菜单上的虚拟机 弹出的菜单中点击安装VMware Tools 3 点击DVD 出现右边如图 4 复制VMware Tools压缩文件到opt文件夹 复制时可能出现下图描述 5 解决方法 1 打开终端 输入
  • 你了解System.out.println()的真正含义吗?

    在Java编程中 我们常常用 System out println 来输出字符串 也许我们都已经猜到println 是方法名 但System是什么 out又是什么呢 其实System是java lang里面的一个类 如下图 而out就是Sy
  • IDEA中/** 内容 */注释的快捷键

    在 IDEA 中 你可以使用快捷键 来快速生成 内容 注释 要使用此快捷键 请在你想要添加注释的代码行上按 Ctrl Windows 系统 或 Command Mac 系统 如果你想要撤销注释 可以再次按一次快捷键即可 注意 你必须在代码行
  • 设计模式学习笔记(七)之模板方法模式(Template Method)

    设计模式学习笔记 七 之模板方法模式 Template Method 最近实习工作稍微没有那么忙了 继续抽些晚上时间学习一下设计模式 以下是看设计模式书的学习笔记 关于模式定义之类的内容是在自己理解之后进行摘录的 希望对大家有用 代码下载链
  • SpringBoot获取微信公众号(小程序)access_token 使用Redis存储

    文章目录 前言 一 导入依赖 二 编写配置 1 personal yaml配置文件 2 WeChatBean实体类 3 编写RestTemplateConfig 4 开启定时任务 三 实现生成和存储access token 1 基本介绍 2
  • 路飞IT全学科实战项目5年黑金卡

    正在代理路飞IT全学科实战项目5年黑金卡 文末有联系方式 包含Python开发 Linux云计算 前端开发 Golang开发 AI 数据分析 网络安全 技术生涯 C语言 JAVA开发 测试 PHP 视频讲解 项目源码内容非常详细 开通黑金卡
  • 浅入深谈:如何更好地理解面向对象编程与面向过程编程的本质区别?

    今天 我们以一个例子 如打扫房间 来说明面向过程和面向对象在程序流程上的不同之处 在菜鸟分析看来 面向过程就是将编程当成是做一件事 要按步骤完成 每一步就是一个过程 比如菜鸟分析要打扫房间这件事 需要先取扫帚 然后仔仔细细打扫每一处 最后将
  • springboot理论知识汇总(图文解析)

    MVC HTTP请求处理流程 参数绑定 不同注解修饰的参数都有支持的方法参数处理器 例如 RequestParam对应的是RequestParamMethodArgumentResolver 在请求处理流程中的调用目标方法环节 会使用对应的