spring aop实际开发中怎么用,Spring Boot整合AOP,spring boot加spring mvc一起使用aop,项目中使用aop

news2025/2/1 14:44:57

前言:本文不介绍 AOP 的基本概念、动态代理方式实现 AOP,以及 Spring 框架去实现 AOP。本文重点介绍 Spring Boot 项目中如何使用 AOP,也就是实际项目开发中如何使用 AOP 去实现相关功能。

如果有需要了解 AOP 的概念、动态代理实现 AOP 的,请查看我的另外一篇文章:

一篇文章带你深入了解 AOP


正文开始:


Spring Boot中实际应用AOP

1、之前介绍的实现 AOP 的方式中是有 XML 文件设置。但在 Spring Boot 中,没有 XML 文件,那怎么设置 AOP?

2、实际应用中:MVC三层架构,现需要在控制器中统一进行日志的输出(有各种各样的控制器),那怎么实现?(也就是说实际应用中如何实现?)

1、Cal 接口、CalIml 接口实现类 还是跟 Spring框架实现AOP 中一样。之前的两个依赖不要,添加这个依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2、控制器中需要打印日志,比如:调控制器中的哪个方法(接口)、方法有哪些参数、返回值。当然,你肯定可以在每个方法中写,但显然这不现实。这里用 AOP 方法将打印日志抽离出来,然后需要的时候嵌入到每个方法中

//以下代码仅是为了测试,代码不规范,请注意。

@RestController
@RequestMapping("/aop")
public class AopSpringBootTestHandler {

    @GetMapping("/findAll")
    public List<Account> findAll() {
        return Arrays.asList(new Account(1, "张三", 25), new Account(2, "李四", 26));
    }

    @GetMapping("/findById/{id}")
    public Account findById(@PathVariable Integer id) {
        return new Account(1, "张三", 25);
    }

    @GetMapping("/add")
    public boolean add() {
        return true;
    }

    @GetMapping("/update")
    public boolean update() {
        return true;
    }

    @GetMapping("/delete/{id}")
    public boolean delete(@PathVariable Integer id) {
        return true;
    }
}

自定义注解

3、自定义注解(比如:创建一个 annotation 的包,然后创建一个 LogAnnotation(可自定义,比如这里是打印日志的注解))

为什么要这个自定义注解?----> 首先你要让 AOP 知道你调了哪些方、哪些方法需要让 AOP 进行处理,所以就要让 AOP 知道这些方法,怎么知道? ----> 通过自定义注解

其次并不是所有的方法都需要进行 AOP 处理,所以通过 注解 标记。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotation {
    //使用注解时,给注解中添加值
    String value() default "";
}

说明:@Target、@Retention、@Documented 都是元注解(描述注解的注解)

@Target 表示该注解的使用目标,其中 @Target(ElementType.METHOD) 表示只能使用在方法上:

@Retention(RetentionPolicy.RUNTIME) 表示在运行时使用该注解。

@interface 标志这是一个注解。

String value() default ""; 固定写法,表示在使用注解的时候,可以添加值,默认为空:

**使用自定义注解:**需要进行 AOP 处理的方法,标记即可

4、标记完后,同理,需要切面类,执行非业务代码(比如这里是输出日志):

@Component
@Aspect
public class CreateAspectUtil {
    /*
    我们利用自定义注解标记了哪些方法需要进行AOP处理,那真正需要处理的时候,怎么找到这些标记?
        通过 Pointcut(切入点)找到这些标记
    所以这个方法就是为了找到标记,必须是空方法体
    */
    @Pointcut("@annotation(com.example.test.aopspringboottest.annotation.LogAnnotation)")
    public void logPointCut() {

    }

    /*
    找到标记后,怎么执行日志?
    1、跟之前一样,有@Before前置通知、@After后置通知等等
      @Around注解就是将各种通知统一到一起,然后将找标记的方法放进去
    2、连接点 ProceedingJoinPoint 是 joinPoint 的子接口,
       只是ProceedingJoinPoint中有这个proceed()方法,为了获取方法的返回值
    */
    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        String methodName = joinPoint.getSignature().getName();
        String methodArgs = Arrays.toString(joinPoint.getArgs());
        System.out.println(methodName + "方法的参数是:" + methodArgs);
        return joinPoint.proceed(); //返回目标方法(也就是业务代码)中的返回值
    }
}

演示: 启动启动类后,直接访问:

没加标记的就不会打印日志。

