Spring AOP简介及相关案例

目录

一、Spring AOP简介

二、AOP相关术语

三、AOP入门案例

1. 引入依赖

2. 编写连接点

3. 编写通知类

4. 配置切面

5. 测试 

四、通知类型

1. 编写通知方法

2. 配置切面

3. 测试

五、切点表达式

六、多切面配置 

1. 编写发送邮件的通知

2. 配置切面

3. 测试 

往期专栏&文章相关导读 

1. Maven系列专栏文章

2. Mybatis系列专栏文章

3. Spring系列专栏文章 


一、Spring AOP简介

        AOP的全称是Aspect Oriented Programming,即面向切面编程。是实现功能统一维护的一种技术,它将业务逻辑的各个部分进行隔离,使开发人员在编写业务逻辑时可以专心于核心业务,从而提高了开发效率。

  • 作用:在不修改源码的基础上,对已有方法进行增强。实现原理:动态代理技术。
  • 优势:减少重复代码、提高开发效率、维护方便
  • 应用场景:事务处理、日志管理、权限控制、异常处理等方面。

二、AOP相关术语

 为了更好地理解AOP,就需要对AOP的相关术语有一些了解

名称 说明
Joinpoint(连接点)指能被拦截到的点,在Spring中只有方法能被拦截。
Pointcut(切点)指要对哪些连接点进行拦截,即被增强的方法。
Advice(通知)指拦截后要做的事情,即切点被拦截后执行的方法。
Aspect(切面)切点+通知称为切面
Target(目标)被代理的对象
Proxy(代理)代理对象
Weaving(织入)生成代理对象的过程

三、AOP入门案例

AspectJ是一个基于Java语言的AOP框架,在Spring框架中建议使用AspectJ实现AOP。
接下来我们写一个AOP入门案例:dao层的每个方法结束后都可以打印一条日志:

1. 引入依赖

    <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.13</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.27</version></dependency></dependencies>

2. 编写连接点

package com.example.dao;import org.springframework.stereotype.Repository;@Repository
public class UserDao {public void add(){System.out.println("用户新增");}public void delete(){System.out.println("用户删除");}public void update(){System.out.println("用户修改");}
}

3. 编写通知类

package com.example.aspect;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;public class MyAspectJAdvice {// 后置通知public void myAfterReturning(JoinPoint joinPoint){System.out.println("切点方法名:"+joinPoint.getSignature().getName());System.out.println("目标对象:"+joinPoint.getTarget());System.out.println("打印日志···"+joinPoint.getSignature().getName()+"方法被执行了!");    }
}

4. 配置切面

bean.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 扫描包 --><context:component-scan base-package="com.example"/><!-- 通知对象 --><bean id="myAspectJAdvice" class="com.example.aspect.MyAspectJAdvice"/><!-- 配置AOP --><aop:config><!-- 配置切面 --><aop:aspect ref="myAspectJAdvice"><!-- 配置切点 --><aop:pointcut id="myPointcut" expression="execution(* com.example.dao.UserDao.* (..))"/><!-- 配置后置通知 --><aop:after-returning method="myAfterReturning" pointcut-ref="myPointcut"/></aop:aspect></aop:config></beans>

5. 测试 

import com.example.SpringConfig;
import com.example.dao.UserDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserDaoTest {@Testpublic void testAdd(){ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");UserDao userDao = (UserDao) ac.getBean("userDao");userDao.add();}@Testpublic void testDelete(){ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");UserDao userDao = (UserDao) ac.getBean("userDao");userDao.delete();}
}

运行结果分别为

 

  

OK,确实是可以的,本次入门案例就学习到这里了。 

四、通知类型

 AOP有以下几种常用的通知类型:

通知类型描述
前置通知在方法执行前添加功能
后置通知在方法正常执行后添加功能
异常通知在方法抛出异常后添加功能
最终通知无论方法是否抛出异常,都会执行该通知
环绕通知在方法执行前后添加功能

1. 编写通知方法

    // 前置通知public void myBefore(){System.out.println("前置通知···");}// 异常通知public void myAfterThrowing(Exception e){System.out.println("异常通知···");System.out.println(e.getMessage());}// 最终通知public void myAfter(){System.out.println("最终通知···");}// 环绕通知public Object myAround(ProceedingJoinPoint point) throws Throwable {System.out.println("环绕前···");// 执行方法Object obj = point.proceed();System.out.println("环绕后···");return obj;}

