Spring-3

目录

Spring AOP和AspectJ AOP

在Spring AOP 中,关注点和横切关注的区别

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

Spring 是怎么解决循环依赖的?

事务隔离级别

事务的传播级别

Spring 事务实现方式

Spring框架的事务管理有哪些优点

事务注解的本质


Spring AOP和AspectJ AOP

Spring AOP是属于运行时增强,而AspectJ是编译时增强。Spring AOP基于代理(Proxying),而

AspectJ基于字节码操作(Bytecode Manipulation)。

Spring AOP已经集成了AspectJ,AspectJ应该算得上是Java生态系统中最完整的AOP框架了。

AspectJ相比于Spring AOP功能更加强大,但是Spring AOP相对来说更简单。

如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择AspectJ,它比

SpringAOP快很多。

在Spring AOP 中,关注点和横切关注的区别

关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。 横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。

那什么是连接点呢?连接点代表一个应用程序的某个位置,在这个位置我们可以插入一个AOP切面,它实际上是个应用程序执行Spring AOP的位置。切入点是什么?切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。

通知

通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。

Spring切面可以应用五种类型的通知:

before:前置通知,在一个方法执行前被调用。

after: 在方法执行之后调用的通知,无论方法执行是否成功。

after-returning: 仅当方法成功完成后执行的通知。

after-throwing: 在方法抛出异常退出时执行的通知。

around: 在方法执行之前和之后调用的通知。

Spring的IOC

(1)IOC就是控制反转,是指创建对象的控制权的转移。以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到Spring容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系。对象与对象之间松散耦合,也利于功能的复用。DI依赖注入,和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖IoC容器来动态注入对象需要的外部资源。

(2)最直观的表达就是,IOC让对象的创建不用去new了,可以由spring自动生产,使用java的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法的。

(3)Spring的IOC有三种注入方式 :构造器注入、setter方法注入、根据注解注入。

IoC让相互协作的组件保持松散的耦合,而AOP编程允许你把遍布于应用各层的功能分离出来

形成可重用的功能组件。

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


Spring 框架并没有对单例 Bean 进行任何多线程的封装处理。
关于单例 Bean 的线程安全和并发问题,需要开发者自行去搞定。
单例的线程安全问题,并不是 Spring 应该去关心的。Spring 应该做的是,提供根据配置,创建单例 Bean 或多例 Bean 的功能。
当然,但实际上,大部分的 Spring Bean 并没有可变的状态,所以在某种程度上说 Spring 的单例Bean 是线程安全的。如果你的 Bean 有多种状态的话,就需要自行保证线程安全。最浅显的解决办法,就是将多态 Bean 的作用域(Scope)由 Singleton 变更为 Prototype。


Spring 是怎么解决循环依赖的?


整个流程大致如下:

  1. 首先 A 完成初始化第一步并将自己提前曝光出来(通过 ObjectFactory 将自己提前曝光),在
    初始化的时候,发现自己依赖对象 B,此时就会去尝试 get(B),这个时候发现 B 还没有被创建
    出来;
  2. 然后 B 就走创建流程,在 B 初始化的时候,同样发现自己依赖 C,C 也没有被创建出来;
  3. 这个时候 C 又开始初始化进程,但是在初始化的过程中发现自己依赖 A,于是尝试 get(A)。这
    个时候由于 A 已经添加至缓存中(一般都是添加至三级缓存 singletonFactories),通过
    ObjectFactory 提前曝光,所以可以通过 ObjectFactory#getObject() 方法来拿到 A 对象。C 拿
    到 A 对象后顺利完成初始化,然后将自己添加到一级缓存中;
  4. 回到 B,B 也可以拿到 C 对象,完成初始化,A 可以顺利拿到 B 完成初始化。到这里整个链路
    就已经完成了初始化过程了。
    关键字:三级缓存,提前曝光

事务隔离级别

事务隔离级别是数据库系统中的一个重要概念,它定义了并发事务之间数据可见性的规则,以确保数据的一致性和完整性。以下是数据库系统中常见的四种事务隔离级别:

  1. 读未提交(Read Uncommitted):这是最低的隔离级别,允许一个事务读取到另一个未提交事务修改的数据,可能导致脏读、不可重复读和幻读等问题。
  2. 读已提交(Read Committed):事务只能读取已经提交的数据,这样可以避免脏读问题,但仍然可能存在不可重复读和幻读问题。
  3. 可重复读(Repeatable Read):在可重复读隔离级别下,一个事务在执行过程中多次读取相同的数据时,能够保证数据不会被其他事务修改,从而避免脏读和不可重复读,但仍然可能存在幻读问题。
  4. 串行化(Serializable):这是最高的隔离级别,事务会按顺序一个接一个地执行,不允许并发执行,可以避免脏读、不可重复读和幻读等并发问题,但会降低系统的并发性能。

