spring-aop的使用(注解 +配置类的方式)(多个增强类的优先级问题)

spring-aop

首先,准备一个接口以及其实现类

Calculator接口:src/main/java/com.atguigu.service/Calculator接口

package com.atguigu.service;public interface Calculator {int add(int i, int j);int sub(int i, int j);int mul(int i, int j);int div(int i, int j);
}

Calculator接口的实现类:src/main/java/com.atguigu.service/impl/CalculatorImpl.java

package com.atguigu.service.impl;import com.atguigu.service.Calculator;
import org.springframework.stereotype.Component;@Component
public class CalculatorImpl implements Calculator {@Overridepublic int add(int i, int j) {int ret = i + j;return ret;}@Overridepublic int sub(int i, int j) {int ret = i - j;return ret;}@Overridepublic int mul(int i, int j) {int ret = i * j;return ret;}@Overridepublic int div(int i, int j) {int ret = i / j;return ret;}
}

然后,写一个配置类JavaConfig.java

src/main/java/com.atguigu.config/JavaConfig.java

package com.atguigu.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;@Configuration
@ComponentScan("com.atguigu")
@EnableAspectJAutoProxy:开启aspectj的注解,等同于.xml配置文件的<aop:aspectj-autoproxy />
@EnableAspectJAutoProxy
public class JavaConfig {
}

再然后,写一个专门的切面表达式的类

src/main/java/com.atguigu.pointcut/MyPointCut.java

package com.atguigu.pointcut;import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;这是专门存储切点表达式类
@Component
public class MyPointCut {@Pointcut("execution(* com.atguigu.service.impl.*.*(..))")public void pc(){}@Pointcut("execution(* com..impl.*.*(..))")public void myPc(){}
}

再再然后,专门的增强方法

src/main/java/com.atguigu.advice/MyAdvice.java

package com.atguigu.advice;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;import java.lang.reflect.Modifier;在增强方法中,获取目标方法的信息* 1、获取目标方法的信息(方法名、参数、访问修饰符、所属的类信息...)在方法的形参列表里,加(JoinPoint joinPoint)  import org.aspectj.lang.JoinPoint包下的JoinPoint就包含了目标方法的信息* 2、获取返回的结果,在 @AfterReturning 时在方法的形参列表里,加一个 returning = "ret",如下:@AfterReturning(value = "execution(* com..impl.*.*(..))", returning = "ret")public void afterReturning(JoinPoint joinPoint, Object ret){}* 3、获取异常一新,在 @AfterThrowing 时在方法的形参列表里,加一个throwing = "throwable",如下:@AfterThrowing(value = "execution(* com..impl.*.*(..))", throwing = "throwable")public void afterThrowing(JoinPoint joinPoint, Throwable throwable) {}切点表达式:固定语法:execution(1 2 3.4.5(6))1:访问修饰符,public / privae2:方法的返回参数类型,String / int / void如果不考虑访问修饰符 和 返回值类型的话,这两位整合在一起,写成*这两位是一体的,如果不考虑就都不考虑,不能出现 * String 这种情况3:包的位置具体包:com.atguigu.service.impl单层模糊:com.atguigu.service.*多层模糊:com..impl记住,..不能开头哦例如:找出所有impl包:com..impl,不能写成..impl,能写成 *..impl4:类的名称具体:myCLass模糊:*部分模糊:*Impl,意思是类名以Impl结尾的5:方法名语法和 上面4类的名称一样6:形参列表没有参数:()有具体的参数:(String)(String,int)模糊参数:(..),意思是有没有参数都行,有多少个参数都行部分模糊:(String..),意思是String后面有没有无所谓(..int),意思是,最后一个参数是int(String..int),意思是,第一个参数是String,最后一个是int,中间的无所谓说一下切点表达式的提取和复用方式1、在当前类中提取首先,定义一个public void xxx(){} 这样的空方法然后,用注解@Pointcut("execution(* com..impl.*.*(..))")最后,增强注解中,引用上面定义的xxx这个空方法即可方式2、创建一个专门存储切点表达式的Xxx类只不过使用的时候,要这样:Xxx类的权限定符.方法名()如果,有多个增强类,优先使用哪一个?这就要用到:@Order(10),指定一个优先级的值,值越小,优先级越高,越高的前置先执行,后置后执行给增强类加上@Order(10)这个注解,就能控制这些增强类的优先级了@Component
@Aspect
@Order(10)
public class MyAdvice {切点表达式的提取和复用 - 方式1、在当前类中提取@Pointcut("execution(* com..impl.*.*(..))")public void pc(){}@Before("execution(* com..impl.*.*(..))")public void before(JoinPoint joinPoint) {获取方法属于的类的信息String simpleName = joinPoint.getTarget().getClass().getSimpleName();System.out.println("simpleName=" + simpleName);获取访问修饰符int modifiers = joinPoint.getSignature().getModifiers();String s = Modifier.toString(modifiers);获取方法名String name = joinPoint.getSignature().getName();System.out.println("name= " + name);获取目标方法的参数列表(就是获取目标方法的参数)Object[] args = joinPoint.getArgs();}@AfterReturning(value = "execution(* com..impl.*.*(..))", returning = "ret")public void afterReturning(JoinPoint joinPoint, Object ret) {}// @AfterThrowing(value = "execution(* com..impl.*.*(..))", throwing = "throwable")@AfterThrowing(value = "com.atguigu.pointcut.MyPointCut.myPc()", throwing = "throwable")public void afterThrowing(JoinPoint joinPoint, Throwable throwable) {}// @After("execution(* com..impl.*.*(..))") 未使用 “切点表达式的提取和复用” 之前@After("pc()") // 使用 “切点表达式的提取和复用” 之后public void after(JoinPoint joinPoint) {}
}