注意:现在还要求输出自定义注解中的值, 怎么办?----> 通过反射获取注解即可

既然获取注解,注解是添加在方法上的,所以先通过反射获取方法,怎么获取?----> 只有一个连接点,所以还是通过连接点:

@Around("logPointcut()")
public Object around(ProceedingJointPoint jointPoint) throws Throwable {
    //通过连接点获取到方法的签名
    MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature();
    //通过方法签名获取到方法
    Method method = methodSignature.getMethod();
    //拿到方法后,拿注解:把自定义注解的运行时类给它
    LogAnnotation annotation = method.getAnnotation(LogAnnotation.class);
    if (annotation != null) {
        //拿注解中的值,通过里面的value方法
        String value = annotation.value();
        //这个value就是注解里面的内容
        System.out.println(value);
    }
}

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

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

相关文章

如何用低成本进行宣传?媒介盒子分享

企业创立之初想要用低成本取得较好的宣传效果可以实现吗&#xff1f;可以。软文营销就能帮助企业做到。 然而数字时代中用户接受到的信息数量远远超过他们的理解能力。所以只有那些用户喜欢看到的信息才会被注意到&#xff0c;宣传才能起到效果。今天媒介盒子就来和大家聊聊&a…

软件测试:最强面试题整理出炉附答案,一点点小总结,建议收藏

一、Web自动化测试 1.Selenium中hidden或者是display &#xff1d; none的元素是否可以定位到&#xff1f; 不能,可以写JavaScript将标签中的hidden先改为0&#xff0c;再定位元素 2.Selenium中如何保证操作元素的成功率&#xff1f;也就是说如何保证我点击的元素一定是可以点…

【P2PTransportChannel 】2: 创建Connetion、 BasicPortAllocatorSession

基于m98P2PTransportChannel::MaybeStartGathering() 触发PortAllocator 对 session的管理(创建等) P2PTransportChannel::MaybeStartGathering() session都放在PortAllocator的 一个vector 中:std::vector<std::unique_ptr<PortAllocatorSession>> pooled_sess…

FreeRTOS之任务状态查询

1、相关API函数的使用 uxTaskPriorityGet(Task1Task_Handler);//传入task1的任务句柄,获取任务优先级 vTaskPrioritySet(Task1Task_Handler,30);//改变任务优先级 task_num uxTaskGetNumberOfTasks();//获取任务数量 #include "sys.h" #include "delay.h"…

【CF闯关练习】—— 900分段

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;cf闯关练习 &#x1f48c;其他专栏&#xff1a; &#x1f534;每日一题 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓…

【Nacos】—客户端与服务端源码解析

Nacos系列 Nacos—简述、注册中心、配置中心 Nacos安装教程 SpringBoot项目与Nacos配置 一、背景介绍 Nacos&#xff08;Naming and Configuration Service&#xff09;是阿里巴巴开源的服务发现和配置管理工具&#xff0c;它是一个全面的微服务基础设施组件&#xff0c;提供…

微信小程序开发系列-02注册小程序

上一篇文章&#xff0c;创建了一个最小的小程序&#xff0c;但是&#xff0c;还有3个疑问没有弄清楚&#xff0c;还是基于demo1工程&#xff0c;这篇文章继续探索。 当前的目录结构是否是完备的呢&#xff1f;&#xff08;虽然小程序可以运行起来&#xff09;app.js文件内容还…

GrayLog日志平台的基本使用-收集系统日志

1、新建Indices 2、新建Input Inputs新增syslog UDP的类型&#xff0c;接收端口为1514 UDP 用于接收Linux服务器使用rsyslog转发过来的系统日志 Input配置后&#xff0c;需要开放端口&#xff1a;firewall-cmd --permanent --zonepublic --add-port1514/udp; firewall-cmd --r…

【开源工程及源码】超级经典开源项目实景三维数字孪生智慧机场

智慧机场可视化平台通过可视化手段&#xff0c;将复杂的机场运营数据以图形、图表等形式展现&#xff0c;使管理者能够更直观、实时地了解机场的各个方面。飞渡科技通过整合物联网IOT、人工智能、大数据分析等技术&#xff0c;围绕机场管理、运控、安防、服务、监测等业务领域&…

【Filament】绘制立方体

