淮南网站建设淮南/新冠疫情最新情况
Spring框架
1. BeanFactory和ApplicationContext有何区别
BeanFactory是Spring最底层的接口,是IoC的核心,定义IoC的基本功能。
BeanFactory具有:延迟实例化的特性。在启动的时候,不会实例化Bean,只有有需要从容器中获取Bean才会实例化Bean。(一般用在移动设备等内存较小的地方)
ApplicationContext是BeanFactory子接口,相较于BeanFactory多提供:国际化、资源访问、AOP等功能。
ApplicationContext在启动的时候,会实例化所有Bean,可以为Bean配置Lazy-init
实现延迟实例化。
2. Spring Bean的生命周期
一、加载Bean定义
1、loadBeanDefinitions
:将Bean定义记录在beanDefinitionMap中
registerBeanDefinition类-> registerBeanDefinition()方法
二、创建Bean对象
1、构建对象
通过遍历对对象进行逐个构造。
AbstractAutowireCapableBeanFactory类->createBeanInstance()
2、填充属性
populateBean()
3、初始化
initializeBean()
3.1:applyBeanPostProcessorsBeforeInitialization()
:初始化前应用Bean后置处理器
3.2:invokeInitMethods()
:初始化
3.3:applyBeanPostProcessorsAfterInitialization()
:初始化后应用Bean后置处理器
三、使用
初始化完成后的Bean对象即可正常使用。
四、销毁
1、销毁前
@PreDestory
注解的方法
2、销毁
DisposableBean->destory()
Bean->destory-method()
3. Spring IOC如何实现
IoC:Inversion of Control 控制反转。
通俗易懂的理解:我们拥有创建对象的控制能力,反转为由程序进行创建对象,不在由我们去创建对象。
IoC有多种实现方式,其中最常见的DI(Dependency Injection 依赖注入)。对象通过构造方法参数、工厂方法参数、构造或工厂方法返回后在对象实例上设置的属性来定义它们的依赖项,从类外部注入依赖(容器在创建bean时注入这些依赖项)。
Spring常见依赖注入有3种方式:1、构造方法 2、set 3、注解注入@Autowired
Spring提供了两种IoC容器:
1、BeanFactory
2、ApplicationContext
具体可参考 面试题1
在了解了Spring Bean的生命周期后,我们能够发现Bean对象的创建已经不是由我们手动创建了,而是通过Spring底层的组件进行加载->创建->销毁
,这一过程就是Spring IoC的过程。
4. 说说Spring AOP及实现原理
4.1 AOP概念
AOP:Aspect Orient Programming 面向切面编程。
目的:在不修改源代码的情况下,实现添加额外功能的技术。
个人理解:源代码为一颗笔直的树,需要在这棵树上看到更多的种类,在树旁重新栽显然耗时费力,此时通过嫁接技术,在树的切面嫁 接即可实现目的。(AOP)
4.2 AOP使用
具体使用可参考:https://blog.csdn.net/Cr1556648487/article/details/126777903
4.3 AOP原理
SpringAOP底层采用动态代理,支持JDK动态代理以及Cglib动态代理。
JDK动态代理只能为接口创建动态代理实例。需要获得被代理类的接口信息,通过反射生成一个实现代理接口的动态代理类,然后通过构造方法生成动态代理类的实例对象,在调用具体方法前使用invokeHandler()
处理。
Cglib动态代理以来asm包,把被代理类的字节码加载进来,生成其子类。
5. 动态代理(cglib与JDK)
JDK动态代理:
通过实现InvocationHandler
接口的invoke()
方法定义切面逻辑。
使用条件:
- 1、业务目标对象只能为接口创建代理实例
- 2、拦截器实现
InvocationHandler
- 3、通过
Proxy.newProxyInstance()
生成代理对象
Cglib动态代理:
基于ASM
字节码生成库,允许在运行时对字节码修改和动态生成。
JDK动态代理与Cglib动态代理区别
-
JDK动态代理只针对接口实现类进行代理。也就是只面向接口。
-
Cglib针对类实现代理,采用的是继承方法。
6. Spring事务实现方式
-
编程式事务
概念:在业务代码中精确定义事务边界
代码块中调用:
beginTransaction()、commit()、rollback()
等相关方法 -
声明式事务
有助于用户将操作与事务规则进行解耦。简单地说,编程式事务侵入到了业务代码里面,但是提供了更加详细的事务管理;而声明式事务由于基于AOP,所以既能起到事务管理的作用,又可以不影响业务代码的具体实现。
使用:
@EnableTransactionManagement
:开启事务管理
@Transactional
:开启事务
@Transactional
事务注解失效原因:
- 方法修饰符不为
public
- 方法内部调用事务
- 事务内捕获异常,未抛出新异常
- rollbackFor属性配置错误
7. Spring事务的底层原理
使用事务步骤:
- 获取数据库连接
- 开启事务
- 执行数据操作
- 提交事务/回滚事务
- 关闭连接
Spring在框架中做了开启事务、提交事务、回滚事务的操作,使得业务代码和事务代码解耦。这一功能是基于AOP实现的。
8. 自定义注解实现功能
参考:https://www.jianshu.com/p/7c2948f64b1c
9. SpringMVC运行流程
核心代码:DispatcherServlet.java -> doDispatch()
- 用户请求
- DispatcherServlet中央调度器通过请求查找HandlerMapping获取Handler
- DispatcherServlet中央调度器通过Handler查找HandlerAdapeter
- 处理器适配器调用用户编写的controller,返回ModelAndView(基于JSON交互的,返回ModelAndView为空,此时前端已能接收到返回值)
- DispatcherServlet中央调度器通过
ModelAndView
查找对应ViewResolver
,返回View
- 渲染View
- 返回渲染后的View
10. SpringMVC启动流程
详情查看:https://blog.51cto.com/u_9587581/2398187
11. Spring的单例实现
Spring的单例模式是采用:单例注册表实现的。
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);
private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<String, Object>(16);
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<String, ObjectFactory<?>>(16);//Spring获取单例模式方法
protected Object getSingleton(String beanName, boolean allowEarlyReference) {Object singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {singletonObject = this.earlySingletonObjects.get(beanName);if (singletonObject == null && allowEarlyReference) {synchronized (this.singletonObjects) {singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null) {singletonObject = this.earlySingletonObjects.get(beanName);if (singletonObject == null) {ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);if (singletonFactory != null) {singletonObject = singletonFactory.getObject();this.earlySingletonObjects.put(beanName, singletonObject);this.singletonFactories.remove(beanName);}}}}}}return singletonObject;}
这里有3个Map集合:singletonObjects、earlySingletonObjects、singletonFactories
单例获取顺序为:singletonObjects -> earlySingletonObjects -> singletonFactories
singleonObjects
:单例对象的cacheearlySingletonObjects
:提前曝光的单例对象的cachesingletonFactories
:单例对象工厂的cache
12. Spring中使用了哪些设计模式
1、工厂模式:BeanFactory、ApplicationContext
2、单例模式:Bean默认为单例模式
3、代理模式:AOP功能用到了JDK动态代理和Cglib动态代理
4、适配器模式:Spring AOP 的拦截器使用到了适配器模式
相关文章:

Java面试题-Spring框架
Spring框架 1. BeanFactory和ApplicationContext有何区别 BeanFactory是Spring最底层的接口,是IoC的核心,定义IoC的基本功能。 BeanFactory具有:延迟实例化的特性。在启动的时候,不会实例化Bean,只有有需要从容器…...

【计算机物理模拟】-力矩、转动惯量和角速度之间的关系
力矩和角速度之间的关系可以通过牛顿第二定律和角动量定理来描述。 牛顿第二定律表明,物体的加速度与作用在物体上的合力成正比,加速度的方向与合力的方向相同。而对于旋转运动的物体,其加速度可以表示为半径 rrr 乘以角加速度 α\alphaα&a…...

async和await用法理解和快速上手 , 同步任务和异步任务顺序安排和轻松理解 , js代码执行顺序表面知道
学习关键语句 : async , await 用法 await 怎么使用 同步任务和异步任务 微任务和宏任务 js中代码执行顺序 写在前面 虽然说 async 和 await 是 Promise 的语法糖 , 但是用惯了Promise 的人(我) , 还真不能超快速使用上这个语法糖 , 所以赶紧写一篇文章出来让各位了解了解这个…...

Linux下java服务占用cpu过高如何处理
Linux下java服务占用cpu过高如何处理 top命令查看进程信息 top按下shiftp,按cpu使用率排行,可见进程1932占用最高,并且是一个java服务 使用jps命令确认java服务 [rootVM-16-16-centos ~]# jps 1011 Jps 9462 yuan_back-0.0.1-SNAPSHOT.jar 1932 spigot-1.18.jar查找异常进程中…...

ros下用kinectv2运行orbslam2
目录 前提 创建工作空间 orbslam2源码配置、测试: 配置usb_cam ROS功能包 配置kinect 前提 vim 、 cmake 、 git 、 gcc 、 g 这些一般都装了 主要是Pangolin 、 OpenCV 、 Eigen的安装 18.04建议Pangolin0.5 创建工作空间 我们在主目录下创建一个catkin_…...