最后,写一个测试类

src/text/java/com.atguigu.test/SpringAopTest.java

package com.atguigu.test;import com.atguigu.config.JavaConfig;
import com.atguigu.service.Calculator;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;@SpringJUnitConfig(value = JavaConfig.class)
public class SpringAopTest {@Autowiredprivate Calculator calculator;@Testpublic void test() {int add = calculator.add(1, 1);System.out.println("add= " + add);}
}

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

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

相关文章

docker 容器指定utf-8编码

在运行 Docker 容器的时候&#xff0c;如果容器内应用需要使用 UTF-8 编码来正常处理中文&#xff0c;你可以通过设置环境变量来指定编码。 可以使用 -e 或者 --env 标志来设置环境变量。比如&#xff0c;设置 LANG 和 LC_ALL 环境变量为 C.UTF-8 或者 en_US.UTF-8&#xff1a…

量子信息产业生态研究(一):关于《量子技术公司营销指南(2023)》的讨论

写在前面。量子行业媒体量子内参&#xff08;Quantum Insider&#xff09;编制的《量子技术公司营销指南》是一本实用的英文手册&#xff0c;它旨在帮助量子科技公司建立有效的营销策略&#xff0c;同时了解如何将自己定位成各自的行业专家。本文对这篇指南的主要内容进行了翻译…

ubuntu上安装截图工具-Flameshot及其使用步骤说明

Flameshot 火焰截图-推荐 安装命令&#xff1a; sudo apt install flameshot 操作方式&#xff1a; 1&#xff09;打开 2&#xff09;右上角弹窗 3&#xff09;点击后弹出 选择进行截图 4&#xff09;截图后再选择分享 5&#xff09;再重新选择区域&#xff0c;出现编辑…

【蓝桥杯】2024年第15届真题题目

试题 A: 握手问题 本题总分&#xff1a; 5 分 【问题描述】 小蓝组织了一场算法交流会议&#xff0c;总共有 50 人参加了本次会议。在会议上&#xff0c; 大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进 行一次握手&#xff08;且仅有一次&a…

Android bug Unresolved reference: BR

新建项目后 导入viewBinding 编译后提示 Unresolved reference: BR 解决办法 app 目录下 build.gradle 中 plugins 节点 添加 id kotlin-kapt参考 https://stackoverflow.com/questions/77409050/could-not-find-androidx-corecore-ktx1-8-10

npm包管理工具升降级

一、npm降级 1.接大版本号&#xff0c;降级到大版本最新的小版本 npm install npm5 -g 2.接指定版本号 npm install npm5.01.01 -g 二、npm升级 升级到最新版本 npm install npm -g 详细参考&#xff1a;nodejs与npm版本对应关系以及使用nvm管理node版本以及降npm版本-CSDN博…

CMD 汉字乱码处理

windows 11 cmd汉字乱码问题处理 一 查看CMD编码 win R 输入 cmd 输入 chcp 查看回显信息 “936”代表的意思就是 GBK (汉字内码扩展规范)&#xff0c;通常情况下GBK也是cmd的默认编码。 解决乱码需要把编码改为 utf-8 二 临时修改 在 终端中输入 chcp 65001 三 永久修改…

蓝桥杯嵌入式第十五届省赛真题题目

蓝桥杯昨天也考完了&#xff0c;大家可以看看题目 客观题题目 程序题题目

【复读EffectiveC++17】条款17:以独立语句将newed对象置入智能指针

