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://xiahunao.cn/news/2799886.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

vue如何动态加载显示本地图片资源

在实际开发中&#xff0c;根据某一个变量动态展示图片的情况有很多。实现方法分打包构建工具的差异而不同。 1、webpack的项目 require引入图片资源 2、vite的项目 new URL(url,base).href 疑问解答&#xff1a;为什么vite项目不可以用require&#xff1f; 原因在于&#xf…

OpenAI Sora引领AI跳舞视频新浪潮:字节跳动发布创新舞蹈视频生成框架

OpenAI的Sora已经引起广泛关注&#xff0c;预计今年AI跳舞视频将在抖音平台上大放异彩。下面将为您详细介绍一款字节跳动发布的AI视频动画框架。 技术定位&#xff1a;这款框架采用先进的diffusion技术&#xff0c;专注于生成人类舞蹈视频。它不仅能够实现人体动作和表情的迁移…

高校学科竞赛平台|基于springboot高校学科竞赛平台设计与实现(源码+数据库+文档)

高校学科竞赛平台目录 目录 基于springboot高校学科竞赛平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、竞赛题库管理 2、竞赛信息管理 3、晋级名单管理 4、往年成绩管理 5、参赛申请管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最…

STM32F10X(Cortex-M3)系统定时器寄存器笔记和系统定时器精准延时函数

Cortex-M3系统定时器寄存器笔记和系统定时器精准延时函数 简介系统定时器寄存器STK_CTRLSTK_LOADSTK_VALSTK_CALIB STM32F10X(Cortex-M3)精准延时函数 简介 在STM32F10X(Cortex-M3)除了通用定时器和看门狗定时器外&#xff0c;还有一个系统定时器(SysTick) 拿STM32F103C8T6来说…

开年炸裂-Sora/Gemini

最新人工智能消息 谷歌的新 Gemini 模型 支持多达 1M的Token&#xff0c;可以分析长达一小时的视频 1M Token可能意味着分析700,000 个单词、 30,000 行代码或11 小时的音频、总结、改写和引用内容。 Comment&#xff1a;google公司有夸大的传统&#xff0c;所以真实效果需要上…

开源 - 一款可自定义的在线免杀平台|过x60、wd等

免责声明&#xff1a;本工具仅供安全研究和教学目的使用&#xff0c;用户须自行承担因使用该工具而引起的一切法律及相关责任。作者概不对任何法律责任承担责任&#xff0c;且保留随时中止、修改或终止本工具的权利。使用者应当遵循当地法律法规&#xff0c;并理解并同意本声明…

Docker硬件直通:如何在容器中高效利用GPU与硬盘资源

Docker硬件直通&#xff1a;如何在容器中高效利用GPU与硬盘资源 引言Docker基础容器与虚拟机的区别Docker的工作原理 访问服务器硬件资源概述为何需要在Docker容器中访问硬件资源可访问的硬件资源类型 在Docker中使用GPU配置Docker以使用宿主机的GPU资源安装NVIDIA Docker插件 …

【算法与数据结构】1020、130、LeetCode飞地的数量 被围绕的区域

文章目录 一、1020、飞地的数量二、130、被围绕的区域三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、1020、飞地的数量 思路分析&#xff1a;博主认为题目很抽象&#xff0c;非常难理解。想了好久&#xff0c;要理解…

【C++】STL容器之string(一)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

C语言----字符数组指针

1.char arr[] {a,b,c,d,e,f}; sizeof分析类型就可以计算所占的内存空间的大小&#xff1b; &#xff08;1&#xff09;printf("%d\n", sizeof(arr)); 数组名单独放进里面&#xff0c;计算整个数组大小&#xff0c;所以是6字节&#xff1b; &#xff08;2&#xff…

计算以10为底的对数 math.log10(x)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算以10为底的对数 math.log10(x) [太阳]选择题 以下代码的输出结果中正确的是? import math print("【执行】math.log10(10)") print(math.log10(10)) print("【执行】math…

尚未创建默认 SSL 站点。若要支持不带 SNI 功能的浏览器,建议创建一个默认 SSL 站点。

在 Windows Server 2012 IIS 站点中设置 SSL 证书后&#xff0c;IIS 右上角提示&#xff1a; 尚未创建默认 SSL 站点。若要支持不带 SNI 功能的浏览器&#xff0c;建议创建一个默认 SSL 站点。 该提示客户忽略不管&#xff0c;但是若要支持不带 SNI(Server Name Indication)…

Retrofit2原理分析

Retrofit官网 GitHub上的Retrofit 使用Retrofit进行网络请求的主要步骤 创建一个接口 用于描述HTTP请求。接口里的方法使用注解来标记请求方式、API路径、请求参数等信息。使用Retrofit.Builder().build();配置和创建一个Retrofit实例&#xff1b;调用retrofit.create()方法获…

零到大师:嵌入式Linux学习书单分享

大家好&#xff0c;我是知微&#xff01; 上一篇推荐的书单嵌入式软件必读10本书_单片机篇&#xff0c;收到反响很好。再推荐一篇嵌入式Linux相关的书单。 《鸟哥的Linux私房菜》 鸟哥的Linux系列适合零基础小伙伴&#xff0c;从电脑基础到文件系统、shell脚本等等&#xff…

C++之Easyx——图形库的基本功能(1):界面操作

最近&#xff0c;我觉得使用控制台编写游戏太没意思了&#xff01;&#xff01; 所以我开始研究图形库了~ 一、setinitmode 函数定义 void EGEAPI setinitmode(int mode, int x CW_USEDEFAULT, int y CW_USEDEFAULT); //设置初始化模式&#xff0c;mode0为普通&#xff0c…

Linux篇:开发工具yum/vim/gcc/g++/Makefile/gdb

一. yum&#xff1a;软件包管理器 什么是软件包&#xff1f; 在Linux 下安装软件 , 一个通常的办法是下载到程序的源代码 , 并进行编译 , 得到可执行程序 . 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好 , 做成软件包 (可以理解成windows 上的安装程序) 放在…

遥遥领先的大语言模型GPT-4的图像合成能力如何?

遥遥领先的多模态大语言模型GPT-4的图像合成能力如何&#xff1f;今天分享一个建立了一个用于评估GPT-4生成图像中纹理特征保真度的基准&#xff0c;其中包括手工绘制的图片及其AI生成的对应物。本研究的贡献有三个方面&#xff1a;首先&#xff0c;对基于GPT-4的图像合成特征的…

C++ 之LeetCode刷题记录(三十三)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 目标&#xff1a;执行用时击败90%以上使用 C 的用户。 11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;…

存内计算的主流技术方案

1 概述 和近数据计算不同&#xff0c;存内计算直接使用内存单元做计算&#xff0c;主要利用电阻和电流电压的物理关系表达运算过程。存内计算依赖于新型的非易失性存储器&#xff0c;如 ReRAM和 PCM 等。在所有存内计算操作中&#xff0c;最普遍的是利用基尔霍夫定律&#xff0…

shell基础实验(1)

1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查次磁盘剩余空间。 1.1.安装邮件服务,配置邮件服务 [rootserver ~]# yum install mailx -y[rootserver ~]# vim /etc/mail.rc set from1580540058qq.com …