004 AOP使用

文章目录

    • 基于AspectJ的AOP的使用
      • 添加依赖
      • 编写目标类和目标方法
      • 使用XML实现
        • 实现步骤
        • 切入点表达式
        • 通知类型
      • 使用注解实现
        • 实现步骤
        • 环绕通知注解配置
        • 定义通用切入点
      • 纯注解方式

基于AspectJ的AOP的使用

其实就是指的Spring+AspectJ整合,不过Spring已经将AspectJ收录到自身的框架中,并且底层织入依然是采取的动态织入方式

添加依赖

<!--基于AspectJ的aop依赖-->
<dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.7.RELEASE</version>
</dependency>
<dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version>
</dependency>

编写目标类和目标方法

  • 编写接口和实现类(目标对象)

UserService接口
UserServiceImpl实现类

  • 配置目标类,将目标类交给spring IoC容器管理
<context:component-scan base-package="sourcecode.ioc" />

使用XML实现

实现步骤
  • 编写通知(增强类,一个普通的类)
public class MyAdvice {public void log(){System.out.println("记录日志...");}
}
  • 配置通知,将通知类交给spring IoC容器管理
<!--配置通知、增强-->
<bean name="myAdvice" class="cn.spring.advice.MyAdvice"></bean>
  • 配置AOP 切面
<!--配置通知、增强-->
<bean name="myAdvice" class="cn.spring.advice.MyAdvice"></bean><!-- AOP配置 -->
<aop:config><aop:aspect ref="myAdvice"><!-- method:指定要增强的方法,也就是指定通知类中的增强功能方法 --><!-- pointcut:指定切入点,需要通过表达式来指定--><aop:before method="log" pointcut="execution(void cn.spring.dao.UserDaoImpl.insert())"/></aop:aspect></aop:config>
切入点表达式
  • 切入点表达式的格式

execution([修饰符] 返回值类型 包名.类名.方法名(参数))

  • 表达式格式说明
    execution:必须要
    修饰符:可省略
    返回值类型:必须要,但是可以使用*通配符
    包名

多级包之间使用.分割
包名可以使用*代替,多级包名可以使用多个*代替
如果想省略中间的包名可以使用 ..

类名

可以使用*代替
也可以写成*DaoImpl

方法名

也可以使用*号代替

参数

参数使用*代替
如果有多个参数,可以使用..代替

通知类型

通知类型(五种):前置通知、后置通知、最终通知、环绕通知、异常抛出通知

  • 前置通知:

执行时机:目标对象方法之前执行通知
配置文件:<aop:before method=“before” pointcut-ref=“myPointcut” />
应用场景:方法开始时可以进行校验

  • 后置通知:

执行时机:目标对象方法之后执行通知,有异常则不执行了
配置文件:<aop:after-returning method=“afterReturning” pointcut-ref=“myPointcut” />
应用场景:可以修改方法的返回值

  • 最终通知:

执行时机:目标对象方法之后执行执行通知,有没有异常都会执行
配置文件:<aop:after method=“after” pointcut-ref=“myPointcut” />
应用场景:例如像释放资源

  • 环绕通知:

执行时机:目标对象方法之前和之后都会执行
配置文件:<aop:around method=“around” pointcut-ref=“myPointcut” />
应用场景:事务、统计代码执行时机

  • 异常抛出通知:

执行时机:在抛出异常后通知
配置文件:<aop:after-throwing method=“afterThrowing” pointcut-ref=“myPointcut” />
应用场景:包装异常

使用注解实现

实现步骤
  • 编写切面类(注意不是通知类,因为该类中可以指定切入点)
/**
*	切面类(通知+切入点)
*/
// @Aspect:标记该类是一个切面类
@Component("myAspect")
@Aspect
public class MyAspect {//@Before: 标记该方法是一个前置通知//value: 切入点表达式@Before(value = "execution(* *..*.*DaoImpl.*(..))")public void log() {System.out.println("记录日志...");}
}
  • 配置切面类
<context:component-scan base-package="com.spring"/>
  • 开启AOP自动代理
<!-- AOP基于注解的配置-开启自动代理 -->
<aop:aspectj-autoproxy />
环绕通知注解配置

@Around

作用:
把当前方法看成环绕通知。属性:
value:
用于指定切入点表达式,还可以指定切入点表达式的引用

@Around(value = "execution(* *.*(..))")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) {//定义返回值Object rtValue = null;try {//获取方法执行所需的参数Object[] args = joinPoint.getArgs();//前置通知:开启事务beginTransaction()//执行方法rtValue = joinPoint.proceed(args);//后置通知:提交事务commit();} catch (Throwable e) {//异常通知:回滚事务rollback();e.printStackTrace();} finally {//最终通知:释放资源release();}return rtValue;
}
定义通用切入点

