Spring的AOP概念详解

AOP详解:

1.介绍:

面向切面编程,是一种将非业务代码与业务代码进行分离的一种思想,在实际开发中,往往有许多重复操作,例如事务提交,权限验证,保存口志等功能需要在业务代码重复调用,面向切面编程,就是将非业务代码进行抽取,然后在不修改原来代码的前提下,为我们的业务代码,添加额外的功能.

面向切面编程的好处就是: 减少重复,专注业务;
注意:面向切面编程只是面向对象编程的一种补充
2.核心原理:

使用动态代理的方式在执行方法前后或者出现异常的时候做加入相关的逻辑.

3.使用案例:

事务处理:开启事务,关闭事务,出现异常后回滚事务 权限判断:在执行方法前,判断是否具有权限 日志:在执行前进行日志处理

4.总结:

AOP就是把重复的非业务代码通过动态代理的方式实现,让开发者配置一次后就不用再考虑重复的非业务代码

AOP思想不是spring中特有的,是java中的动态代理模式,是spring框架使用了这一思想

5.基本概念:

(1) 连接点(Joinpoint):类中可以被增强(可以添加额外功能的方法)的方法

(2) 切入点(Pointcut):类中实际被增强的方法,把额外功能实际切入的方法

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

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

(5) 代理(Proxy):向目标对象应用通知时创建的代理对象(目前使用的代理对象由spring框架生成,目前我们不需要关心)

6.springAOP实现:

下载 AOP 相关 jar

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

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

注解放在对应的方法上方:

    @Before("execution(* com.lzy.springpro.dao.*.*(..))")
    public void saveLog(){
        System.out.println("方法执行成功");
    }

AOP中的通知类型:
@Before 前置通知,在我们的方法实际执行前调用
@After 后置通知,子啊方法执行后执行,即使出现异常也会执行
@AfterReturning 返回通知,方法成功执行之后通知,出现异常不通知
@AfterThrowing 异常通知,当切入点出现异常执行,没有异常不执行
@Around 环绕通知,方法执行前后都有通知,可以实现其余四个通知

启动 AspectJ 支持:

<aop:aspectj-autoproxy/>

同时spring.xml还要配置AOP相关:

xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation=        
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        @Before("execution(* com.lzy.springpro.dao.AdminDao.saveAdmin(..))")
        @After("execution(* com.lzy.springpro.dao.*.*(..))")
        @AfterReturning("execution(* com.lzy.springpro.dao.*.*(..))")
        @AfterThrowing("execution(* com.lzy.springpro.dao.*.*(..))")
        @Around("execution(* com.lzy.springpro.dao.*.*(..))")

Around:

    @Around("execution(* com.lzy.springpro.dao.*.*(..))")
    public void around(ProceedingJoinPoint joinPoint){
        try{
            System.out.println("保存日志"); //前置通知

            Object[] args=joinPoint.getArgs();  //获取方法中的参数
            System.out.println(Arrays.toString(args));
            joinPoint.proceed();    //调用我们自己的方法

            System.out.println("提交事务"); //返回通知
        }catch (Throwable e){
            System.out.println("系统异常"); //异常通知
        }
        System.out.println("后置通知"); //后置通知
    }
7.Spring 事物管理
什么是数据库事务

​ 数据库事务是一次对数据库执行的若干操作的管理,这一次操作的若干条sql语句,应该是一个整体的单元

例如转账:

​ 一次转账操作,对于用户来讲已是一个操作,但是这一次操作中,会执行多条sql语句,例如语句1:从A账户减钱 语句2:从B账户加钱。两个语句必须是一个整体,要么都成功执行,要么都不执行。这是事务特征的最基本的原子性特征。只有当一次操作完成后,向数据库提交事务后,数据库才会将多条sql真正的执行。

为什么需要事务?

​ 保证数据的完整性,不能一半保存到数据库,一半没保存成功。

之前在jdbc中是每次执行完sql后,事务九自动提交的。(自动提交是有风险的)在mybatis中是手动sqlSession.commit();提交的,这很麻烦

spring事务管理:

​ spring事务管理就是AOP的基础上,当我们的方法完全执行后,再提交事务,如果方法中有异常,就不提交事务。

​ spring中的事务管理有两种方式:

1.编程式事务

​ 需要我们再业务代码中手动提交

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

在类或方法上使用@Transactional :