条款17&#xff1a;以独立语句将newed对象置入智能指针 此条款&#xff0c;依然是针对智能指针的补充&#xff0c;内容分为两个部分&#xff1a; 有什么问题怎么解决 一、有什么问题 取原书的例子&#xff1a; 写一个函数&#xff0c;用来揭示程序处理的优先权。 再写一个函…

Opencv图像 ROI 与 mask 掩膜(找到感兴趣的区域)

在OpenCV中&#xff0c;可以使用ROI&#xff08;Region of Interest&#xff09;技术来处理图像中的感兴趣区域。ROI是指图像中的一个子区域&#xff0c;它可以是矩形、多边形或其他形状。使用ROI技术可以在不影响图像其他部分的情况下&#xff0c;对图像的某个区域进行操作。 …

【Python函数和类4/6】递归与匿名函数

目录 目标 匿名函数 多个形参 匿名函数的局限性 递归 语言例子 数学例子 递归的实现 递归代码 练习 总结 目标 在之前的博客中&#xff0c;我们学习了定义函数、调用函数以及设置函数的参数。在今天&#xff0c;我们会补充函数的两个常见的知识点&#xff0c;一个是匿…

学浪视频怎么缓存?

缓存学浪视频轻而易举&#xff01;推荐使用“小浪助手”&#xff0c;一款便捷的工具&#xff0c;助你轻松实现。工具已经预先打包好&#xff0c;需要的朋友可以自行下载。快试试&#xff0c;畅享学习吧&#xff01; 学浪下载器链接&#xff1a;https://pan.baidu.com/s/1y7vcq…

spring容器

spring容器 实现方式 spring中提供了各式各样的IOC容器的实现供用户选择和使用&#xff0c;使用什么样的容器取决于用户的需要 BeanFactory 该接口是最简单的容器&#xff0c;提供了基本的DI支持。最常用的BeanFactory实现是XmlBeanFactory类&#xff0c;根据XML文件中的定义加…

STL--什么是迭代器的失效

迭代器失效指的是当容器发生变化时&#xff0c;之前获取的迭代器不再指向有效的元素或者不再有意义&#xff0c;这种情况在 C STL 编程中比较常见。迭代器失效主要发生在以下几种情况&#xff1a; 1.元素被删除或修改: 如果你删除了某个迭代器所指向的元素&#xff0c;那么这个…

RetinalNet论文笔记

RetinalNet 概述1. 引言2. 相关工作3. 焦点损失4. RetinaNet Detector 检测器5. 实验6. 结论 3. Focal loss3.1. 平衡交叉熵3.2. 焦点损失定义3.3. 类别不平衡和模型初始化3.4. 类别不平衡和两阶段检测器 4. RetinaNet Detector特征金字塔网络骨干&#xff08;Feature Pyramid …

前端的导航栏数据是前端自己写好还是建议从后端拿数据渲染出来吗?

关于前端导航栏的数据来源&#xff0c;这实际上取决于具体的项目需求和应用场景。以下是两种方式的优缺点&#xff0c;供您参考&#xff1a; 前端自己写好&#xff1a; 优点&#xff1a; 加载速度快&#xff1a;导航栏数据直接嵌入前端代码中&#xff0c;无需等待后端接口响…

PostgreSQL入门到实战-第二十五弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(九)官网地址PostgreSQL概述PostgreSQL中NATURAL JOIN命令理论PostgreSQL中NATURAL JOIN命令实战更新计划 PostgreSQL中表连接操作(九) 使用PostgreSQL NATURAL JOIN从两个表中查询数据。 官网地址 声明: 由于操作系统, 版本更新…

Failed to resolve ‘bss.myhuaweicloud.com‘ ([Errno -2] Name or service not know

Failed to resolve ‘bss.myhuaweicloud.com’ ([Errno -2] Name or service not know 解決方案&#xff1a; 修改/etc/resolv.conf文件来指定DNS服务器&#xff0c;例如添加Google的公共DNS服务器&#xff1a; nameserver 8.8.8.8 nameserver 8.8.4.4

【软件设计师知识点】九、网络与信息安全基础知识

文章目录 计算机网络的概念网络分类网络拓扑结构网络体系结构ISO/OSI 7层参考模型TCP/IP 4层模型TCP/IP 协议族应用层协议传输层协议网络层协议IP 地址IPV4 数据报IP 地址分类子网划分子网掩码IPv6地址

C++实现AVL树

文章目录 一、平衡树的优势二、二叉平衡搜索树的节点定义三、二叉搜索树的插入3.1 寻找插入位置3.2 开始判定平衡因子&#xff0c;平衡因子有变就开始旋转3.2.1 左旋的情况3.2.2 左旋代码&#xff08;一定要考虑平衡因子为2或者-2的节点是否有父节点&#xff09;3.2.2 右旋的情…