java Spring aop多个增强类作用于同一个方法时,设置优先级

news2025/2/25 5:56:12

我们先来模拟这种情况

我们先创建一个java项目 然后 引入Spring aop需要的基本依赖
在这里插入图片描述
然后 在src下创建一个包 我这里叫 Aop
在Aop包下创建一个类 叫 User
参考代码如下

package Aop;

import org.springframework.stereotype.Component;

@Component
public class User {
    public void add(){
        System.out.println("add......");
    }
}

然后 Aop下创建两个增强类 第一个 我叫 UserProxy
参考代码如下

package Aop;

import org.springframework.stereotype.Component;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Component
@Aspect
public class UserProxy {

    //拆分公共切入点
    @Pointcut(value = "execution(* Aop.User.add(..))")
    public void commonEntryPoint() {

    }

    //被增强方法执行前调用
    @Before(value = "commonEntryPoint()")
    public void before() {
        System.out.println("UserProxy before...");
    }
}

然后在Aop包下创建 第二个增强类 叫 secondaryEnhancement
参考代码如下

package Aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class secondaryEnhancement {
    //拆分公共切入点
    @Pointcut(value = "execution(* Aop.User.add(..))")
    public void commonEntryPoint() {

    }

    //被增强方法执行前调用
    @Before(value = "commonEntryPoint()")
    public void before() {
        System.out.println("secondaryEnhancement before...");
    }
}

此时 我们可以看到 secondaryEnhancement 和 UserProxy Before注解标注的增强方法 都指向了User中的add方法

然后 我们来写配置文件
在src目录下创建bean.xml
参考代码如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
       <context:component-scan base-package="Aop"></context:component-scan>
       <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

此时 我们在配置文件中 打开了 Aop包的扫描

但为题说回来 secondaryEnhancement 和 UserProxy都增强了 add方法 那么他们谁先谁后 又怎么设置呢?

此时 带出我们第二个组件 Order
格式 @Order(值) 接受一个数字类型的值 值越小 优先级越高

然后 我们这样

修改UserProxy 代码如下

package Aop;

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Component
@Aspect
@Order(1)
public class UserProxy {

    //拆分公共切入点
    @Pointcut(value = "execution(* Aop.User.add(..))")
    public void commonEntryPoint() {

    }

    //被增强方法执行前调用
    @Before(value = "commonEntryPoint()")
    public void before() {
        System.out.println("UserProxy before...");
    }
}

修改 secondaryEnhancement 参考代码如下

package Aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Aspect
@Order(2)
public class secondaryEnhancement {
    //拆分公共切入点
    @Pointcut(value = "execution(* Aop.User.add(..))")
    public void commonEntryPoint() {

    }

    //被增强方法执行前调用
    @Before(value = "commonEntryPoint()")
    public void before() {
        System.out.println("secondaryEnhancement before...");
    }
}

这时 UserProxy 优先级 为 1 secondaryEnhancement 为2 显然 1小于2 所以UserProxy 优先级更高 会被先执行

我们在src下新建测试类 参考代码如下

import Aop.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class text {
    public static void main(String args[]) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        User user = context.getBean("user", User.class);
        user.add();
    }
}

然后 我们运行测试类参考代码如下
在这里插入图片描述
可以看到 我们UserProxy 中的方法先执行了 然后 我们将两者优先级调换
运行结果如下

在这里插入图片描述
执行顺序也就反了过来 没有任何问题

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

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

相关文章

Java-形参与返回值

Java学习之道-1 一、形参与返回值 平时在进行代码编写的时候大多都是以变量作为形参或者以某种数据类型比如int、String或者Boolean等等作为返回值&#xff0c;本次主要介绍以下三种作为形参与返回值的情况 1、类名作为形参与返回值 类名&#xff0c;顾名思义是定义的class类&a…

国家级高新区企业主要经济指标(2012-2021年)

