Spring框架知识点

news2024/9/22 5:40:33

Spring框架知识点

Spring框架中的单例Bean是线程安全的吗?

:Spring框架中有一个@Scope注解,默认值是singleton,单例的,当bean中定义了可变参数,就不是线程安全的。我们建议不要注入有状态的变量,如果必须使用,建议使用ThreadLocal进行变量副本保存,保证线程安全。

什么是AOP?项目中有没有使用到AOP?

答:AOP是面向切面编程,是指哪些与业务实现无关,但又对多个对象产生影响的公共行为和逻辑,将他们横向抽取并封装为一个可重用的模块,这个模块就叫“切面”。作用就是降低代码耦合度,提高了系统的可维护性

常见的AOP使用场景:

  • 日志
  • Spring中内部的事务处理
  • 异常处理

Spring中的事务是如何实现的?

在这里插入图片描述

Spring中事务失效的场景有哪些?

情况一:异常捕获处理

在这里插入图片描述

情况二:抛出非运行时(检查)异常

在这里插入图片描述

情况三:非public方法导致的事务失效

在这里插入图片描述

Spring的bean的生命周期?

首先了解BeanDefinition

在这里插入图片描述

BeanDefinition定义了Bean的基本信息,构造函数进行创建,依赖注入,Aware接口,初始化方法之前的后置处理器,初始化方法,初始化方法包括InitialzingBean和自定义init方法,初始化后的后置处理器,AOP就是在这里进行的:

在这里插入图片描述

其中,BeanDefinition -> 构造函数 属于是Bean的创建

下面都属于初始化赋值

在这里插入图片描述

对一个bean进行增强的时候,就可以在after后置处理器进行操作。

@Override
public Object postProcessAfterInitialization(Object bean,String beanName) {
    if(beanName.equals("user")) {
        // cglib代理对象
        Enhancer enhancer = new Enhancer();
        //设置需要增强的类
        enhancer.setSuperClass(bean.getClass());
        //执行回调方法,增强方法
        enhancer.setCallback(new InvocationHandler() {
            @Override
            public Object invoke(Object o,Method method,Object[] objects) throws Throwable {
                return method.invoke(method,objects);
            }
        });
        return enhancer.create();
    }
}

在这里插入图片描述

Spring中的循环引用问题

所谓的循环依赖就是类A中注入了类B,类B也注入了类A:

在这里插入图片描述

死循环产生:

在这里插入图片描述

那么Spring是如何解决的呢?

三级缓存解决循环依赖:

Spring解决循环依赖是通过三级缓存,对应的三级缓存如下所示:

在这里插入图片描述

一级缓存中存放的是单例Bean,如果一个Bean是多例的,那么就不会存放,需要的时候会再创建一个。

二级缓存中存放的Bean是没有走完生命周期的,比如刚经历过构造函数的Bean。

三级缓存

一级缓存的作用:限制Bean只存在一份,即实现singleton scope,解决不了循环依赖。

如果想要打破循环依赖了,就需要一个中间人的参与,这个中间人就是二级缓存:

在这里插入图片描述

想要创建A,先创建了半成品A,放入到二级缓存中,接着创建半成品B,继续创建B的时候,先拿着半成品A创建完整的B,接着把B放入一级缓存,这个时候半成品A就可以创建完整A,接着A放入一级缓存,创建完成。

但是如果A是代理对象的话,就是A需要增强的话,二级缓存解决循环依赖就不够了。

三级缓存:

在这里插入图片描述

还有个经典问题:

在这里插入图片描述

由于bean的生命周期中构造函数是第一个执行的,spring框架并不能解决构造函数的依赖注入。

SpringMVC的执行流程

客户端(浏览器)发送请求, DispatcherServlet拦截请求。

DispatcherServlet 根据请求信息调用 HandlerMappingHandlerMapping 根据 URL 去匹配查找能处理的 Handler(也就是我们平常说的 Controller 控制器) ,并会将请求涉及到的拦截器和 Handler 一起封装。

DispatcherServlet 调用 HandlerAdapter适配器执行 Handler

Handler 完成对用户请求的处理后,会返回一个 ModelAndView 对象给DispatcherServletModelAndView 顾名思义,包含了数据模型以及相应的视图的信息。Model 是返回的数据对象,View 是个逻辑上的 View

