当前位置: 首页 > wzjs >正文

东莞大型企业网站建设电脑购物网站模板

东莞大型企业网站建设,电脑购物网站模板,哪个网站做长图免费转高清,网站建设的岗位叫什么Spring AOP 切面优先级Order 当我们在一个项目中,定义了多个切面类时,并且这些切面类的多个切入点都匹配到了同一个目标方法。 当目标方法运行的时候,这些切面类中的通知方法都会执行,那么这几个通知方法的执行顺序是什么样的呢&…

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


Spring AOP


image-20250421182839891


切面优先级@Order


当我们在一个项目中,定义了多个切面类时,并且这些切面类的多个切入点都匹配到了同一个目标方法

目标方法运行的时候,这些切面类中的通知方法都会执行,那么这几个通知方法的执行顺序是什么样的呢? 我们还是通过程序来求证:


为了测试切面优先级机制,我们先定义多个切面类 AspectDemo:

在这里插入图片描述


为防止干扰,我们把 AspectDemo1 这个切面先去掉(把 @Component 注解去掉就可以)。

image-20250421170114367


为了测试简单化,我们在新增的测试切面类中,只写了 @Before 和 @After 两个通知:

image-20250421170337925


image-20250421170729693


运行程序,访问接口:

image-20250421170838187


观察日志:

image-20250421170952729


通过上述程序的运行结果,可以看出:

image-20250421171446268

存在多个切面类时,默认按照切面类的类名字母排序:

  • @Before 通知:字母排名靠前的先执行
  • @After 通知:字母排名靠前的后执行

但这种方式不方便管理,我们的类名更多还是具备一定含义的。


Spring 给我们提供了一个新的注解,来控制这些切面通知的执行顺序:@Order,使用方式如下:

@Order(3)
public class AspectDemo2 {}@Order(2)
public class AspectDemo3 {}@Order(1)
public class AspectDemo4 {}

image-20250421183516326


重新运行程序,访问接口 http://127.0.0.1:8080/test/t2

image-20250421175305097


观察日志:

image-20250421175230661


切面类的多个切入点都匹配到了同一个目标方法的情况下,调用切点的优先级可以被 @Order() 注解调整:

image-20250421175904621


通过上述程序的运行结果,得出结论:

@Order 注解标识的切面类,执行顺序如下:

  • @Before 通知:数字越小先执行。
  • @After 通知:数字越大先执行。

@Order 控制切面优先级,先执行优先级较高的切面,再执行优先级较低的切面最终执行目标方法

image-20250420173031918


切点表达式


上面的代码中,我们一直在使用切点表达式来描述切点。下面我们来介绍一下切点表达式的语法。
切点表达式常见有两种表达方式:

  • execution(R ):根据方法签名来匹配。

  • @annotation(R ):根据注解匹配。


execution表达式


execution() 是最常用的切点表达式,用来匹配方法,语法为:

execution(<访问修饰符> <返回类型> <包名.类名.方法(方法参数)> <异常>)

其中:访问修饰符异常可以省略。

image-20250420173131501


切点表达式支持通配符表达:

符号描述详细说明
*匹配任意字符,只匹配一个元素
(返回类型、包、类名、方法、方法参数)
包名:使用*表示任意包(一层包使用一个 *)
类名:使用*表示任意类
返回值:使用*表示任意返回值类型
方法名:使用*表示任意方法
参数:使用*表示一个任意类型的参数
..匹配多个连续的任意符号,
可以匹配任意层级的包,
或者任意类型,任意个数的参数
包名:标识此包以及此包下的所有子包
参数:表示任意个任意类型的参数

切点表达式示例:


TestController 下的 public 修饰,返回类型为 String ,方法名为 t1,无参方法。

execution(public String com.example.demo.controller.TestController.t1())

省略访问修饰符

execution(String com.example.demo.controller.TestController.t1())

匹配所有返回类型

execution(* com.example.demo.controller.TestController.t1())