不同的数据库管理系统可能会在这些标准隔离级别上进行微调或提供额外的隔离级别。在高并发环境下,选择合适的隔离级别是确保数据完整性和一致性的关键决策之一。不可重复读可以导致事务无法依赖于之前读取的数据,从而影响一致性。

事务的传播级别

Spring 框架支持多种事务传播级别,这些级别定义了在调用方法时如何处理当前作用域内的事务。以下是Spring支持的主要事务传播级别:

  1. PROPAGATION_REQUIRED:这是默认的事务传播级别,如果存在事务则加入该事务,如果不存在则创建一个新的事务。这个级别适用于大多数业务场景。
  2. PROPAGATION_SUPPORTS:如果上下文已经存在事务,则支持当前事务的加入;如果没有事务,则以非事务方式执行。这个级别的应用场景较少。
  3. PROPAGATION_MANDATORY:要求上下文中必须存在事务,否则会抛出异常。这个级别用于确保某些代码段在有事务的环境下执行。
  4. PROPAGATION_REQUIRES_NEW:每次都会创建一个新的事务,并挂起上下文中的事务,直到新事务执行完毕后才恢复上下文的事务。这个级别适用于那些需要在一个新事务中执行的操作。
  5. PROPAGATION_NOT_SUPPORTED:如果上下文已经存在事务,则挂起当前事务,并以非事务方式执行;如果上下文没有事务,则不执行任何操作。这个级别用于确保某些代码段在无事务的环境下执行。
  6. PROPAGATION_NEVER:上下文中不能存在事务,如果有事务则抛出异常,强制停止执行。这个级别用于防止在非事务环境下执行的事务操作。
  7. PROPAGATION_NESTED:如果上下文中已经存在事务,则嵌套事务执行;如果上下文没有事务,则创建一个新的事务并执行嵌套事务。嵌套事务在开始时会创建一个保存点,如果嵌套事务失败,可以回滚到此保存点。

这些传播级别可以根据业务需求和系统设计来选择,以确保事务的正确性和一致性。

Spring 事务实现方式

编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。

声明式事务管理:这种方式意味着你可以将事务管理和业务代码分离。你只需要通过注解或者XML配置管理事务。

Spring框架的事务管理有哪些优点

  1. 它为不同的事务API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了统一的编程模型。
  2. 它为编程式事务管理提供了一个简单的API而非一系列复杂的事务API(如JTA)
  3. 它支持声明式事务管理。
  4. 它可以和 Spring 的多种数据访问技术很好的融合。

事务三要素

数据源:表示具体的事务性资源,是事务的真正处理者,如MySQL等。

事务管理器:像一个大管家,从整体上管理事务的处理过程,如打开、提交、回滚等。

事务应用和属性配置:像一个标识符,表明哪些方法要参与事务,如何参与事务,以及一些相关属性如隔离级别、超时时间等

事务注解的本质

@Transactional 这个注解仅仅是一些(和事务相关的)元数据,在运行时被事务基础设施读取消费,并使用这些元数据来配置bean的事务行为。 大致来说具有两方面功能,一是表明该方法要参与事务,二是配置相关属性来定制事务的参与方式和运行行为

声明式事务主要是得益于Spring AOP。使用一个事务拦截器,在方法调用的前后/周围进行事务性增强(advice),来驱动事务完成。

@Transactional注解既可以标注在类上,也可以标注在方法上。当在类上时,默认应用到类里的所有方法。如果此时方法上也标注了,则方法上的优先级高。 另外注意方法一定要是public的。

原文链接:Spring-3 · 语雀

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【鸿蒙HarmonyOS开发笔记】如何使用图片插帧将低像素图片清晰放大

开发UI时,当我们的原图分辨率较低并且需要放大显示时,图片会模糊并出现锯齿。如下图所示 这时可以使用interpolation()方法对图片进行插值,使图片显示得更清晰。该方法的参数为ImageInterpolation枚举类型,可选的值有: ImageInte…

Git 仓库瘦身与 LFS 大文件存储

熟悉 Git 的小伙伴应该都知道随着 Git 仓库维护的时间越来越久,追踪的文件越来越多,git 存储的 objects 数量会极其庞大,每次从远程仓库 git clone 的时候都会墨迹很久。如果我们不小心 git add 了一个体积很大的文件,且 git push…

从历年315曝光案例,看APP隐私合规安全

更多网络安全干货内容:点此获取 ——————— 随着移动互联网新兴技术的发展与普及,移动APP的应用渗透到人们的衣食住行方方面面,衍生出各类消费场景的同时,也带来了无数的个人隐私数据泄露、网络诈骗事件。 历年来&#xff…

python 调用redis创建查询key