2. 配置切面

        <!-- 配置AOP --><aop:config><!-- 配置切面 --><aop:aspect ref="myAspectJAdvice"><!-- 配置切点 --><aop:pointcut id="myPointcut" expression="execution(* com.example.dao.UserDao.* (..))"/><!-- 配置后置通知 --><aop:after-returning method="myAfterReturning" pointcut-ref="myPointcut"/><!-- 前置通知 --><aop:before method="myBefore" pointcut-ref="myPointcut"/><!-- 异常通知 --><aop:after-throwing method="myAfterThrowing" pointcut-ref="myPointcut" throwing="e"/><!-- 最终通知 --><aop:after method="myAfter" pointcut-ref="myPointcut"/><!-- 环绕通知 --><aop:around method="myAround" pointcut-ref="myPointcut"/></aop:aspect></aop:config>

3. 测试

OK,这里我们测试用户新增方法 ,确实是得出来我们想要的结果了

五、切点表达式

切点表达式:访问修饰符 返回值 包名.类名.方法名(参数列表)

  • 使用AspectJ需要使用切点表达式配置切点位置,写法如下:
  • 标准写法:访问修饰符 返回值 包名.类名.方法名(参数列表)
  • 访问修饰符可以省略。
  • 返回值使用 * 代表任意类型。
  • 包名使用 * 表示任意包,多级包结构要写多个 * ,使用 *.. 表示任意包结构
  • 类名和方法名都可以用 * 实现通配。

参数列表

  • 基本数据类型直接写类型
  • 引用类型写 包名.类名
  • * 表示匹配一个任意类型参数
  • .. 表示匹配任意类型任意个数的参数

全通配: * *..*.*(..)

六、多切面配置 

        我们可以为切点配置多个通知,形成多切面,比如希望dao层的每个方法结束后都可以打印日志并发送邮件:

1. 编写发送邮件的通知

package com.example.aspect;import org.aspectj.lang.JoinPoint;public class MyAspectJAdvice2 {// 后置通知public void myAfterReturning(JoinPoint point){System.out.println("发送邮件···");}
}

2. 配置切面

在上面的基础上配置多一个切面即可

    <aop:aspect ref="myAspectJAdvice2"><aop:pointcut id="myPointcut2" expression="execution(* com.example.dao.UserDao.*(..))"/><aop:after-returning method="myAfterReturning" pointcut-ref="myPointcut2"/></aop:aspect>

3. 测试 

        OK,确实是打印了发送邮件,因此该多切面配置成功,下面接着讲解用另外几种方法实现AOP ,让我们一起学习啪

往期专栏&文章相关导读 

     大家如果对于本期内容有什么不了解的话也可以去看看往期的内容,下面列出了博主往期精心制作的Maven,Mybatis等专栏系列文章,走过路过不要错过哎!如果对您有所帮助的话就点点赞,收藏一下啪。其中Spring专栏有些正在更,所以无法查看,但是当博主全部更完之后就可以看啦。

1. Maven系列专栏文章

Maven系列专栏Maven工程开发
Maven聚合开发【实例详解---5555字】

2. Mybatis系列专栏文章

Mybatis系列专栏MyBatis入门配置
Mybatis入门案例【超详细】
MyBatis配置文件 —— 相关标签详解
Mybatis模糊查询——三种定义参数方法和聚合查询、主键回填
Mybatis动态SQL查询 --(附实战案例--8888个字--88质量分)
Mybatis分页查询——四种传参方式
Mybatis一级缓存和二级缓存(带测试方法)
Mybatis分解式查询
Mybatis关联查询【附实战案例】
MyBatis注解开发---实现增删查改和动态SQL
MyBatis注解开发---实现自定义映射关系和关联查询

3. Spring系列专栏文章 

Spring系列专栏Spring IOC 入门简介【自定义容器实例】
IOC使用Spring实现附实例详解
Spring IOC之对象的创建方式、策略及销毁时机和生命周期且获取方式
Spring DI简介及依赖注入方式和依赖注入类型
Spring IOC相关注解运用——上篇
Spring IOC相关注解运用——下篇
Spring AOP简介及相关案例
注解、原生Spring、SchemaBased三种方式实现AOP【附详细案例】
Spring事务简介及相关案例
Spring 事务管理方案和事务管理器及事务控制的API
Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

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

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