数据来源&#xff1a;国家统计局 时间跨度&#xff1a;2012-2021 区域范围&#xff1a;全国&#xff08;及各分类统计指标&#xff09; 指标说明&#xff1a;手工提取最新的中国统计年鉴数据中各个excel指标表&#xff0c;形成各个指标文件的多年度数据&#xff0c;便于多年…

物联网发展的重要通信技术Wi-Fi

Wi-Fi 可以适应各种场景的联网需求 Wi-Fi 在实现物联网创新方面发挥了基础性作用&#xff0c;提供了广泛的连接性&#xff0c;将各种“事物”相互连接、连接到互联网&#xff0c;以及连接到全球使用的 180 亿台 Wi-Fi 设备。物联网的经济潜力是无限的&#xff0c;Wi-Fi 为智能…

Spring aop之针对注解

前言 接触过Spring的都知道&#xff0c;aop是其中重要的特性之一。笔者在开发做项目中&#xff0c;aop更多地是要和注解搭配&#xff1a;在某些方法上加上自定义注解&#xff0c;然后要对这些方法进行增强(很少用execution指定&#xff0c;哪些包下的哪些方法要增强)。那这时就…

每日一题——L1-069 胎压监测(15)

L1-069 胎压监测 分数 15 小轿车中有一个系统随时监测四个车轮的胎压&#xff0c;如果四轮胎压不是很平衡&#xff0c;则可能对行车造成严重的影响。 让我们把四个车轮 —— 左前轮、右前轮、右后轮、左后轮 —— 顺次编号为 1、2、3、4。本题就请你编写一个监测程序&#…

Windows 10/11如何恢复已删除的照片?

如果你想在Windows 11或Windows 10上恢复已删除的照片&#xff0c;你可以参考这篇文章&#xff0c;使用2种方法轻松恢复Windows上永久删除的照片。 可以恢复电脑上已删除的照片吗&#xff1f; 随着科技的发展&#xff0c;越来越多的用户习惯于在电子设备上存储照片。如果这些…

实时渲染为什么快,能不能局域网部署点量云

提到渲染很多有相关从业经验的人员可能会想起&#xff0c;自己曾经在电脑上渲染一个模型半天或者更长的 时间才能完成的经历。尤其是在项目比较着急的时候&#xff0c;这种煎熬更是难受。但现在随着实时渲染和云渲染行业的发展&#xff0c;通过很多方式可以提升渲染的时间和效率…

管理数据就这样轻松:TablePlus 5.3.1Crack

数据库管理变得简单 适用于关系数据库的现代、原生且友好的 GUI 工具&#xff1a;MySQL、PostgreSQL、SQLite 等 支持一整套关系数据库&#xff08;和一些 NoSQL&#xff09; 数据库MySQL红移数据库服务器SQLite数据库雷迪斯卡桑德拉蟑螂数据库数据库垂直 我们的客户来自世界上…

数据结构(四):树、二叉树、二叉搜索树

数据结构&#xff08;四&#xff09;一、树1.树结构2.树的常用术语二、二叉树1.什么是二叉树2.二叉树的数据存储&#xff08;1&#xff09;使用数组存储&#xff08;2&#xff09;使用链表存储三、二叉搜索树1.这是什么东西2.封装二叉搜索树&#xff1a;结构搭建3. insert插入节…

分析| 2023年移动开发平台的发展空间

春节过后返工已经过月&#xff0c;许多移动开发领域的企业都在忙着做技术调研与选型。在此之前&#xff0c;不如先回顾一下2022年的市场趋势&#xff0c;再结合好的移动开发平台的标准&#xff0c;从中窥见2023年的发展前景。 Gartner十大战略技术趋势 全球权威咨询机构Gartne…

ChatGPT写程序如何?

