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类,用于定义通知(插入的切面程序代码,切面的实现)

@Aspect

public 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方式的测试类基本相同)

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

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

相关文章

智慧建工的魔法:数据可视化的引领之光

在智慧建工的时代&#xff0c;数据可视化成为推动建筑行业进步的强大引擎&#xff0c;其作用不可忽视。通过将复杂的建筑数据以直观、清晰的图形展示出来&#xff0c;数据可视化为建筑工程提供了前所未有的便利和创新。 首先&#xff0c;数据可视化在建筑规划和设计阶段发挥关键…

浏览器---浏览器/http相关面试题

1.localStorage和sessionStorage 共同点&#xff1a;二者都是以key-value的键值对方式存储在浏览器端&#xff0c;大小大概在5M。 区别&#xff1a; &#xff08;1&#xff09;数据有效期不同&#xff1a;sessionStorage仅在当前浏览器窗口关闭之前有效&#xff1b;localStorag…

基于springboot+vue的B2B平台的医疗病历交互系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

上海亚商投顾:北向资金净买入超130亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 指数昨日低开高走&#xff0c;三大股指午后均涨超2%&#xff0c;沪指一度逼近3000点关口&#xff0c;尾盘涨幅…

D3380——应用于无线收发机的宽带 IF IC, 最大 IF 频带为 15MHz. 包含 IF 限 幅放大器、RSSI 和检测器。

D3380是一块具有较大15MHz的高带宽中放集成电路。电路内部集成了一块中放限幅放大器&#xff0c;接收信号强度指示器&#xff0c;检测器。电路主要应用于无绳电话&#xff0c;收音机&#xff0c;遥控器&#xff0c;无线数据传输器等通讯类器件。电路具有低工作电流特性能适应于…

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

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

【MySQL】学习连接查询和案例演示

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-KOxr1rwR9cQTlydJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

HotSpot虚拟机对象探秘

对象的创建 1.1 对象创建的6种方式 使用new关键字、Class的newInstance()方法、Constructor类的newInstance()方法、clone()方法、反序列化、第三方库Objenesis。 每种创建对象方式的实际操作如下。 使用new关键字—调用无参或有参构造器创建。使用Class的newInstance()方法…

软件实际应用实例分享,门诊电子处方模板制作教程,中西医诊所病历开单系统教程

软件实际应用实例分享&#xff0c;门诊电子处方模板制作教程&#xff0c;中西医诊所病历开单系统教程 一、前言 以下软件教程以 佳易王诊所电子处方软件V17.3为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、在开电子处方的时候&#xff0c…

Python3零基础教程之Python解释器与开发环境搭建

大家好&#xff0c;我是千与编程&#xff0c;硕士毕业于北京大学&#xff0c;曾先后就职于字节跳动&#xff0c;京东等互联网大厂&#xff0c;目前在编程导航知识星球担任星球嘉宾&#xff0c;著有《AI算法毕设智囊袋》&#xff0c;《保姆级带你通关秋招教程》两大专栏。 今天开…

【鸿蒙系统学习笔记】网络请求

一、介绍 资料来自官网&#xff1a;文档中心 网络管理模块主要提供以下功能&#xff1a; HTTP数据请求&#xff1a;通过HTTP发起一个数据请求。WebSocket连接&#xff1a;使用WebSocket建立服务器与客户端的双向连接。Socket连接&#xff1a;通过Socket进行数据传输。 日常…

基于Skywalking开发分布式监控(三)

回顾上期的问题&#xff0c;当我们搭建完成Skywalking的搭建&#xff0c;顺利完成应用监控之后&#xff0c;就会面临一类问题&#xff0c;怎么利用获取的监控数据&#xff0c;包括三方面&#xff1a; 1 应用的Trace和SW收集Service/Endpoint不一定完全一致&#xff0c;可能定位…

【快速上手QT】05-绘画Paint

我们写一个QT程序&#xff0c;说实话&#xff0c;很难昧着良心说这个QT界面很好看&#xff08;技术高超的小伙伴请忽略我这句话&#xff09;。但是我们可以使用绘画事件来弥补一下“相貌丑陋”的这个缺点。 paintEvent 我们可以对主界面进行绘图&#xff0c;从而达到美化界面…

js设计模式:计算属性模式

作用: 将对象中的某些值与其他值进行关联,根据其他值来计算该值的结果 vue中的计算属性就是很经典的例子 示例: let nowDate 2023const wjtInfo {brithDate:1995,get age(){return nowDate-this.brithDate}}console.log(wjtInfo.age,wjt年龄)nowDate 1console.log(wjtInf…

【UI自动化】使用poco框架进行元素唯一定位

直接选择&#xff1a; 1.poco(text买入).click() 2.poco("android.widget.ImageView").click()相对选择、空间选择&#xff1a; 3.poco(text/name).parent().child()[0].click()正则表达式&#xff1a; 4.listpoco(textMatches".*ETF")今天主要想记录下…

操作系统导论-课后作业-ch19

1. 本书在第6章中有过介绍&#xff0c;gettimeofday函数最多精确到us&#xff0c;并且大致精确&#xff08;并不完全精确&#xff09;&#xff0c;需要多迭代几次减少误差&#xff0c;循环次数太多也会导致结束时间小于开始时间&#xff08;即回滚&#xff09;的现象&#xff…

Kaggle实践之《Home Credit Default Risk》的逐步优化

记录下每一次的改进及其score。 1、只用训练集的特征简单处理 特征只用训练集的特征&#xff0c;把string型的特征全部进行one-hot转化&#xff0c;然后随机1:4分成测试集训练集&#xff0c;模型也调参直接出结果。 最终的score是训练集80.13%、验证集76.33%、线上74.28%。 …

Java 注解机制解密并发编程的时间之谜:揭开Happens-Before的神秘面纱

优质博文&#xff1a;IT-BLOG-CN 一、简介 为什么需要happens-before原则&#xff1a; 主要是因为Java内存模型 &#xff0c; 为了提高CPU效率&#xff0c;通过工作内存Cache代替了主内存。修改这个临界资源会更新work memory但并不一定立刻刷到主存中。通常JMM会将编写的代码…

⭐北邮复试刷题LCR 052. 递增顺序搜索树__DFS (力扣119经典题变种挑战)

LCR 052. 递增顺序搜索树 给你一棵二叉搜索树&#xff0c;请 按中序遍历 将其重新排列为一棵递增顺序搜索树&#xff0c;使树中最左边的节点成为树的根节点&#xff0c;并且每个节点没有左子节点&#xff0c;只有一个右子节点。 示例 1&#xff1a; 输入&#xff1a;root [5,…

零基础学习8051单片机(十六)

继续学习8051单片机&#xff0c;本次通过观看视频在此学习8051单片机的中断系统 要掌握单片机中断系统的硬件结构和工作原理 掌握&#xff1a;中断系统的初始化编程以及中断服务子程序设计。 一、中断的基本过程图&#xff1a; 中断的响应和处理过程&#xff1a; 当中断提出…