相关文章

Java与数据库:JDBC和ORM框架的使用和效率优化

第一章&#xff1a;引言 随着互联网的快速发展和大数据时代的到来&#xff0c;数据库在软件开发中起到了至关重要的作用。Java作为一门强大而广泛应用的编程语言&#xff0c;提供了多种与数据库交互的方式。其中&#xff0c;JDBC和ORM框架是最常用的两种方式。本文将深入探讨J…

适合打游戏用的蓝牙耳机有哪些?吃鸡无延迟的蓝牙耳机推荐

现在手游的兴起&#xff0c;让游戏市场变得更加火爆&#xff0c;各种可以提高玩家体验的外设也越来越多&#xff0c;除了提升操作的外置按键与手柄外&#xff0c;能带来更出色音质与舒心使用的游戏耳机&#xff0c;整体氛围感更好&#xff0c;让玩家在细节上占据优势&#xff0…

打游戏的蓝牙耳机推荐哪一款?吃鸡蓝牙游戏耳机推荐

选倒一款好的蓝牙耳机&#xff0c;即可以享受美妙音乐&#xff0c;也可以沉浸于深度游戏体验之中&#xff0c;能够让自己的身心压力得到释放。不过呢&#xff0c;最近发现很多人在买蓝牙耳机的时候都不知道怎么选一款靠谱的产品。作为已有5年多玩机经验的爱好者&#xff0c;今天…

即兴演讲、怎么锻炼即兴演讲能力、一些即兴演讲的模板

文章目录 应有素质准备方法模糊性临场性 组合形式并列式正反式递进式 基本技巧举例说明**一. 散 点 联 想 法****二. 问题--原因--解决方案****三. 感谢--回顾--愿景****四. 观 音 按 揭 法****五. 黄 金 三 点 法****六. 总 结****1. 五个名称-锻炼你的大脑快速反应能力****2.…

String字符串

文章目录 String类String常用的字符串处理方法StringBuffer类 StringBufferStringBuffer类中常用的方法StringBuilder类&#xff08;了解为主&#xff09;StringTokenzier类&#xff08;了解为主&#xff09; final属性&#xff0c;不可扩展&#xff0c;不可子类&#xff0c;不…

在idea中创建一个SpringBoot模块

方式一&#xff1a;自动创建&#xff08;需要联网&#xff09; 第一步&#xff1a;新建模块 按住ctrlshiftalts&#xff0c;打开项目结构&#xff0c;选择新建模块&#xff1b; 第二步&#xff1a;选择Spring Web &#xff08;1&#xff09;选择SpringBoot版本&#xff0c…

结构型模式的设计模式笔记

此笔记是在软件秘笈-设计模式那点事上做的笔记 一.适配器模式 1.设计思路 既有的软件结构具有稳定运行的基础&#xff0c;但是却无法直接利用到新的程序当中&#xff0c;这时就需要一个适配器&#xff0c;在原有内容和新的结果之间沟通&#xff0c;从而达到预期的效果 &#…

asp.net 面试题目

1、页面传值的方式及其优缺点?Session,Application,Cookies,Requst.QueryString,Requst.Form,Server.Transfer(通过Context.Handler接收整个页面)2、ASP.NET身份验证方式及其工作原理Windows 身份验证提供程序提供有关如何将 Windows 身份验证与 Microsoft Internet 信息服务 …

浮躁的原罪-兼答网友留言

交流的起点&#xff1a; 首先感谢所有回帖和关注的网友。因为下面主要是对异议和反对者的答复&#xff0c;这看来对支持&#xff0f;认同我的观点和心有戚戚焉的各位不公平&#xff0c;所以这里先对你们的支持表示感激。无论是对反对者还是支持者&#xff0c;随着我的观点的展…

【案例】 生成词云玩玩?

案例介绍 今天我们来生成词云&#xff0c;所谓词云&#xff0c;就是以一定的频度将大小不用的词汇显示在图片模板上。 准备工作 wordcloud&#xff08;生成词云核心&#xff09;PILnumpyjieba&#xff08;提供分词功能&#xff09;模板图片需要分析的文本 模板图片 文本内容…

