Spring学习笔记(五)--Spring的AOP模块

一、AOP的底层原理

AOP的底层原理是动态代理,动态代理有两种方式:JDK动态代理和CGLib动态代理,在有接口的实现类时我们通常用JDK的动态代理方式(默认情况)为类创建代理对象,JDK的动态代理方式可以实现无入侵式的代码扩展,并且可以在不修改源代码的情况下,增强某种方法;而CGLib动态代理不要求目标类实现接口,通过继承的方式动态创建代理对象,Spring的核心报集成了CGLib需要的包,无需另外导入JAR包

二、AOP的实现

因为Spring AOP中的代理对象由IoC容器自动生成,所以开发者无须过多关注代理对象生成的过程,只需选择连接点、创建切面、定义切点并在XML文件中添加配置信息即可

Spring AOP的实现有两种配置:基于xml配置和基于注解的方式的配置

AOP配置概念:在切面配置切入点(被增强的类)和增强的关系

切面是指关注点形成的类(关注点是指类中重复的代码),通常是指封装的、用于横向插入系统的功能类(如事务管理、日志记录等)

1、基于XML的AOP实现:

Spring AOP的XML元素

<aop:config>AOP的根元素

<aop:aspect>配置切面:id属性用于定义该切面的唯一标识,ref属性用于引用普通的Spring Bean,通常会配置5中通知,分别为前置通知、后置通知、环绕通知、返回通知和异常通知。

<aop:pointcut>配置切点:作为根元素的子元素时改切入点是全局的,可被多个切面共享,作为<aop:aspect>的子元素时表示对当前切面有效,定义<aop:pointcut>通常会指定id和expression属性(用于指定切入点关联的切入点表达式)

execution(modifiers-pattern?ret-type-pattern declaring-type-pattern?
name-pattern(param-pattern) throws-pattern?)

参数说明

modifiers-pattern:表示定义的目标方法的访问修饰符,如public、private等。

ret-type-pattern:表示定义的目标方法的返回值类型,如void、String等。

declaring-type-pattern:表示定义的目标方法的类路径,如com.itheima.jdk.UserDaoImpl。

name-pattern:表示具体需要被代理的目标方法,如add()方法。

param-pattern:表示需要被代理的目标方法包含的参数

throws-pattern:表示需要被代理的目标方法抛出的异常类型

在Spring中使用XML实现Spring AOP

1、需要引入Maven的aspectjrt包的依赖和aspectjweaver包的依赖

<!-- aspectjrt包的依赖 -->
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.9.1</version>
</dependency><!-- aspectjweaver包的依赖 --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version>
</dependency> 

2、创建接口UserDao,并在该接口中编写添加、删除、修改和查询的方法。

3、创建UserDao接口的实现类UserDaoImpl,实现UserDao接口中的方法

4、创建XmlAdvice类,用于定义通知(插入的切面程序代码,切面的实现)

5、创建applicationContext.xml文件,在该文件中引入AOP命名空间,使用<bean>元素添加Spring AOP的配置信息。

<!-- 注册bean省略,下面内容为配置Spring AOP--><aop:config><aop:pointcut id="pointcut" expression="execution(*com.itheima.demo03.UserDaoImpl.*(..))"/><!-- 指定切点 --><aop:aspect ref ="xmlAdvice"><!-- 指定切面 --><aop:before method="before" pointcut-ref="pointcut"/><!-- 指定前置通知 --><aop:after-returning method="afterReturning" pointcut-ref="pointcut"/><aop:around method="around" pointcut-ref="pointcut"/>-- 指定环绕方式 --><aop:after-throwing method="afterException" pointcut-ref="pointcut"/><aop:after method="after" pointcut-ref="pointcut"/><!-- 指定后置通知 --></aop:aspect>
</aop:config>

6、创建测试类TestXml,测试基于XML的AOP实现

public class TestXml{public static void main(String[] args){ApplicationContext context=newClassPathXmlApplicationContext("applicationContext.xml");UserDao userDao=context.getBean("userDao",UserDao.class);userDao.delete(); userDao.insert();  userDao.select();  userDao.update();}}

2.基于注解的AOP实现

Spring Aop的注解概况:

1、创建接口UserDao,并在该接口中编写添加、删除、修改和查询的方法

      创建UserDao接口的实现类UserDaoImpl,实现UserDao接口中的方法

(创建接口用于测试中调用方法,而接口的实现类通过bean中的配置完成接口的实现,利用了控制反转DI)

2、创建AnnoAdvice类,用于定义通知(插入的切面程序代码,切面的实现)