ViewResolver 会根据逻辑 View 查找实际的 View

DispaterServlet 把返回的 Model 传给 View(视图渲染)。

View 返回给请求者(浏览器)


著作权归JavaGuide(javaguide.cn)所有 基于MIT协议 原文链接:https://javaguide.cn/system-design/framework/spring/spring-knowledge-and-questions-summary.html

SpringBoot中的自动配置原理

在这里插入图片描述

在SpringBoot项目中的引导类上有一个注解@SpringBootApplication,这个注解是对三个注解进行了封装,分别是:

  1. @SpringBootConfiguration
  2. @EnableAutoConfiguration
  3. @ComponentScan

其中,@EnableAutoConfiguration是实现自动化配置的核心注解。该注解通过**@Import注解导入对应的配置选择器。内部就是读取了该项目和项目所用的jar包的classpath路径下META-INF/spring.factories文件中的所配置的类的全类名。在这些配置类中定义的Bean会根据条件注解所制定的条件来决定**是否需要将其导入到Spring容器中。

条件判断会有想**@ConditionalOnClass**这样的注解,判断是否有对应的class字节码文件,如果有则加载该类,把这个配置类的所有的Bean放入容器。

Spring框架常见注解

在这里插入图片描述

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

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

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

相关文章

备战蓝桥杯Day21 - 堆排序的内置模块+topk问题

一、内置模块 在python中,堆排序已经设置好了内置模块,不想自己写的话可以使用内置模块,真的很方便,但是堆排序算法的底层逻辑最好还是要了解并掌握一下的。 使用heapq模块的heapify()函数将列表转换为堆,然后使用he…

librtmp源码分析

阅读了librtmp的源码,简单记录下。 首先补充下AMF格式基本知识 1 AMF格式 AMF是Action Message Format(动作消息格式)的简写,它是一种二进制的数据格式。它的设计是为了把actionscript里面的数据(包括Object, Array, Boolean, Number等)序列化成二进制…

工业现场网络性能评估方案

最近要去一个工厂排查网络和电脑卡顿的问题,为此,我准备了以下的方案,在现场以抓包和网络监控的方式来排查。 1.评估流程 为了评估Linux系统的网络负荷,并使用tcpdump来捕获数据包进行分析,您需要遵循以下几个步骤: …

一种基于三角剖分划分白区范围的白平衡算法

常规的白平衡算法中,一般会通过标准色温的R/G-B/G建议色温坐标系,然后在该坐标系中设定白区范围,对落入到白区范围的R/G/B进行加权统计处理,输出给到软件进行白平衡的增益计算。 所介绍的这篇专利利用三角剖分的算法,在划定的白区范围内,利用各个标准色温光源下所标定的白…

深入解析Golang的encoding/ascii85库:从基础到实战

深入解析Golang的encoding/ascii85库:从基础到实战 引言基础知识什么是ASCII85编码?ASCII85编码的工作原理ASCII85编码的优点ASCII85编码的缺点 使用Golang的encoding/ascii85库引入encoding/ascii85包ASCII85编码ASCII85解码实战示例小结 进阶技巧和最佳…

经典文献阅读之--CamMap(基于SLAM地图对不共视相机进行外参标定)

0. 简介 由于多相机之间通常存在有限或无重叠的视场,因此在估计外参相机参数时面临着一定的挑战,为了解决这个问题,本文提出了CamMap:一种新颖的6自由度外参标定流程。根据三个操作规则,使一个多相机系统单独捕捉一些…

垃圾回收APP:开启智能环保新篇章

随着科技的发展和人们生活水平的提高,智能手机已经成为我们生活中不可或缺的工具。而垃圾回收作为环保领域的重要组成部分,也正逐渐受到人们的关注和重视。为此,我们推出了一款创新的垃圾回收APP,旨在为环保事业注入科技力量&…

每日五道java面试题之mysql数据库篇(一)

目录: 第一题. 为什么要使用数据库?第二题. 数据库三大范式是什么?第三题. mysql有关权限的表都有哪几个?第四题. MySQL的binlog有有几种录入格式?分别有什么区别?第五题. MySQL存储引擎MyISAM与InnoDB区别 第一题. 为什么要使用数据库? …

SpringBoot实现短链跳转