1 前言 本文主要介绍使用 Filament 绘制彩色立方体&#xff0c;读者如果对 Filament 不太熟悉&#xff0c;请回顾以下内容。 Filament环境搭建绘制三角形绘制矩形绘制圆形 2 绘制立方体 本文项目结构如下&#xff0c;完整代码资源 → Filament绘制立方体。 2.1 自定义基类 为…

智赋百景|2023-2024年福建省大数据集团数据应用开发大赛重磅开赛!

为推动数据要素赋能千行百业&#xff0c;拓展自然语言处理技术在不同业务场景下的落地应用&#xff0c;进一步实现“智赋百景”&#xff0c;由福建省大数据集团有限公司主办&#xff0c;福建大数据一级开发有限公司、福建大数据交易有限公司、福建省数字经济产业工会共同承办的…

【小白专用】php以pdo方式连接sqlserver,开启sqlsrv扩展

一、安装ODBC程序&#xff0c; 下载适用于 SQL Server 的 ODBC 驱动程序 - 适用于 SQL Server 的 ODBC 驱动程序 |Microsoft 学习 运行安装程序&#xff0c;出现如下图所示页面&#xff1b; 选择下一步&#xff1b;选择我同意许可协议中的条款后选择下一步&#xff1b; 点击安…

告别高昂存储,高效灵活管理数据

前言 在当今数字化时代&#xff0c;企业面临着海量数据的挑战&#xff0c;这些数据承载着技术创新和业务发展的重要使命。因此&#xff0c;高效、安全地收集、存储和管理数据成为了企业关注的焦点。对于需要长期储存且低频聚合分析的数据&#xff0c;组织需要更加低成本和便捷…

Android平台RTSP流如何添加动态水印后转推RTMP或轻量级RTSP服务

技术背景 我们在对接外部开发者的时候&#xff0c;遇到这样的技术诉求&#xff0c;客户用于地下管道检测场景&#xff0c;需要把摄像头的数据拉取过来&#xff0c;然后叠加上实时位置、施工单位、施工人员等信息&#xff0c;然后对外输出新的RTSP流&#xff0c;并本地录制一份…

Java中使用JTS实现WKB数据写入、转换字符串、读取

场景 Java中使用JTS实现WKT字符串读取转换线、查找LineString的list中距离最近的线、LineString做缓冲区扩展并计算点在缓冲区内的方位角&#xff1a; Java中使用JTS实现WKT字符串读取转换线、查找LineString的list中距离最近的线、LineString做缓冲区扩展并计算点在缓冲区内…

PlatEMO 源码执行的具体过程

ALGORITHM 类 Algorithm类定义在Algorithms文件夹下。在这个目录中&#xff0c;算法根据分类分成了三种&#xff1a; 多目标算法&#xff1a;Multi-objecitve optimization单目标算法&#xff1a;Single-objective optimization工具算法&#xff1a;Utility functions 工具算法…

系统架构设计师教程(九)软件可靠性基础知识

软件可靠性基础知识 9.1 软件可靠性基本概念9.1.1 软件可靠性定义9.1.2 软件可靠性的定量描述9.1.3 可靠性目标9.1.4 可靠性测试的意义9.1.5 广义的可靠性测试与狭义的可靠性测试 9.2 软件可靠性建模9.2.1 影响软件可靠性的因素9.2.2 软件可靠性的建模方法9.2.3 软件的可靠性模…

02 特征点提取器 ORBextractor

文章目录 02 特征点提取器 ORBextractor2.0 基础知识2.0.1 图像金字塔2.0.2 ORB 特征点的关键点和描述子 2.1 构造函数&#xff1a;ORBextractor()2.2 构建图像金字塔 ComputePyramid()2.3 提取特征点并筛选 ComputeKeyPointsOctTree()2.4 筛选特征点 DistributeOctTree()2.5 计…

C++实现布隆过滤器

目录 一、什么是布隆过滤器 二、布隆过滤器的映射 三、布隆过滤器的作用 四、布隆过滤器的实现 五、总结测试 一、什么是布隆过滤器 之前我们学习了位图&#xff0c;我们知道位图主要是实现了整形的映射bit位&#xff0c;这样可以大幅度的节省空间&#xff0c;那么针对于…

【笔记】Spring是什么

什么是spring&#xff1f; Spring的基础知识铺垫 IOC AOP<-Spring->容器->生态 先说你的认知&#xff0c;总-分结构 spring是一个基础的框架&#xff0c;同时提供了Bean的容器&#xff0c;用来方便装载具体的Bean对象&#xff0c;之前在使用对象的时候必须自己new&…