使用@PointCut注解在切面类中定义一个通用的切入点,其他通知可以引用该切入点

//@Aspect:标记该类是一个切面类
@Aspect
public class MyAspect {//@Before:标记该方法是一个前置通知//@Value:切入点表达式//@Before(value = "execution(* *..*.*DaoImpl.*(..))")@Before(value="MyAspect.fn()")public void log() {System.out.println("记录日志...");}//@Before(value = "execution(* *..*.*DaoImpl.*(..))")@Before(value="MyAspect.fn()")public void validate() {System.out.println("进行后台校验...");}//通过@Pointcut定义一个通用的切入点@Pointcut(value = "execution(* *..*.*DaoImpl.*(..))")public void fn() {}}

纯注解方式

@Configuration
@ComponentScan(basePackages="com.aaa")
@EnableAspectJAutoProxy
public class SpringConfiguration {
}

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

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

相关文章

软考中级证在手里,感觉白躺家里了?

软考中级&#xff0c;最适合考的专业是《系统集成项目管理工程师》&#xff0c;特别适合零基础的人&#xff01; 2022年中级职称的报名条件和要求非常宽松&#xff0c;即使没有学历、零基础和相关工作经验也可以考试&#xff01;&#xff01;&#xff01; 一、职称的含金量 …

docker 中 File Sharing 和Volumes 的区别

在 Docker 中&#xff0c;File Sharing 和 Volumes 都涉及到将文件和目录从主机系统映射到容器中&#xff0c;但它们的用途和实现方式有一些重要的区别&#xff1a; 一、简介 File Sharing 是 Docker Desktop 在 Windows 和 macOS 上的一项功能&#xff0c;允许你将主机文件系…

中国最厉害的改名大师颜廷利:食物的真正人生意义是识悟

在探索人生意义的深邃征途中&#xff0c;我们本应以“识悟”为航标&#xff0c;不断扬帆远航&#xff0c;以实现自我的升华。然而&#xff0c;当回望人世繁华&#xff0c;古往今来&#xff0c;无论男女老少&#xff0c;似乎都在“食物”的陪伴下&#xff0c;徘徊往复&#xff0…

计算机网络复习

2024年whut 概述 1.计算机网络的目标&#xff1a;信息传输和资源共享 2.网络协议的要素&#xff08;必考&#xff09;&#xff1a; 语法&#xff1a;数据信息和控制信息的结构或格式 语义&#xff1a;要发出何种控制信息&#xff0c;完成何种动作&#xff0c;做出何种响应 同…

safari浏览器无法连接到服务器

问题&#xff1a;MacBook pro&#xff0c;网络连接正常&#xff0c;可以使用各种软件上网&#xff0c;唯独safari浏览器打不开网页&#xff0c;报错说Safari无法连接到服务器&#xff1b; 原因&#xff1a;使用了VPN&#xff0c;VPN自动更改了网络设置&#xff0c;导致Safari浏…

监控局域网电脑屏幕的办法,最简单的三种方法,好用!

在现代企业管理和家庭教育环境中&#xff0c;对局域网内电脑屏幕进行有效监控成为了保障信息安全、提升工作效率和监督行为规范的重要手段。 监控局域网电脑屏幕不仅可以帮助管理者了解员工的工作状态&#xff0c;确保资源的合理使用&#xff0c;还能在一定程度上预防潜在的网…

银行卡归属地查询-银行卡归属地接口-银行卡归属地API

接口简介&#xff1a;通过银行卡号查询国内外银行名称、银行卡卡种、卡品牌以及银行卡发卡省份和城市&#xff0c;支持借记卡和部分贷记卡的发卡省市查询。 若银行卡是农村信用社&#xff0c;归属地无法区分到城市&#xff0c;只能到省份 接口地址&#xff1a;https://www.wapi…

CentOS 7 安装MySQL以及常见问题解决

访问网站&#xff1a;http://repo.mysql.com 找到适配CentOS 7版本的MySQL 的YUM仓库包rpm文件&#xff0c;如下图 下载后&#xff0c;找到安装包的位置 空白处右键&#xff0c;选择在终端打开 查看当前目录下文件 # 安装MySQL 5.7的YUM仓库包rpm -ivh mysql57-community-rele…

js的导入导出

js 的导入导出 在 JavaScript 中&#xff0c;可以使用 import 关键字来导入其他模块或文件。而使用 export 关键字则可以将变量、函数等内容从当前模块导出供其他地方引用。 下面是一些示例代码&#xff1a; 导入模块&#xff1a; // 导入名为 "module" 的模块 i…

中科数安 | 加密管理系统

中科数安提供的加密管理系统是一套全面而高效的数据安全解决方案&#xff0c;旨在保护企业核心文件资料的安全。该系统结合了多种先进的技术手段和管理策略&#xff0c;确保企业数据在存储、传输和使用过程中都得到严格的保护。 www.weaem.com 以下是中科数安加密管理系统的主要…

固定式土壤墒情监测仪—土壤状况进行长期跟踪和分析

TH-TS600 固定式土壤墒情监测仪是一种专门用于长期、连续、自动监测土壤墒情的设备。能够实时监测土壤的水分、温度、湿度等关键参数&#xff0c;确保农民和管理者能即时获取土壤状况信息&#xff0c;便于及时做出农业决策。由于是自动监测&#xff0c;数据采集的准确性和可靠性…

比较器是什么比较器和运放的区别

比较器是一种能够对两个或多个数据项进行比较&#xff0c;以确定它们是否相等、大小关系及排列顺序的电路或装置。它通常用于将一个模拟电压信号与一个基准电压进行比较&#xff0c;当输入电压的差值增大或减小且正负符号不变时&#xff0c;其输出保持恒定。比较器的两路输入为…

[答疑]订单、预约单的流水号是冗余属性吗

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 陈磊 2024-6-12 20:40 老师好&#xff01;我学习了软件方法的类图内容&#xff0c;也已经认真做题了&#xff0c;现有一个问题想请老师解惑。 像订单、预约单这样的单据生成的时候&a…

铁砧帝国延迟高?铁砧帝国延迟严重这样解决

铁砧帝国是一款少见的多人在线游戏&#xff0c;游戏能支持上千名玩家建立帝国并互相作战。而且这款游戏在细节方面也做足准备&#xff0c;设计了攻城梯和攻城锤等设备&#xff0c;以攻破坚固的城墙和要塞&#xff0c;不过具体获取方法就需要玩家自己摸索。因为最近开放了测试申…

ifconfig eth0 hw ether

ifconfig hw ether 是一个用于在 Linux 系统中设置或更改网络接口的硬件地址&#xff08;即 MAC 地址&#xff09;的命令。具体操作步骤如下&#xff1a; 首先&#xff0c;您需要确定要更改 MAC 地址的网络接口名称&#xff0c;通常是 eth0, eth1 等&#xff0c;取决于您的系统…

【免费API推荐】:满足您的开发需求,加速项目上线

免费API助力项目开发&#xff0c;为开发者们提供了强大的支持和工具。这些API提供了各种功能和服务&#xff0c;能够帮助项目开发者们快速构建出高质量的应用。无论是地理位置服务、支付接口、社交媒体集成还是图像识别&#xff0c;这些免费API为项目开发者们提供了丰富的功能和…

Cortex-A510——Cache

Cortex-A510——Cache 小狼http://blog.csdn.net/xiaolangyangyang 1、Cortex-A510 Cache组织结构 以cache-size为32k&#xff0c;cache-line为32Byte为例&#xff1a; 组相连&#xff08;常用结构&#xff09;&#xff1a;4-way&#xff0c;256-set直接映射&#xff1a;相当于…

supOS浅度集成

一、浅度集成介绍 浅度集成是根据项目或者演示要求而做的集成工作&#xff0c;通过接入supOS的单点登录&#xff0c;UI调整&#xff0c;菜单栏的集成&#xff0c;从而达到客户使用supOS平台来使用各个应用的能力。 二、浅度集成的作用 通过较少的研发投入使APP应用浅度融入到…

Chrome 报错: ERR_ACCESS_DENIED

ERR_ACCESS_DENIED - Search 在阅读了提供的 Chromium 代码搜索结果后&#xff0c;以下是关于 ERR_ACCESS_DENIED 错误的一些详尽笔记&#xff1a; 定义与值&#xff1a; ERR_ACCESS_DENIED 是一个错误代码&#xff0c;通常表示访问资源&#xff08;非网络资源&#xff09;的权…

“==“和 equals 方法究竟有什么区别?

操作符 操作符用于比较两个变量的值是否相等。在比较基本数据类型时&#xff0c; 比较的是它们的值是否相同。在比较引用类型时&#xff0c; 比较的是它们在内存中的地址是否相同&#xff0c;即两个引用是否指向同一个对象。 基本数据类型示例&#xff1a; int a 5; int b …