后端框架(3):Spring(2)

AOP

概述:AspectOrientedProgramming 面向切面编程:是对面向对象编程的补充延续,面向切面编程思想是将程序中非业务代码(提交事务,打印日志,权限验证,统一异常处理)

然后在调用业务代码时,通过一个代理对象帮助我们调用这些提取出来的非业务代码,这样在业务代码不用显示的调用非业务代码,做到的业务代码和非业务代码的分离,降低了耦合度。

        好处:模块之间的耦合度降低了

        原理:动态代理模式 给业务代码生成代理对象

AOP的基本概念

    连接点(Joinpoint):类中可以被增强(加功能)的方法,这个方法就被称为连接点

    切入点(pointcut):类中有很多方法可以被增强,但实际中只有add和update 被增了,那么add和update方法就被称为切入点(实际实现的连接点)

    通知(Advice): 通知是指一个切面在特定的连接点要做的事情(增强的功能)。通知分为方法执行前通知,方法执行后通知,环绕通知等.

    目标(Target): 代理的目标对象(连接点,切入点所在类)

    代理(Proxy): 向目标对象应用通知时创建的代理对象

springAOP 实现

        在pom.xml文件中导入AOP相关的jar包(AspectJ)

<!--spring aop--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.2.2.RELEASE</version></dependency> 

        在spring.xml文件中配置开启AspectJ的自动代理

<!--开启自动代理--><aop:aspectj-autoproxy />

AspectJ中常用的通知有五种类型:

        通知,向连接点添加的功能

注解实例:

  1.@before()

        @Before() 前置通知 在业务方法执行之前调用执行

/*execution:表达式的主体第一处*:返回的类型(这里代表所有类型)com.ffyc.springpro.dao:拦截的包名第二处*:类名第三处*:方法名(..):表示方法的参数,".."表示任意参数
*/@Before("execution(* com.ffyc.springpro.dao.*.*(..))")
public void printlog(){System.out.println("打印日志");}

                        

2.@After()

        @After() 后置通知 在业务方法执行完后调用执行 即使业务代码中出现了异常,也会执行

@After("execution(* com.ffyc.springpro.dao.*.*(..))")
public void printlog(){System.out.println("打印日志");}

                       

3.@AfterReturning()

         @AfterReturning() 返回通知 在业务方法执行完后再执行 当业务代码中出现了异常,不会执行

 public void insert(){System.out.println("新增");System.out.println(10/0);}
@AfterReturning("execution(* com.ffyc.springpro.dao.*.*(..))")public void printlog(){System.out.println("打印日志");}

4.@AfterThrowing()

         @AfterThrowing() 异常通知 当业务代码出现异常时,调用执行

 public void insert(){System.out.println("新增");System.out.println(10/0);}
@AfterThrowing(value = "execution(* com.ffyc.springpro.dao.*.*(..))",throwing = "e")public void exception(Throwable e){System.out.println("系统忙"+e.getMessage());e.printStackTrace();}

前四个注解为一组,一并使用。

5.@Around()

        @Around 环绕通知 可以在业务方法执行之前,之后,出异常时添加功能

