spring笔记
spring 和 springboot的区别
自动配置原理
beanFactory接口和ApplicationContext接口
两个都是 IOC 容器
ApplicationContext接口是BeanFactory接口实现类的子类
功能:
ApplicationContext扩展BeanFactory
BeanFactory | ApplicationContext |
---|---|
控制反转 | 国际化支持 (MessageSource) |
依赖注入 | 资源访问 (ResourcePatternResolver根据通配符匹配文件) |
读取环境信息(EnvironmentCapable ) | |
bean生命周期的全部功能: 读取bean配置文档,管理bean的定义,加载,实例化,维护bean之间的依赖关系,负责bean的声明周期 | 发布事件(ApplicationEventPublisher),事件传递 :通过实现ApplicationContextAware接口。 |
区别:
BeanFactory | ApplicationContext |
---|---|
功能需要以编程的方式实现 | 通过配置的方式实现 |
Spring里面最底层的接口,是IoC的核心 | 一般直接使用ApplicationContext |
手动注册BeanPostProcessor | 自动注册BeanPostProcessor |
延迟加载:在使用某个Bean时(调用getBean()),才对该Bean进行加载实例化,注入Bean。不能提前发现Spring的配置问题。调用getBean方法时会抛出异常。 | 在容器启动时,一次性创建了所有的Bean,预先载入。可以发现Spring中的配置错误,利于检查所依赖属性是否注入。运行时速度比较快,但占用内存空间,当应用程序配置Bean较多时,程序启动较慢。 |
实现
-
BeanFactory :先解析bean,将描述信息存入map,getBean时调用构造方法,实例化bean
对BeanFactory 添加BeanFactoryPostProcessor,补充bean的定义
对bean添加BeanPostProcessor,针对bean生命周期的各个阶段进行扩展BeanFactoryPostProcessor 是在 Spring 容器加载了定义 bean 的 XML 文件之后,在 bean 实例化之前执行的。读取配置元数据,并且可以修改
BeanPostProcessor 可以在 spring 容器加载了 bean 的定义文件并实例化 bean 之后,在执行 bean 的初始化方法前后,添加一些自己的处理逻辑。 有排序逻辑
初始化方法:
bean 实现 了 InitializingBean 接口,对应的方法为 afterPropertiesSet 。
在 XML 文件中定义 bean 的时候,标签有个属性叫做 init-method,来指定初始化方法。
BeanPostProcessor 的执行顺序是在 BeanFactoryPostProcessor 之后。 -
BeanFactory
- 不会主动调用BeanFactoryPostProcessor
- 不会主动添加BeanPostProcessor
- 不会主动初始化单例
- 不会解析BeanFactory
- 不会解析${} #{}
事务
事务隔离
Isolation.DEFAULT:默认的事务隔离级别,以连接的数据库的事务隔离级别为准。
Isolation.READ_UNCOMMITTED:读未提交,可以读取到未提交的事务,存在脏读。
Isolation.READ_COMMITTED:读已提交,只能读取到已经提交的事务,解决了脏读,存在不可重复读。
Isolation.REPEATABLE_READ:可重复读,解决了不可重复读,但存在幻读(MySQL 数据库默认的事务隔离级别)。
Isolation.SERIALIZABLE
传播行为
@transactional原理
通过aop的方式进行管理。动态代理
以 @Transactional 注解为植入点的切点,@Transactional注解标注的方法需要被代理。
在spring的bean的初始化过程中,就需要对实例化的bean进行代理,并且生成代理对象。
@Transactional注解的切面逻辑类似于@Around,
失效:
- @Transactional修饰的方法为非public方法, static final 也不行
失败的原理是:@Transactional是基于动态代理来实现的,非public的方法,他@Transactional的动态代理对象信息为空,所以不能回滚。 - 在类内部没有添加@Transactional的方法,调用了@Transactional方法时。
@Transactional是基于动态代理对象来实现的,而在类内部的方法的调用是通过this关键字来实现的,没有经过动态代理对象,所以事务回滚失效。 - @Transactional方法内部捕获了异常,没有在catch代码块里面重新抛出异常,事务也不会回滚。
相关文章:

spring笔记
spring 和 springboot的区别 自动配置原理 beanFactory接口和ApplicationContext接口 两个都是 IOC 容器 ApplicationContext接口是BeanFactory接口实现类的子类 功能: ApplicationContext扩展BeanFactory BeanFactoryApplicationContext控制反转国际化支持 …...
最大熵模型
最大熵模型(maximum entropy model)由最大熵原理推导实现 最大熵原理 最大熵原理是概率模型学习的一个准则。最大熵原理认为,学习概率模型时,在所有可能的概率模型(分布)中,熵最大的模型时最好…...
微服务中网关的配置
一、添加 Spring Cloud Gateway 依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId> </dependency>二、配置网关路由 在application.yaml中配置如下内容:…...

Linux基本指令实现4及热键指令详解
目录 Linux热键补充: 1.bc指令: Tab键的智能补充: ctrlc键: uname指令: lscpu指令: lsmem指令: df -h指令: 关机指令: 扩展指令: Linux热键补充&#…...

系统调用与API
系统调用介绍 什么是系统调用 为了让应用程序有能力访问系统资源,也为了让程序借助操作系统做一些由操作系统支持的行为,每个操作系统都会提供一套接口,以供应用程序使用。系统调用涵盖的功能很广,有程序运行所必需的支持…...