/*
    @Transactional 可以添加在类上,这样类中所有的方法都在事务管理中进行
                   也可以添加在方法上,只有所添加的方法再事务管理中进行
 */
 @Transactional(rollbackFor = Exception.class)
public class LoginService {
	......	
}

声明式事务几种失效场景:

1.@Transactional用在了非public方法上面(受封装的不能直接获取的)
2.异常被catch捕获了,认为方法没有出现异常
3.默认出现编译期异常,事务失效,可以在@Transactional(rollbackFor=Exception.class)设置回滚异常类型为Exception,这样即使出现编译期异常,也是有效的
4.数据库引擎不支持事务,目前mysql中只有innodb引擎支持事务

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

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

相关文章

Apache Flink架构介绍

目录 一、Apache Flink架构组件栈 1.1 概述 1.2 架构图 1.3 架构分层组件说明 1.3.1 物理部署层 1.3.2 Runtime 核心层 1.3.3 API & Libraries层 二、Flink运行时架构 2.1 概述 2.2 架构图 2.3 架构角色和组件 2.3.1 Flink Clients客户端 2.3.2 JobManager 2.…

微信小程序留言板1

wxml&#xff1a; <view class"view2"> <text class"test1">留言&#xff1a;</text><input type"text" class"input1" bindinput"ipt"/><button class"btn" bindtap"btn"…

《简历宝典》01 - 一文带你学会如何写一份糟糕透顶的简历

我们每个人几乎都会面对找工作这件事&#xff0c;而找工作或者说求职首先就是要写一份简历。今天狗哥将以一个不同的视角带你写一份无与伦比&#xff0c;糟糕透顶的求职简历&#xff0c;说实话&#xff0c;其实几年前&#xff0c;我就是这么写的。 目录 1. 文件名 2. 基本信…

C++ thread线程库

thread库 std::thread 是 C 标准库中的一个类&#xff0c;用于管理和控制单个执行线程。线程允许程序并行执行多个函数&#xff0c;从而提高性能和响应速度。std::thread 类提供了一种便捷的方式来创建和操作线程。 1、用途 并行执行任务&#xff1a; 通过 std::thread&…

滚动表格(vue版本)【已验证可正常运行】

演示图 注&#xff1a;以下代码来自于GPT4o&#xff1a;国内官方直连GPT4o 代码 <template><div><div class"alarmList-child" ref"alarmList" mouseenter.stop"autoRoll(1)" mouseleave.stop"autoRoll()"><div…

相机光学(二十四)——CRA角度

CRA角度 0.参考资料1.什么是CRA角度2.为什么 CRA 会导致luma shading3.为什么 CRA 会导致color shading4.CRA相差过大的具体表现5.CRA Matching6.怎样选择sensor的CRA 0.参考资料 1.芯片CRA角度与镜头的匹配关系&#xff08;一&#xff09;   2.芯片CRA角度与镜头选型的匹配关…

记录一次麒麟V10 安装sysbench各种报错(关于MySQL)处理过程

sysbench手工下载&#xff1a; https://github.com/akopytov/sysbench 下载.zip文件&#xff0c;上传到服务器上 解压、安装&#xff1a; unzip sysbench-master.zipcd sysbench-master/sh autogen.sh./configure 报错&#xff1a;没有mysql驱动 configure: error: mysql_c…

MySQL数据库-Windows部署MySQL环境

Windows部署MySQL环境​​​​​​ 一、下载mysql数据库 进入MySQL官方网站&#xff08;MySQL :: MySQL DownloadsMySQL&#xff09;&#xff0c;随后按如下红框方式操作&#xff1a; ​ ​ ​ ​ 这里选择的是离线安装&#xff0c;第一个是在线安装 下载好安装包后开始…

iPad手写笔哪款比较好?2024五款爆火iPad电容笔推荐!新手必看!

在iPad等触控设备日益普及的今天&#xff0c;手写笔作为提升生产力和创意表达的重要工具&#xff0c;正受到越来越多用户的青睐。然而&#xff0c;随着市场需求的激增&#xff0c;市面上电容笔品牌与型号繁多&#xff0c;跟风购买往往容易遭遇“踩雷”情况。因此&#xff0c;作…

【Linux】查找命令——which,type,find,whereis,locate