MVP简单模型搭建【架构】
MVP简介 MVP是一种项目架构设计模式(说白了就是我们产品的一种设计方案) 其实MVP本质 就是将View和Model完全隔离,通过Presenter统一调度管理(Presenter扮演着中介的角色)传统的设计思路是我们直接跟房东谈࿰…...

若依ruoyi框架实现目录树与查询页面联动
目录1、业务场景2、前端api.js修改index.vue修改template修改script修改3、后端controllerserviceimpldomainentitytreeselect1、业务场景 后管页面实现目录数与查询页面的联动,类似若依框架用户管理页面。 2、前端 api.js修改 在原有的js文件里配置目录树的查…...

Laravel框架学习笔记——Laravel环境配置及安装(Ubuntu20.04为例)
目录引言1、安装Nginx2、安装PHP3、安装Composer4、搭建Laravel框架项目5、修改Nginx映射6、安装MySQL引言 好久没写博客了,因为个人需要, 所以要涉及到Laravel框架的学习,所以会出一系列的关于PHP的Laravel框架学习笔记,希望能够…...

模拟百度翻译-课后程序(JAVA基础案例教程-黑马程序员编著-第六章-课后作业)
【案例6-5】 模拟百度翻译 【案例介绍】 1.任务描述 大家对百度翻译并不陌生,本案例要求编写一个程序模拟百度翻译。用户输入英文之后搜索程序中对应的中文,如果搜索到对应的中文就输出搜索结果,反之给出提示。本案例要求使用Map集合实现英…...

自然语言处理(NLP)之求近义词和类比词<MXNet中GloVe和FastText的模型使用>
这节主要就是熟悉MXNet框架中的两种模型:GloVe和FastText的模型(词嵌入名称),每个模型下面有很多不同的词向量,这些基本都来自wiki维基百科和twitter推特这些子集预训练得到的。我们只需要导入mxnet.contrib中的text模块即可,这里…...

2023年CDGA考试-第13章-数据质量(含答案)
2023年CDGA考试-第13章-数据质量(含答案) 单选题 1.在导致数据质量问题的常见原因中关于数据输入问题以下描述正确的是: A.数据采集端缺乏数据质量管控 B.相同字段重复设计导致数据不一致 C.缺乏数据采集规范的制定 D.所有描述都正确 答案 D 2.数据质量计划应将其范围限…...