部署redis apiVersion: apps/v1 # 描述api版本,默认都用这个 kind: Deployment # 资源类型,可以配置为pod,deployment,service,statefulset等等 metadata: # deployment相关的元数据,用于描述deployment的…

分享一个不错的three.js开源项目

项目将three.js相关内容封装为相应库 很值得学习,可以模仿项目学习three.js vue-vite-three.js threejs-park: 基于vue3,threeJS智慧园区 threejs-park

Java八股文(XXL-JOB)

Java八股文のXXL-JOB XXL-JOB XXL-JOB xxl-job 是什么?它的主要作用是什么? xxl-job 是一款分布式任务调度平台,用于解决分布式系统中的定时任务和异步任务调度问题。 它提供了任务的注册、调度、执行和监控等功能,能够帮助开发者…

测试进阶必备,这5款http接口自动化测试工具不要太香~

现在市场上能做接口自动化测试的工具有很多,一搜一大把,让人眼花缭乱。我们去选择对应实现方式时,不管是框架体系还是成熟稳定的工具,核心目的都是期望引入的技术能在最低投入的情况下达到最优效果。 那么我们选择依据出来了&…

08|记忆:通过Memory记住客户上次买花时的对话细节

无论是LLM还是代理都是无状态的,每次模型的调用都是独立于其他交互的。也就是说,我们每次通过API开始和大语言模型展开一次新的对话,它都不知道你其实昨天或者前天曾经和它聊过天了。 使用ConversationChain from langchain import OpenAI…

数据分析-Pandas的Andrews曲线可视化解读

数据分析-Pandas的Andrews曲线可视化解读 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据…

在浏览器中使用websocket协议

在浏览器中使用websocket协议 浏览器中提供了 WebSocket 类,我们可以直接使用: new WebSocket((url: string | URL, protocols?: string | string[] | undefined))url:指定连接的 URL,只支持 ws、wss 协议,否则会提…

Transformer总结

1.Transform背景介绍 1.1Transform的优势 相比于之前占领市场的LSTM和GRU模型,Transformer有两个显著的优势: (1)Transform能够使用分布式GPU进行并行训练,提升模型训练效率 (2) 在分析预测…

springboot280基于WEB的旅游推荐系统设计与实现

旅游推荐系统设计与实现 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装旅游推荐系统软件来发挥其高效地信息处理…

Tensorflow2.0 - 链式法则例子

本笔记简单记录链式法则的原理,关于链式法则,本身和高等数学中的链式求导法则是一样的,深度学习中相关资料可以参考这里: 【深度学习之美22】BP算法详解之链式法则 - 知乎10.5 什么是计算图?我们知道, 神经…

SpringBoot(拦截器+文件上传)

文章目录 1.拦截器1.基本介绍2.应用实例1.去掉Thymeleaf案例中使用session进行权限验证的部分2.编写自定义拦截器 LoginInterceptor.java 实现HandlerInterceptor接口的三个方法3.注册拦截器1.第一种方式 配置类直接实现WebMvcConfigurer接口,重写addInterceptors方…

RBAC用户权限控制

用资源和操作绑定角色,角色绑定用户和操作 对应 两两绑定需要中间表来绑定 RestController public class UserAuthApi {Autowiredprivate UserSupport userSupport;Autowiredprivate UserAuthService userAuthService;GetMapping("/user-authorities")pu…

使用Navicat远程连接Linux中的MySQL

一、登录MySQL数据库 mysql -uroot -pXjm123456 二、使用mysql数据库 use mysql; 三、查询user表中包含host的字段 select user,host from user;### 该字段中,localhost表示只允许本机访问,可以将‘localhost’改为‘%’,‘%’表…

汇总全网免费API,持续更新(新闻api、每日一言api、音乐。。。)

Public&FreeAPI 网址:apis.whyta.cn (推荐) UomgAPI 网址:https://api.uomg.com 教书先生 网址:https://api.oioweb.cn/ 山海API https://api.shserve.cn/ 云析API铺 https://api.a20safe.com/ 韩小韩…

小鹏MONA将至:10 - 15万级,用性价比打新势力,用智驾打比亚迪

‍ 作者 |老缅 编辑 |德新 小鹏的全新品牌即将发布,10-15万级也能有高等级智能驾驶。 3月16日在中国电动汽车百人会论坛2024上,小鹏汽车董事长、CEO何小鹏提出:“下一个十年将是智能化的十年。未来18个月内高阶智驾的拐点将到来”。 所谓…

数据机构-2

线性表 概念 顺序表 示例&#xff1a;创建一个存储学生信息的顺序表 表头&#xff08;Tlen总长度&#xff0c; Clen当前长度&#xff09; 函数 #include <seqlist.c> #include <stdio.h> #include <stdlib.h> #include "seqlist.h" #include &…