命令与文件的查找 文件的查找可就厉害了&#xff0c;因为我们常常需要知道哪个文件放在哪里&#xff0c;才能够对该文件进行一些修改或维护等操作。 有时候某些软件配置文件的文件名是不变的&#xff0c;但是各Linux发行版放置的目录则不同。 此时就要利用一些查找命令将该配…

iPad电容笔什么牌子好?2024最值得买的五款高性价比电容笔推荐!

现在平板和电容笔在一定程度上可以替代传统的笔和纸&#xff0c;不仅减少纸张浪费&#xff0c;还可以导入教材和习题册。只需携带它们就无需携带厚重的书本&#xff0c;这种环保、便捷、方便的特点吸引了越来越多的用户。但电容笔品牌的不断涌现&#xff0c;也让用户更加难以抉…

Wormhole Filters: Caching Your Hash on Persistent Memory——泛读笔记

EuroSys 2024 Paper 论文阅读笔记整理 问题 近似成员关系查询&#xff08;AMQ&#xff09;数据结构可以高效地近似确定元素是否在集合中&#xff0c;例如Bloom滤波器[10]、cuckoo滤波器[23]、quotient滤波器[8]及其变体。但AMQ数据结构的内存消耗随着数据规模的增长而快速增长…

管易云和金蝶云星空单据接口对接

管易云和金蝶云星空单据接口对接 数据源系统:金蝶云星空 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上&#xff0c;提供了标准的管理模式&#xff1b;通过标准的业务架构&#xff1a;多会计准则、多币别、多地点、多组织、多税制应用框架等&#xff0c;有效支持企业的运营…

400G SR4和800G SR8光模块在AI集群中的应用

人工智能&#xff08;AI&#xff09;技术的快速发展下&#xff0c;AI集群的计算能力和数据传输需求不断提升。为了满足这一需求&#xff0c;光模块技术也在不断进步。高速率光模块作为新一代高速光通信解决方案&#xff0c;正在逐步应用于AI集群中&#xff0c;为其提供更高效、…

【带你全面了解 RAG,深入探讨其核心范式、关键技术及未来趋势】

文末有福利&#xff01; 大型语言模型&#xff08;LLMs&#xff09;已经成为我们生活和工作的一部分&#xff0c;它们以惊人的多功能性和智能化改变了我们与信息的互动方式。 然而&#xff0c;尽管它们的能力令人印象深刻&#xff0c;但它们并非无懈可击。这些模型可能会产生…

google::protobuf命名空间下常用的C++ API----message.h

#include <google/protobuf/message.h> namespace google::protobuf 假设您有一个消息定义为: message Foo {optional string text 1;repeated int32 numbers 2; } 然后&#xff0c;如果你使用 protocol编译器从上面的定义生成一个类&#xff0c;你可以这样使用它: …

[C++][设计模式][访问器]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受1.代码一2.代码二 1.动机 在软件构件过程中&#xff0c;由于需求的变化&#xff0c;某些类层次结构中常常需要增加新的行为(方法)&#xff0c;如果直接在基类中做这样的更改&#xff0c; 将会给子类带来很繁重的变更负担&#xff0c…

快手矩阵管理系统:开启短视频营销的智能时代

在短视频内容营销的浪潮中&#xff0c;快手矩阵管理系统以其独特的优势和功能&#xff0c;成为品牌和个人创作者不可或缺的工具。本文将详细解析快手矩阵管理系统的核心功能&#xff0c;探讨它如何帮助用户高效管理多平台、多账号的内容发布和互动。 快手矩阵管理系统概述 快…

【Java EE】Spring IOCDI

Spring IOC & DI 文章目录 Spring IOC & DI一、Spring是什么&#xff1f;二、IOC(控制反转)2.1 通俗理解2.2 造汽车的例子理解IOC2.3 IOC详解1. 获取Bean2. 方法注解——Bean1. 应用场景&#xff1a;2. 应用方法&#xff1a;3. 注意要点&#xff1a; 特别注意: 四、DI4…

Superset超火的企业级可视化BI分析工具

Superset&#xff0c;听起来就像是超级集合&#xff0c;确实&#xff0c;它几乎集合了所有你需要的数据功能。简单说&#xff0c;它就是一个现代化、功能强大的数据可视化工具。 它支持各种数据库&#xff0c;有着丰富的可视化选项&#xff0c;可以用来创建漂亮的数据仪表盘&a…