ASEMI高压MOS管ASE65R330参数,ASE65R330图片
编辑-Z ASEMI高压MOS管ASE65R330参数: 型号:ASE65R330 漏极-源极电压(VDS):650V 栅源电压(VGS):20V 漏极电流(ID):12.5A 功耗(P…...

LeetCode动态规划经典题目(九):子序列、子数组问题
目录 31. LeetCode674. 最长连续递增序列 32. LeetCode18. 最长重复子数组 33. LeetCode1143. 最长公共子序列 34. LeetCode1035. 不相交的线 35. LeetCode53. 最大子数组和 36. LeetCode392.判断子序列 37. LeetCode115. 不同的子序列 38. LeetCode583. 两个字符串的删…...

如何利用有限的数据发表更多的SCI论文?——利用ArcGIS探究环境和生态因子对水体、土壤和大气污染物的影响
SCI的写作和发表是科研人提升自身实力和实现自己价值的必要途径。“如何利用有限的数据发表更多的SCI论文?”是我们需要解决的关键问题。软件应用只是过程和手段,理解事件之间的内在逻辑和寻找事物之间的内在规律才是目的。如何利用有限的数据发表更多的…...

六【 SpringMVC框架】
一 SpringMVC框架 目录一 SpringMVC框架1.什么是MVC2.SpringMVC概述3.SpringMVC常见开发方式4.SpringMVC执行流程5.SpringMVC核心组件介绍6.快速构建Spring MVC程序✅作者简介:Java-小白后端开发者 🥭公认外号:球场上的黑曼巴 🍎个…...

【BBuf的CUDA笔记】八,对比学习OneFlow 和 FasterTransformer 的 Softmax Cuda实现
0x1. OneFlow/FasterTransformer SoftMax CUDA Kernel 实现学习 这篇文章主要学习了oneflow的softmax kernel实现以及Faster Transformer softmax kernel的实现,并以个人的角度分别解析了原理和代码实现,最后对性能做一个对比方便大家直观的感受到onefl…...

python 类对象的析构释放代码演示
文章目录一、类的构造函数与析构函数二、代码演示1. 引用的更迭2. 只在函数内部的类对象三、函数内部返回的类对象1. 使用全局变量 引用 函数内部的类对象一、类的构造函数与析构函数 init 函数是python 类的构造函数,在创建一个类对象的时候,就会自动调…...

Hadoop Shell常用命令
Hadoop Shell命令在管理HDFS的时候还是比较常用的,Hadoop Shell命令与shell命令极为相似,但是方便查询,在这里总结分享,大家enjoy~~ 1,cat 语法格式:hadoop fs -cat URI [URI …] 含义:将路径…...

Android中级——色彩处理和图像处理
色彩处理 通过色彩矩阵处理 色彩矩阵介绍 图像的RGBA可拆分为一个4行5列的矩阵和5行1列矩阵相乘 其中4行5列矩阵即为ColorMatrix,可通过调整ColorMatrix间接调整RGBA 第一行 abcde 决定新的 R第二行 fghij 决定新的 G第三行 klmno 决定新的 G第四行 pqrst 决定新…...

C++类和对象:类的定义、类对象的存储、this指针
目录 一. 对于面向过程和面向对象的认识 二. 类 2.1 struct关键字定义类 2.1.1 C语言中的struct关键字 2.1.2 C中的struct关键字 2.2 class关键字 2.1 使用class关键字定义类 三. 类的访问限定及封装 3.1 类的访问权限及访问限定符 3.1.1 访问权限 3.1.2 访问限定…...

代码随想录算法训练营第三十九天 | 62.不同路径,63. 不同路径 II
一、参考资料不同路径https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84.html 视频讲解:https://www.bilibili.com/video/BV1ve4y1x7Eu不同路径 IIhttps://programmercarl.com/0063.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84II.htmlhttps://progr…...

数据库复习3
一. 简答题(共1题,100分) 1. (简答题) 存在数据库test,数据库中有如下表: 1.学生表 Student(Sno,Sname,Sage,Ssex) --Sno 学号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 主键Sno 2.教师表 Teacher(Tno,Tname) --T…...

顺序表的增删查改
数据结构 是数据存储的方式,对于不同的数据我们要采用不同的数据结构。就像交通运输,选用什么交通工具取决于你要运输的是人还是货物,以及它们的数量。 顺序存储结构 包括顺序表、链表、栈和队列等。 例如腾讯QQ中的好友列表,…...

jupyter matplotlib中文乱码解决
中文乱码可能有两种情况 1. matplotlib里面有中文字体 2. 没有中文字体 查看是否有中文字体: # 查询当前系统所有字体 from matplotlib.font_manager import FontManager import subprocessmpl_fonts = set(f.name for f in FontManager().ttflist)print(all font list get f…...

Smtplib之发邮件模块
目录 创建Smtp对象 Smtp类中的方法 MIME MIMEBase MIMEBase MIMEMultipart MIMEApplication MIMEAudio MIMEImage MIMEText 实例 texthtml格式 发送带图片附件的邮件 发送带附件的邮件 含多种格式 SMTP模块 SMTP 简单传输协议,它是一组用于由源…...

Android 适配手机和平板
一、屏幕适配限定符Android 系统加载应用资源时 , 会根据当前运行应用的设备的相关属性 , 如 : 屏幕尺寸 / 屏幕像素密度 / 宽高比 / 屏幕方向 等属性 , 加载不同的屏幕适配限定符目录下的资源 ;如 : 横竖屏切换时 , res/layout-land 目录中 , 存放的是横屏布局 , res/layout-p…...

时序预测 | MATLAB实现LSTM-SVR(长短期记忆神经网络-支持向量机)时间序列预测
时序预测 | MATLAB实现LSTM-SVR(长短期记忆神经网络-支持向量机)时间序列预测 目录时序预测 | MATLAB实现LSTM-SVR(长短期记忆神经网络-支持向量机)时间序列预测效果一览基本介绍模型介绍LSTM模型SVR模型LSTM-SVR模型程序设计参考资料致谢效果一览 基本介绍 本次运行测试环境MA…...

分阶段构建golang运行环境Dockerfile镜像
在开始这项工作之前大家可以先去看一下docker官方给出关于空镜像scratch的说明,采用官方简单的一句话就是:scratch是一个明确的空图像,特别是对于“从头开始”构建图像。分阶段构建镜像就会用到scratch这个空镜像,这样的好处是可以…...

Vue-cli脚手架在做些什么(源码角度分析)
什么是Vue脚手架?在学习初期,我们的项目往往需要借助webpack、vite等打包工具配置Vue的开发环境,但是在真实开发中我们不可能每个项目从头来完成所有的webpack配置,这样显得开发的效率会大大的降低;所有的真实开发中&a…...

【Nginx】|入门连续剧——安装
作者:狮子也疯狂 专栏:《Nginx从入门到超神》 坚持做好每一步,幸运之神自然会降临在你的身上 目录一. 🦁 前言Ⅰ. 🐇 为啥我们要使用Nginx?二. 🦁 搭建流程Ⅰ. 🐇 环境准备Ⅱ. &…...