匹配 TestController 下的所有无参方法

execution(* com.example.demo.controller.TestController.*())

匹配 TestController 下的所有方法

execution(* com.example.demo.controller.TestController.*(..))

匹配 controller 包下所有的类所有方法

execution(* com.example.demo.controller.*.*(..))

匹配所有包下面的 TestController。

execution(* com..TestController.*(..))

匹配 com.example.demo 包下子孙包下所有类所有方法

execution(* com.example.demo..*(..))

@annotation


execution 表达式更适用于有规则的,如果我们要匹配多个无规则的方法呢;

比如:TestController 中的t1()UserController 中的u1()这两个方法:

image-20250421192158442


这个时候我们使用 execution 这种切点表达式来描述就不是很方便了。

我们可以借助自定义注解的方式以及另一种切点表达式 @annotation 来描述这一类的切点。


实现步骤:

  1. 编写自定义注解

  2. 使用 @annotation 表达式来描述切点

  3. 连接点的方法上添加自定义注解


自定义注解@MyAspect


创建一个注解类(和创建 Class 文件一样的流程,选择 Annotation 就可以了)。

image-20250420173824252


创建好一个注解后,我们定义这个注解的作用目标和作用生命周期:

image-20250421192705390


@Target


@Target 标识了 Annotation 所修饰的对象范围,即该注解可以用在什么地方。

取值描述
ElementType.TYPE用于描述类、接口(包括注解类型)或 enum 声明。
ElementType.METHOD描述方法。
ElementType.PARAMETER描述参数。
ElementType.TYPE_USE可以标注任意类型。

@Retention


@RetentionAnnotation 被保留的时间长短,标明注解的生命周期

@Retention 的取值有三种:

保留策略描述特点示例
RetentionPolicy.SOURCE注解仅存在于源代码中,编译成字节码后会被丢弃。- 运行时无法获取注解信息
- 只能在编译时使用
- 优化编译性能和字节码大小
@SuppressWarnings
@Data
@Slf4j(Lombok注解)
RetentionPolicy.CLASS注解存在于源代码和字节码中,但在运行时会被丢弃。- 编译时和字节码中可以通过反射获取注解信息
- 运行时无法获取注解信息
- 适用于框架和工具
通常用于一些框架和工具的注解
RetentionPolicy.RUNTIME注解存在于源代码、字节码和运行时中。- 编译时、字节码和运行时都可以通过反射获取注解信息
- 适用于需要在运行时处理的注解
@Controller
@ResponseBody(Spring注解)

切面类


接下来定义一个切面类,用于实现我们自定义的注解 @MyAspect 的逻辑,切面类代码如下:

image-20250421193126462


类名为 TimeRecord,表示这个类的逻辑是用于记录方法执行的时间;

@annotation(com.bit.springaopdemo.aspect.MyAspect):表示使用 @annotation 切点表达式定义切点,只对 @MyAspect 生效:

image-20250421193819171


注掉切面类 AspectDemo@Compenont 注解,避免干扰 TimeAspect() + @Around 组成的切面:

image-20250421194725148


切面类 TimeRecord 代码:

@Aspect
@Component
@Slf4j
public class TimeRecord {@Around("@annotation(com.bit.springaopdemo.aspect.MyAspect)")public Object TimeAspect(ProceedingJoinPoint pjp) {log.info("目标方法执行前.......");Object result = null;try {result = pjp.proceed();} catch (Throwable e) {log.error("do Around throwing");throw new RuntimeException(e);}log.info("目标方法执行后.......");return result;}
}

添加自定义注解


在 TestController 中的 t1() 和 UserController 中的 u1() 这两个方法上添加自定义注解 @MyAspect,其他方法不添加。

image-20250421195216678


运行程序,测试接口:

image-20250421195607610


使用 @annotation 切面表达式,不但可以拦截我们自定义的注解 @MyAspect,也可以拦截一些 Spring 封装好的注解,如 @RequestMapping;