目录 1.背景介绍 2.短链跳转的意义 3.SpringBoot中的代码实现 1.建议短链-长链的数据库表:t_url_map: 2.映射实体 3.Dao层实现 4.Service层实现 5.Controller层实现 3.结果测试 4.问题 1.背景介绍 短链跳转是一种通过将长链接转换为短链接的方式&…

Chrome浏览器新功能:节省内存,更方便查询内存占用情况

一、前言 Chrome浏览器一直被用户抱怨占用过多的内存,但是Google推出了Memory Saver功能来解决这个问题。该功能可以冻结不活跃的页面以节省内存。 现在,Google正在进一步开发这个功能,Chrome的Hover Cards功能将很快可以显示当前标签页使用了…

YOLOV8介绍

原文链接: 1、 详解YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出 2、Yolov8的详解与实战 3、YOLOV8模型训练部署(实战)()有具体部署和训练实现代码YOLOV8模型训练部署(实战)&…

bert 相似度任务训练,简单版本

目录 任务 代码 train.py predit.py 数据 任务 使用 bert-base-chinese 训练相似度任务,参考:微调BERT模型实现相似性判断 - 知乎 参考他上面代码,他使用的是 BertForNextSentencePrediction 模型,BertForNextSentencePred…

第三百七十六回

文章目录 1 .概念介绍2. 实现方法3. 示例代码 我们在上一章回中介绍了在页面之间共传递数据相关的内容,本章回中将介绍如何拦截路由.闲话休提,让我们一起Talk Flutter吧。 1 .概念介绍 本章回中介绍的路由拦截是指在路由运行过程中,对路由做…

01tire算法

01tire算法 #include<bits/stdc.h> using namespace std; #define maxn 210000 int a[maxn], ch[maxn][2], val[maxn], n, ans, tot; void insert(int x) {int now 0;for (int j 31; j > 0; j -- ){int pos ((x >> i) & 1);if (!ch[now][pos])ch[now][po…

elasticsearch7.17 terms聚合性能提升90%+

背景 ES7 相比于 ES6 有多个层面的优化&#xff0c;对于开源的ES而言&#xff0c;升级是必经之路。 ES的使用场景非常多&#xff0c;在升级过程中可能会遇到非预期的结果&#xff1b; 比如之前文章提到的典型案例&#xff1a;ES7.17版本terms查询性能问题 ES7.17版本terms查…

服务端向客户端推送数据的实现方案

在日常的开发中&#xff0c;我们经常能碰见服务端需要主动推送给客户端数据的业务场景&#xff0c;比如数据大屏的实时数据&#xff0c;比如消息中心的未读消息&#xff0c;比如聊天功能等等。 本文主要介绍SSE的使用场景和如何使用SSE。 服务端向客户端推送数据的实现方案有哪…

maven项目导入mysql依赖

最近在B站跟着狂神学习Mybatis&#xff0c;学到P2就卡住了&#xff0c;搭建的maven项目一直无法导入依赖&#xff0c;在网上查找了很多相关的解决方法&#xff0c;project structure不知道点进去多少回&#xff0c;始终无法解决&#xff0c;后来把responsity文件夹删除重置了一…

【代码随想录python笔记整理】第十六课 · 出现频率最高的字母

前言:本笔记仅仅只是对内容的整理和自行消化,并不是完整内容,如有侵权,联系立删。 一、哈希表初步 在之前的学习中,我们使用数组、字符串、链表等等,假如需要找到某个节点,则都要从头开始,逐一比较,直到找到为止。为了能够直接通过要查找的记录找到其存储位置,我们选…

RV1126芯片概述

RV1126芯片概述 前言1 主要特性2 详细参数 前言 1 主要特性 四核 ARM Cortex-A7 and RISC-V MCU250ms快速开机2.0Tops NPU14M ISP with 3帧 HDR支持3个摄像头同时输入4K H.264/H.265 视频编码和解码 2 详细参数

【王道数据结构】【chapter8排序】【P371t5】

编写一个算法&#xff0c;在基于单链表表示的待排序关键字序列上进行简单选择排序 #include <iostream> #include <time.h> #include <stdlib.h> typedef struct node{int data;struct node *next; }node,*pnode;pnode buynode(int x) {pnode tmp(pnode) mal…