@Aspectpublic class AnnoAdvice {@Pointcut("execution( * com.itheima.demo03.UserDaoImpl.*(..))")// 代码@Before("poincut()")//代码@AfterReturning("poincut()")//代码   @Around("poincut()")//代码@AfterThrowing("poincut()")// 代码@After(“poincut()")// 使用以上注解分别定义切点、前置通知、返回通知、环绕通知、异常通知、后置通知}

3、创建applicationContext-Anno.xml文件,在该文件中引入AOP命名空间,使用<bean>元素添加Spring AOP的配置信息

<!-- 注册Bean -->
<bean name="userDao" class="com.itheima.demo.UserDaoImpl"/><bean name="AnnoAdvice" class="com.itheima.demo.AnnoAdvice"/><!-- 开启@aspectj的自动代理支持 -->
<aop:aspectj-autoproxy/>

4、创建测试类TestAnnotation,用于测试基于注解的AOP实现(和xml方式的测试类基本相同)

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

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

相关文章

ORM中常用的字段和参数,正反向概念

django表查询测试环境搭建 首先&#xff0c;在此之前我们先来回顾一下之前学习的orm内容 1. django自带一个小型的sqlite3的小型数据库 但是这个数据库的功能非常有限&#xff0c;并且针对日期类型的数据兼容性很差 2. 切换数据库数据(MySQL) 2.1 在django1.x版本中你需要在_…

Android TextView.setText() 引发的卡顿问题

在 Android 开发中&#xff0c;TextView 是一个非常基础和常用的用户界面组件&#xff0c;用于在屏幕上显示文本内容。TextView 继承自 View 类&#xff0c;并提供了展示文本以及相关样式处理的功能。 TextView 允许开发者在应用程序的用户界面中显示格式化的文本内容。它支持…

PotPlayer+Alist挂载并播放网盘视频

文章目录 说明技术WebDAVPotPlayer 操作步骤一&#xff1a;Alist开启WebDAV代理二&#xff1a;PotPlayer连接Alist 说明 Alist网页端播放视频受限&#xff0c;主要是文件大于20MB&#xff0c;由于官方限制&#xff0c;无法播放需要使用user-agent修改插件&#xff0c;设置百度…

html中如何给input输入框这个一个默认值

在HTML中&#xff0c;要给<input>输入框设置一个默认值&#xff0c;你可以使用value属性。下面是一个简单的例子&#xff0c;展示了如何为一个文本输入框设置一个默认值&#xff1a; <input type"text" value"这是默认值">在这个例子中&#…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-24-处理单选和多选按钮-上篇

1.简介 在工作和生活中&#xff0c;经常会遇到我们需要进行选择的情况&#xff0c;比如勾选我们选择性别&#xff0c;男女两个性别总是不能同时选中的&#xff0c;再比如我们在选择兴趣爱好时&#xff0c;我们可以选择多个自己感兴趣的话题&#xff0c;比如&#xff1a;篮球、…

sqllabs第46关 order by 注入

简介&#xff1a;&#xff08;order by注入-错误回显-POST注入&#xff09; 请求方法&#xff1a;POST 方法&#xff1a;order by注入错误回显数字型注入 先了解下 order by参数注入&#xff1a; order by 注入是指其后面的参数是可控的&#xff0c; order by 不同于我们在 whe…

gem5学习(23):经典缓存——Classic Caches

目录 一、Interconnects 1、Crossbars 二、Debugging 官网教程&#xff1a;gem5: Classic caches 默认缓存是一个带有MSHR&#xff08;未命中状态保持寄存器&#xff09;和WB&#xff08;写缓冲区&#xff09;的非阻塞缓存&#xff0c;用于读取和写入未命中。缓存还可以启用…

6.3 存储卡

本节介绍Android的文件存储方式--在存储卡上读写文件&#xff0c;包括&#xff1a;公有存储空间与私有存储空间有什么区别&#xff0c;如何利用存储卡读写文本文件&#xff0c;如何利用存储卡读写图片文件&#xff0c;如何在App运行的时候动态申请权限等。 6.3.1 私有存储空间…

Android应用图标防止被系统缩放问题

问题 Launcher显示应用的图标时可能有一定程度的缩放和剪裁后剧中&#xff0c;可能导致我们应用的图标看起来过小。 解决方法 在icon资源中用xml去放置资源ic_launcher.xml&#xff0c;不要直接使用png&#xff0c;然后把自己的资源放在xml中的foreground 标签中。 <appli…

关于Linux搭建DedeCMS说明

使用环境 1. Ubuntu 22.042. PhP 4.0 3. nginx4. MySQL 5.7软件安装 安装nginx #1. 更新系统 sudo apt update && sudo apt upgrade -y#2. 安装nginx sudo apt install nginx -y安装MySQL apt list -a mysql-server安装 PHP 7.4 使用 ondrej/php PPA sudo apt inst…

[java基础揉碎]this

引出this: 什么是this: java虚拟机会给每个对象分配 this&#xff0c;代表当前对象。 这里的this就是new出来的这个对象 this的本质: this是个引用在堆中指向它自己: this的细节: 访问成员方法: 访问构造器:

精英ECS Z97-MACHINE V1.0 BIOS MX25L6406E

官网上的两个BIOS我都无法亮机&#xff0c;这是我保存出来的BIOS&#xff0c;不知道是否能使用五代的处理器 官网&#xff1a;Z97-MACHINE&#xff5c;Motherboard&#xff5c;产品&#xff5c;ECS 精英电脑 国外老哥的看法&#xff1a;ECS Z97-MACHINE Closer Look: The BIO…

Postgresql源码(121)事务状态中childXids的作用

总结 PG的子事务回滚是真回滚&#xff08;直接回滚了&#xff0c;不管顶层事务提交还是回滚&#xff09;。 PG的子事务提交是假提交&#xff08;子事务提交后会把决定权交给顶层事务&#xff0c;随顶层事务提交、回滚&#xff09;。 子事务提交后&#xff0c;将xid记录到父事…

RocketMQ-架构与设计

RocketMQ架构与设计 一、简介二、框架概述1.设计特点 三、架构图1.Producer2.Consumer3.NameServer4.BrokerServer 四、基本特性1.消息顺序性1.1 全局顺序1.2 分区顺序 2.消息回溯3.消息重投4.消息重试5.延迟队列&#xff08;定时消息&#xff09;6.重试队列7.死信队列8.消息语…

【电子书】游戏开发

资料 wx&#xff1a;1945423050 整理了一些互联网电子书&#xff0c;推荐给大家 游戏开发 ADOBE FLASH PROFESSIONAL CS6 标准培训教材.epubAndroid 3D 游戏案例开发大全.epubCocos Creator游戏开发实战.epubCocos2D-X游戏开发技术精解.epubCocos2d-JS游戏开发快速入门到实战…

《Python 语音转换简易速速上手小册》第3章 文本到语音的转换(2024 最新版)

文章目录 3.1 文本到语音的原理3.1.1 基础知识3.1.2 主要案例&#xff1a;自动新闻播报器案例介绍案例 Demo案例分析 3.1.3 扩展案例 1&#xff1a;智能助手案例介绍案例 Demo案例分析 3.1.4 扩展案例 2&#xff1a;电子书阅读器案例介绍案例 Demo案例分析 3.2 Python 中的文本…

[高并发] - 2. 金融交易系统高并发架构

1. 高并发场景 [高并发] - 1. 高并发架构综述 上面文章提到的数据都存在高并发场景。 2. 解决方案 2.1 权限 权限数据的特点是数据量少&#xff08;一千万&#xff09;&#xff0c;占用的空间大小大概在2G左右&#xff0c;但是性能要求极高。权限数据还有个特点&#xff0c;…

python 验证AES_ECB算法对数据的加解密

目录 一、python 代码实现如下&#xff1a; 二、代码解析 三、运行结果 一、python 代码实现如下&#xff1a; #AES_ECB模式实现 from Crypto.Cipher import AES from Crypto.Random import get_random_bytes # 自动生成密钥 from Crypto.Util.Padding import pad, unpad …

开开开开开,干

大家新年快乐&#xff0c;开工啦啦啦啦 其实每天很多人都会问&#xff1a; 有协同过滤的算法吗&#xff0c;有的&#xff0c;可以给你解释原理… 有的小伙伴只开了一部分逻辑&#xff0c;我要实现用户可以下单功能 但是细细考虑下单&#xff0c;需要现有用户&#xff0c;维护…

为全志D1开发板移植LVGL日历控件和显示天气

利用TCP封装HTTP包请求天气信息 Linux还真是逐步熟悉中&#xff0c;现在才了解到Linux即没有原生的GUI&#xff0c;也没有应用层协议栈&#xff0c;所以要实现HTTP应用&#xff0c;必须利用TCP然后自己封装HTTP数据包。本篇即记录封装HTTP数据包&#xff0c;到心知天气请求天气…