image-20250421195906678

只要有连接点(目标方法)使用了 @RequestMapping 注解,就会先执行 @annotation 声明下的通知(方法具体逻辑)

  • 此路是我开,此树是我栽(@annotation(@m)
  • 狗(连接点(带@m))过了都得挨两耳勺儿(通知)

Spring AOP 的实现方式(常见面试题)


面试官:谈谈你对IOC和AOP的理解及AOP四种实现方式通俗易懂]-腾讯云开发者社区-腾讯云


在这里插入图片描述

在这里插入图片描述


文章转载自:

http://7rdZlQmY.pjfmq.cn
http://FHSrPhBQ.pjfmq.cn
http://kXGKSoIu.pjfmq.cn
http://b2EAHVxZ.pjfmq.cn
http://b1EHkiba.pjfmq.cn
http://i6PjmJgO.pjfmq.cn
http://HgQMGaA3.pjfmq.cn
http://BR5vpWDS.pjfmq.cn
http://gcCxDAWI.pjfmq.cn
http://kHCmtQ9u.pjfmq.cn
http://GsDvkSTB.pjfmq.cn
http://ymU7T4jP.pjfmq.cn
http://gE1X3PVR.pjfmq.cn
http://vecPv2uM.pjfmq.cn
http://h7yJNydj.pjfmq.cn
http://v6UnnAFn.pjfmq.cn
http://I2Zd0XK7.pjfmq.cn
http://8dgC3PLg.pjfmq.cn
http://tjJUNV7Y.pjfmq.cn
http://psGdgQq2.pjfmq.cn
http://Ru9JSpSn.pjfmq.cn
http://P711RHrd.pjfmq.cn
http://A9cSXvjA.pjfmq.cn
http://YGakvgVJ.pjfmq.cn
http://SIfn8MHe.pjfmq.cn
http://BX5o1QXd.pjfmq.cn
http://ktF0qlRM.pjfmq.cn
http://CiAoBOXB.pjfmq.cn
http://38NaNmBa.pjfmq.cn
http://Tey6gSaV.pjfmq.cn
http://www.dtcms.com/wzjs/705472.html

相关文章:

  • 百度不收录网站怎么办免费咨询医生的app
  • seo网站优化报价wordpress 重新设置密码
  • 中卫网站推广网络营销美容网站设计
  • 凡客网上购物商城搜索引擎优化的意思
  • 推广策略研究推广seo网站的公司
  • 整站优化seo软件外包公司
  • 傻瓜式建站平台泰安专业网站开发公司
  • 做网站得先注册域名吗免费 网站 平台
  • 长沙开发网站小说网站开发实录
  • 做网站备案的问题西安网络公司
  • 网站开发类投标文件做360手机网站快
  • 网站培训制度个人注册域名怎么申请
  • 巫山集团网站建设网页设计与制作作业成品免费
  • 手把手教你实现电商网站开发wordpress自动发货
  • 一般网站开发用什么笔记本seo智能优化系统
  • 网站开发能进无形资产吗网易企业邮箱是干嘛的
  • 网站建设前言网站设计技术入股
  • 哪个网站可以做问卷社区推广活动方案
  • 如何做有后台的网站找网站有中文字目的
  • 网站建设平面要多少分辨率wordpress 制作portfolio
  • 网站建设公司都会有哪些花销网站分析工具有哪些
  • 手机建设网站自适应的好处大连网站建设佳熙科技
  • 网站用途网上商城如何推广
  • 域名有了怎么制作网站免费做网站方案
  • 南宁企业建站系统下载京东商城网上购物
  • 做英雄联盟网站的图片素材嘉兴企业网站排名
  • 10个好用的wordpress投票_评分插件杭州谷歌seo公司
  • 焦作维科网站建设公司wordpress虚拟卡密
  • 做任务的阅币漫画网站网页特效 网页素材的网站
  • 如果做微商需不需要开个网站网站如果不备案吗