前言ChatGPT最近挺火的&#xff0c;据说还能写程序&#xff0c;感到有些惊讶。于是在使用ChatGPT有一周左右后&#xff0c;分享一下用它写程序的效果如何。1、对于矩阵&#xff0c;把减法操作转换加法&#xff1f;感觉不错的&#xff0c;能清晰介绍原理&#xff0c;然后写示例程…

运动健身用什么耳机好、最健身使用的耳机推荐清单

健身锻炼已经趋向于“国民运动”了&#xff0c;大家都喜欢一边听歌一边挥洒汗水&#xff0c;但是运动时戴的耳机也是有学问在里边的&#xff0c;需要满足佩戴牢固、防水防汗的基本需求&#xff0c;并且&#xff0c;根据每个人运动偏好的不同选择倾向也不同&#xff0c;在这里我…

HDLC简介及相应hdlc实训

HDLC简介 HDLC 协议 高级数据链路控制&#xff08;HDLC&#xff0c;High-level Data Link Control&#xff09;是一种面向比特的链路层协议&#xff0c; 其最大特点是对任何一种比特流&#xff0c;均可以实现透明的传输。HDLC协议具有以下优点。 透明传输&#xff1a;HDLC不…

动漫插画培训班有哪些

动漫培训班有哪些&#xff0c;今天给大家带来的是国内专业的动漫培训机构排名&#xff0c;这5个动漫培训机构&#xff0c;相信你一定都知道&#xff0c;快来看看吧&#xff01; 一&#xff1a;动漫培训机构排名 1、轻微课 轻微课是国内人气很高的板绘学习平台&#xff0c;主打课…

经典文献阅读之--VoxelMap(体素激光里程计)

0. 简介 作为激光里程计&#xff0c;常用的方法一般是特征点法或者体素法&#xff0c;最近Mars实验室发表了一篇文章《Efficient and Probabilistic Adaptive Voxel Mapping for Accurate Online LiDAR Odometry》&#xff0c;同时还开源了代码在Github上。文中为雷达里程计提…

基于机器学习的异常检测与分析技术

传统的运维方式在监控、问题发现、告警以及故障处理等各个环节均存在明显不足&#xff0c;需要大量依赖人的经验&#xff0c;在数据采集、异常诊断分析、故障处理的效率等方面有待提高。 本关键技术面对传统运维故障处理效率低、问题定位不准确、人力成本高三大痛点&#xff0…

AXI实战(二)-跟着产品手册设计AXI-Lite外设(AXI-Lite转串口实现)

AXI实战(二)-跟着产品手册设计AXI-Lite 设(AXI-Lite转串口实现) 看完在本文后,你将可能拥有: 一个AXI_Lite转串口的从端(Slave)设计使用SV仿真AXI-Lite总线的完整体验实现如何在读通道中实现"等待"小何的AXI实战系列开更了,以下是初定的大纲安排: 欢迎感兴趣的…

【机器学习】为什么训练集用fit_transform而测试集只用transform?

文章目录一、解释二、归一化&#xff08;Normalization&#xff09;三、为什么只对训练集做fit_transform&#xff0c;对测试集只做transform&#xff1f;一、解释 fit(): Method calculates the parameters μ and σ and saves them as internal objects.解释&#xff1a;简…

使用vue3+vantUi3.x版本,van-list列表组件,控制台报错

van-list报错过程 在vue3.0vantUi3.x版本中&#xff0c;使用List列表组件时&#xff0c;代码就是官方给的demo&#xff1a; <van-listv-model:loading"loading":finished"finished"finished-text"没有更多了"load"onLoad" >&l…

甘肃西部河谷科技有限公司官网上线 | LTD技术行业案例分享

甘肃西部河谷信息科技有限公司成立于2018年&#xff0c;是一家专业的IT技术推广与服务公司。主营业务有智慧城市、智慧校园、智慧农业、信息技术设备软件研发、集成销售&#xff1b;安防设备、网络工程、市场营销策划、电子商务信息、技术咨询服务等。公司立足高端IT技术服务&a…