python汉语意思-python汉语谐音

广告关闭 2017年12月&#xff0c;云社区对外发布&#xff0c;从最开始的技术博客到现在拥有多个社区产品。未来&#xff0c;我们一起乘风破浪&#xff0c;创造无限可能。 上面介绍beautifulsoup的特点时说到了&#xff0c;beautifulsoup支持python标准库的解析器html5lib&…

android的属性如何使用方法,Android第二大控件,EditText的属性和使用方法

原标题&#xff1a;Android第二大控件&#xff0c;EditText的属性和使用方法 EditText与TextView非常相似&#xff0c;它甚至与TextView 共用了绝大部分XML属性和方法。EditText与TextView的最大区别在于&#xff1a;EditText可以接受用户输入。 一、EditText简介 EditText支持…

android textview点击部分,Android开发第二大控件,EditText的属性和使用方法

EditText与TextView非常相似&#xff0c;它甚至与TextView 共用了绝大部分XML属性和方法。EditText与TextView的最大区别在于&#xff1a;EditText可以接受用户输入。 一、EditText简介 EditText支持的XML属性及相关方法见TextView表中介绍的与输入有关的属性和方法&#xff0c…

C# 学习笔记入门篇

文章目录 C# 学习笔记入门篇〇、写在前面Hello World!这篇学习笔记适合什么人这篇学习笔记到底想记什么附加说明 一、命名空间“进入”命名空间嵌套的命名空间、分立的命名空间习题习题答案 二、类与面向对象相关概念在 C# 中定义类静态方法&#xff0c;程序入口习题 三、变量其…

小学计算机教学管理工作总结,2020小学信息技术教师教学工作总结

弹指一挥间,我在教师的岗位上走过了一年。下面是小编准备的2020小学信息技术教师教学工作总结&#xff0c;欢迎阅读。 2020小学信息技术教师教学工作总结1 从20**年至今&#xff0c;我一向担任我校的信息技术教学工作&#xff0c;由起初不知该怎样教的“学习型”教师&#xff0…

小学计算机课教学工作总结,小学信息技术课教师工作总结3篇

小学信息技术课教师工作总结3篇 在小学信息课堂教学中&#xff0c;教师进行教学设计时要充分结合学生的心理特点和兴趣取向&#xff0c;努力为学生创造出充满趣味性的学习环境。接下来小编给大家整理了小学信息技术课教师工作总结3篇&#xff0c;仅供参考。 小学信息技术课教师…

计算机房一般的讲台,小学糗事——献给黄陂蔡店小学辛勤的园丁

文 | 程志清(蔡店|宜昌) 1959年8月30日&#xff0c;我堂而皇之地来到蔡店北庙小学(以前都是偷偷来摸菩萨的。北庙小学&#xff0c;即蔡店小学前身)。 一进大门&#xff0c;只见天井上方正厅通体浑圆的大泥菩萨下&#xff0c;摆着一张课桌。课桌旁&#xff0c;坐着梳搭毛头的中年…

述计算机标点用途,顿号(标点符号)_百度百科

[dn ho] 顿号 (标点符号) 语音 编辑 锁定 讨论 上传视频 上传视频 顿号“、”是并列的词或词组之间的停顿&#xff0c;在汉语中主要有两个用途&#xff0c;分隔同类的并列的事&#xff0c;通常是单字、词语或短句&#xff0c;当中的停顿较逗号短。分隔用汉字作为序号的序号和内…

6 岁学编程,9 岁给电脑杂志社撰稿,19 岁收月薪 2 万 的 Offer | 程序人生 2020

作者 | 杨若瑜 责编 | 伍杏玲 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 【CSDN 编者按】在CSDN举办的“原力计划”活动中&#xff0c;编者看到一篇《 老程序员教你如何提高开发效率、成为大神0——从业余到专业》的文章。这位90后程序员6岁为了玩游戏自学at…

linux下哪个输入法最好,[最好]linux下输入法→linux下输入法

万能五笔输入法字根简化版 [最好]linux下输入法→linux下输入法【独创智能字根】 [最好]linux下输入法→linux下输入法还在为打字慢发愁? [最好]linux下输入法→linux下输入法五笔有那么难吗? [最好]linux下输入法→linux下输入法本软件独创智能字根法 [最好]linux下输入法→…