@Around(value = "execution(* com.ffyc.springpro.dao.*.*(..))")public void around(ProceedingJoinPoint joinPoint){//ProceedingJoinPoint joinPoint 表示的是目标方法System.out.println("前置通知");try {Object[] obj = joinPoint.getArgs();//获取目标方法的参数System.out.println(Arrays.toString(obj));Object object = joinPoint.proceed();//调用目标业务方法System.out.println("返回通知");} catch (Throwable throwable) {throwable.printStackTrace();System.out.println("异常通知");}System.out.println("后置通知");}

        

第五种@around注解相当于将前四个注解做的一个集合。

Spring 事物管理

    事务管理本质上是数据库提供的一种管理机制。

        数据库事务管理是对一次数据库操作过程中执行的多条语句进行管理。

        确保一次操作过程中的多条sql语句要么都执行成功,要么都不执行,从而保证数据一致性。

                例如:转账: sql1 A-500 sql2 B+500 确保转账数据的一致

    spring事务管理是spring框架对事务提交这一功能进行封装,程序员在业务开发中不需要显示的提交事务。

Spring中的事务管理分为两种方式:

1、编程式事务管理

        需要程序员在代码中自己控制事务提交和回滚

2、声明式事务管理

        声明事务底层使用了AOP思想,可以为方法添加事务功能,它的控制是方法级别的

        基于注解实现的spring事务管理 Spring 框架,提供事物管理实现类是DataSourceTransactionManager.

        在spring.xml文件中配置以下两个步骤

       1.配置事物管理器
<!-- 配置spring 事务管理器--><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="druidDataSource"></property></bean>
        2.开启注解事务管理
<!-- 开启注解事务管理--><tx:annotation-driven transaction-manager="transactionManager"/>

        在类或方法上使用@Transactional标签即可.

        @Transactional 可以添加在方法上,也可以添加到类上面

                                 如果添加在类上面,此类中的所有方法都在spring事务管理中运行

        声明式事务失效的情况

         1.@Transactional 用在非public修饰的方法上

         2.方法中的异常被捕获了,认为方法没有异常

         3.方法中出现编译期异常,还是会提交事务 解决方案:@Transactional(rollbackFor = Exception.class)

         4.数据库引擎不支持事务 mysql中只有innodb引擎支持事务的

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

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

相关文章

Vue3中setup运行时机介绍

在 Vue3 中&#xff0c;直接写在 <script setup>...</script> 中的代码运行时机可以分为以下几个关键阶段&#xff1a; 一、执行顺序层级 #mermaid-svg-bF3p98MiNdLfcoSG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#33…

Ubuntu快速安装Python3.11及多版本管理

之前文章和大家分享过&#xff0c;将会出一篇专栏&#xff08;从电脑装ubuntu系统&#xff0c;到安装ubuntu的常用基础软件&#xff1a;jdk、python、node、nginx、maven、supervisor、minio、docker、git、mysql、redis、postgresql、mq、ollama等&#xff09;&#xff0c;目前…

裸金属服务器和云服务器之间的差别

裸金属服务器能够直接在硬件上运行&#xff0c;不需要额外的虚化层&#xff0c;让每个应用程序或者是服务都能够在实际的硬件上运行&#xff0c;不需要和其他虚拟服务器来共享资源&#xff1b;而云服务器作为一种虚拟服务器&#xff0c;是通过虚拟化技术为企业提供一个独立的计…

C++ 中的几种锁机制整理

1. 互斥锁&#xff08;std::mutex&#xff09; ✅ 简介 最常用的线程同步工具。保证同一时间只能有一个线程访问临界区。 ✅ 使用方式 #include <mutex>std::mutex mtx;void safeFunction() {std::lock_guard<std::mutex> lock(mtx);// 临界区代码 }✅ 优点 简…

Graph Representation Learning【图最短路径优化/Node2vec/Deepwalk】

文章目录 Q1&#xff1a;网络性质&#xff1a;1.数据读取与邻接表构建&#xff1a;2.基本特征和连通性&#xff1a; 算法思路&#xff1a;1. 广度优先搜索&#xff08;BFS&#xff09;标记前驱:2. 回溯生成所有最短路径: 实验结果&#xff1a;复杂度分析&#xff1a; Q2&#x…

MATLAB中的概率分布生成:从理论到实践

MATLAB中的概率分布生成&#xff1a;从理论到实践 引言 MATLAB作为一款强大的科学计算软件&#xff0c;在统计分析、数据模拟和概率建模方面提供了丰富的功能。本文将介绍如何使用MATLAB生成各种常见的概率分布&#xff0c;包括均匀分布、正态分布、泊松分布等&#xff0c;并…

经典算法 (A/B) mod C

(A/B) mod C 问题描述 求(A/B)%C&#xff0c;但由于A和B实在太大了&#xff0c;我们只给出A % C&#xff0c;B % C。 (我们保证给定的A必能被B整除&#xff0c;且gcd(B,C) 1)。 输入描述 输入一行三个整数&#xff0c;分别是A % C&#xff0c;B % C&#xff0c;C。 输出…

大数据技术的主要方向及其应用详解

文章目录 一、大数据技术概述二、大数据存储与管理方向1. 分布式文件系统2. NoSQL数据库3. 数据仓库技术 三、大数据处理与分析方向1. 批处理技术2. 流处理技术3. 交互式分析4. 图计算技术 四、大数据机器学习方向1. 分布式机器学习2. 深度学习平台3. 自动机器学习(AutoML) 五、…

Deeper and Wider Siamese Networks for Real-Time Visual Tracking

现象&#xff1a; the backbone networks used in Siamese trackers are relatively shallow, such as AlexNet , which does not fully take advantage of the capability of modern deep neural networks. direct replacement of backbones with existing powerful archite…

ubuntu22.04卸载vscode

方法 1&#xff1a;通过 Snap 卸载 VSCode 如果你是通过 Snap 安装的 VSCode&#xff08;Ubuntu 22.04 默认推荐方式&#xff09;&#xff0c;按照以下步骤卸载&#xff1a; 检查是否通过 Snap 安装&#xff1a; bash snap list | grep code如果输出显示 code&#xff0c;说明…

OpenCV 背景建模详解:从原理到实战

在计算机视觉领域&#xff0c;背景建模是一项基础且重要的技术&#xff0c;它能够从视频流中分离出前景目标&#xff0c;广泛应用于运动目标检测、视频监控、人机交互等场景。OpenCV 作为计算机视觉领域最受欢迎的开源库之一&#xff0c;提供了多种高效的背景建模算法。本文将深…

Android native崩溃问题分析

最近在做NDK项目的时候&#xff0c;出现了启动应用就崩溃了&#xff0c;崩溃日志如下&#xff1a; 10:41:04.743 A Build fingerprint: samsung/g0qzcx/g0q:13/TP1A.220624.014/S9060ZCU4CWH1:user/release-keys 10:41:04.743 A Revision: 12 10:41:04.743 A ABI: arm64…

【Shell的基本操作】

文章目录 一、实验目的二、实验环境三、实验内容3.1 Shell变量与脚本基础3.2 定制终端提示符&#xff08;PS1变量&#xff09;3.3 文件查找与类型确认&#xff08;find命令&#xff09;3.4 管道命令实战&#xff08;用户登录统计&#xff09;3.5 交互式备份压缩脚本 四、总结4.…

快速选择算法:优化大数据中的 Top-K 问题

在处理海量数据时&#xff0c;经常会遇到这样的需求&#xff1a;找出数据中最大的前 K 个数&#xff0c;而不必对整个数据集进行排序。这种场景下&#xff0c;快速选择算法&#xff08;Quickselect&#xff09;就成了一个非常高效的解决方案。本文将通过一个 C 实现的快速选择算…

AQS 基本思想与源码分析

充分了解 AbstractQueuedSynchronizer 对于深入理解并发编程是有益处的&#xff0c;它是用来构建锁或者其他同步组件的基础框架&#xff0c;我们常用的同步工具类如 CountDownLatch、Semaphore、ThreadPoolExecutor、ReentrantLock 和 ReentrantReadWriteLock 内部都用到了它。…

理解位图算法:使用 C++ 实现高效数据查重

在处理海量数据时&#xff0c;我们常常需要检查某个元素是否已经存在于集合中。传统的方法如哈希表或集合容器虽然有效&#xff0c;但在数据量极大的情况下会占用大量内存。这时&#xff0c;位图算法 (Bitmap) 就成为了一种非常高效的解决方案。本文将通过分析一段使用位图算法…

数学复习笔记 12

前言 现在做一下例题和练习题。矩阵的秩和线性相关。另外还要复盘前面高数的部分的内容。奥&#xff0c;之前矩阵的例题和练习题&#xff0c;也没有做完&#xff0c;行列式的例题和练习题也没有做完。累加起来了。以后还是得学一个知识点就做一个部分的内容&#xff0c;日拱一…

1-10 目录树

在ZIP归档文件中&#xff0c;保留着所有压缩文件和目录的相对路径和名称。当使用WinZIP等GUI软件打开ZIP归档文件时&#xff0c;可以从这些信息中重建目录的树状结构。请编写程序实现目录的树状结构的重建工作。 输入格式: 输入首先给出正整数N&#xff08;≤104&#xff09;…

Python爬虫实战:研究 RPC 远程调用机制,实现逆向解密

1. 引言 在网络爬虫技术的实际应用中,目标网站通常采用各种加密手段保护其数据传输和业务逻辑。这些加密机制给爬虫开发带来了巨大挑战,传统的爬虫技术往往难以应对复杂的加密算法。逆向解密作为一种应对策略,旨在通过分析和破解目标网站的加密机制,获取原始数据。 然而,…

debugfs:Linux 内核调试的利器

目录 一、什么是 debugfs&#xff1f;二、debugfs 的配置和启用方式2.1 内核配置选项2.2 挂载 debugfs2.3 Android 系统中的 debugfs 三、debugfs 的典型应用场景3.1 调试驱动开发3.2 内核子系统调试3.3 性能分析 四、常见 debugfs 子目录与功能示例4.1 /sys/kernel/debug/trac…