OpenPCDet系列 | 5.4.1 DenseHead中的AnchorGenerator锚框生成模块
文章目录 AnchorGenerator模块AnchorGenerator.generate_anchors函数 AnchorGenerator模块 首先,根据点云场景将其划分为一个个grid,这个grid size是可以通过配置文件设定的点云场景方位和voxel大小计算出来的。 POINT_CLOUD_RANGE: [0, -39.68, -3, 6…...

【开发者指南】如何在MyEclipse中使用HTML或JSP设计器?(上)
MyEclipse v2022.1.0正式版下载 一、HTML & JSP 可视化设计器 本文简要介绍了 MyEclipse HTML 和 JSP Web 设计器的概念、功能和基本操作过程。这两个设计器具有相似的功能和相同的操作模型,但本文为专门针对其类型的内容。本文档中的示例是使用 MyEclipse HT…...
Node开发Web后台服务
简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。 能方便地搭建响应速度快、易于扩展的网络应用&#…...
Linux下对mmap封装使用
Linux下对mmap封装使用 1、mmap简介2、Linux下mmap使用介绍2.1、mmap函数2.2、munmap函数 3、对mmap进行封装4、对封装类MEM_MAP进行测试5、mmap原理6、源代码下载 1、mmap简介 mmap即memory map,是一种内存映射文件的技术。mmap可以将一个文件或者其它对象映射到进…...

深入了解云计算:发展历程、服务与部署模型、未来趋势与挑战
开篇博主 bluetata 的观点:PaaS 服务必将是未来10年云计算权重最高的趋势(05/02/2023 15:32) 文章目录 一、前言二、认识了解云计算2.1 什么是云计算2.1.1 维基百科上的云计算定义2.1.2 NIST 标准云计算定义2.1.3 如果被面试如何解释云计算 2…...
使用乐鑫 Web IDE 助力物联网开发
乐鑫 Web IDE 是基于 Eclipse Theia 的框架,支持 ESP-IDF VS Code 插件同时具备多项辅助工具。您可以观看我们在 Espressif DevCon22 上的演示视频,了解它的实际应用。 【乐鑫开发者大会-21】搭载 ESP-IDF Visual Studio Code 插件的乐鑫 …...
Maven(5)---Maven的部署和发布
Maven的部署和发布 在前面的博客中,我们已经学习了Maven的基础知识、依赖管理、插件和生命周期,以及多模块项目管理。本篇博客将介绍Maven的部署和发布功能。 什么是部署和发布 在软件开发过程中,部署和发布是非常重要的环节。部署是指将软…...

内网渗透之权限维持-黄金白银票据隐藏账户远控-RustDeskGotoHTTP
0x01权限维持-隐藏用户 CreateHiddenAccount工具 CreateHiddenAccount -u test -p Psswrd用户管理能查看到,命令查看看不到,单机版无法删除(不在任何组),域环境(在administrator组中)可以删除 0x02权限维持-黄金白银票据 ⻩⾦票据⽣成攻…...
动态规划——带权活动选择
带权活动选择Time Limit: 3000 MSMemory Limit: 1000 KB Description 给定n个活动,活动ai表示为一个三元组(si,fi,vi),其中si表示活动开始时间,fi表示活动的结束时间,vi表示活动的权重, si<fi。带权活动选择问题是选择一些活…...

软考A计划-真题-分类精讲汇总-第十八章(面向对象程序设计)
点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…...

【C++ 入坑指南】(09)数组
文章目录 简介一维数组1. 定义2. 特点3. 用途4. 示例 二维数组1. 定义2. 用途3. 示例 简介 C 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。 一维数组 1. 定义…...

Vue.js
文章目录 Vue(前端框架)data基本语法v-bind(属性)v-if(条件)v-formethods事件v-model表单绑定todolist(添加删除展示内容,含上下移动)es6语法生命周期函数axios发送ajax请…...

博士毕业答辩流程 注意事项
前言:2023年5月17日14:00-17:00,与实验室其他同学一起旁听了本实验室的博士论文答辩。接下来,我对博士毕业答辩的大致流程进行简要介绍,并对个环节的注意事项进行总结归纳,供毕业生参考。 目录 1. 准备阶段2. 汇报期间…...
拼多多开放平台订单详情接口解析
API接口订单接口是指用于实现订单相关操作的程序接口。通过这个接口,用户可以实现创建、修改、查询和取消订单等功能。 常见的API接口订单接口包括: 创建订单接口,用于实现用户下单操作。 修改订单接口,用于修改已有订单信息。 …...

如何把ipa文件(iOS安装包)安装到iPhone手机上? 附方法汇总
苹果APP安装包ipa如何安装在手机上?很多人不知道怎么把ipa文件安装到手机上,这里就整理了苹果APP安装到iOS设备上的方式,仅供参考 苹果APP安装包ipa如何安装在手机上?使用过苹果手机的人应该深有感触,那就是苹果APP安…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...

企业大模型服务合规指南:深度解析备案与登记制度
伴随AI技术的爆炸式发展,尤其是大模型(LLM)在各行各业的深度应用和整合,企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者,还是积极拥抱AI转型的传统企业,在面向公众…...

Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...
前端工具库lodash与lodash-es区别详解
lodash 和 lodash-es 是同一工具库的两个不同版本,核心功能完全一致,主要区别在于模块化格式和优化方式,适合不同的开发环境。以下是详细对比: 1. 模块化格式 lodash 使用 CommonJS 模块格式(require/module.exports&a…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...