SpringBoot Aop使用篇

Getting Started

SpringBoot AOP的实践

AOP相关的概念:

  • Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。就是抽离出来的逻辑类,比如日志、权限等。

  • Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。

  • Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。定义需要拦截的函数。

  • Advice(增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。

  • Target(目标对象):织入 Advice 的目标对象.。

  • Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程

在这里插入图片描述

Advice 的类型

  • before advice, 在 join point 前被执行的 advice. 虽然 before advice 是在 join point 前被执行, 但是它并不能够阻止 join point 的执行, 除非发生了异常(即我们在 before advice 代码中, 不能人为地决定是否继续执行 join point 中的代码)

  • after return advice, 在一个 join point 正常返回后执行的 advice

  • after throwing advice, 当一个 join point 抛出异常后执行的 advice

  • after(final) advice, 无论一个 join point 是正常退出还是发生了异常, 都会被执行的 advice.

  • around advice, 在 join point 前和 joint point 退出后都执行的 advice. 这个是最常用的 advice.
    introduction,introduction可以为原有的对象增加新的属性和方法。

使用 execution()

使用 execution 指定一个切点,就是定义需要拦截的东西。

1.定义一个切面

package org.example.springbootaop.aop;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;// 切面
@Aspect
@Component
public class AopAdvice {// 定义切点@Pointcut("execution(* org.example.springbootaop.controller.*.*(..))")public void test() {}// 通知:advice@Before("test()")public void beforeAdvice() {System.out.println("before advice...");}@After("test()")public void afterAdvice() {System.out.println("afterAdvice...");}@AfterReturning("test()")public void afterReturn() {System.out.println("afterReturn....");}@Around("test()")public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {System.out.println("beforce");try {proceedingJoinPoint.proceed();} catch (Throwable t) {t.printStackTrace();}System.out.println("after");}
}

execution(* org.example.springbootaop.controller.*.*(…))

第一个*代表方法返回值类型,第二个*代表任意类,第三个*代表任意方法,(…)代表任意参数类型。

使用 annotation()

1.自定义一个注解

package org.example.springbootaop.annotaion;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PermissionsAnnotation {
}

2.定义一个切面

package org.example.springbootaop.aop;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;@Aspect
@Component
public class CustomAnnAopAdvice {// 指定注解所在的包@Pointcut("@annotation(org.example.springbootaop.annotaion.PermissionsAnnotation)")private void permissionLog(){}@Before("permissionLog()")public void beforeAdvice() {System.out.println("custom annotation aop before");}
}

3.在对应的函数上使用注解

package org.example.springbootaop.controller;import com.fasterxml.jackson.databind.util.JSONPObject;
import org.example.springbootaop.annotaion.PermissionsAnnotation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class AnnotationAopController {@PostMapping("/aopTest")public String aopTest() {return "annotation aop";}@RequestMapping("/customAop")@PermissionsAnnotation   // 只用自定义的注解public String customAop() {return "custom annotation aop";}
}

使用以存在的注解,比如 GetMapping 也是这样使用,只不过 PointCut里指定GetMapping的注解包路径。

Github

完整的代码: https://github.com/chenguowei/project_java/blob/main/spring-boot-examples-demo/spring-boot-aop/README.md

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

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

相关文章

C++及QT的线程学习

目录 一. 线程学习 二. 学习线程当中,得到的未知。 1. 了解以下MainWindow和main的关系 2. []()匿名函数 有函数体,没有函数名. 3. join和detach都是用来管理线程的生命周期的,它们的区别在于线程结束和资源的回收。 4. operator()() 仿…

4G组网三相四线预付费电表-远程集中抄表

安科瑞薛瑶瑶18701709087/17343930412 DTSY1352 三相预付费电能表分别用于计量额定频率50Hz 的单、三相交流有功电能,具有预付费控制、负载控制、时间控制及 RS485 通信等功能,性能指标符合 GB/T17215.321-2008 标准。是改革传统用电体制&#xff0c…

杰理695的UI模式LED灯控制

UI模式LED灯修改每个模式对应的LED灯闪烁修改在ui_normal_status_deal(u8 *status, u8 *power_status, u8 ui_mg_para)

开源克隆声音的项目-OpenVoice V2

myshell的OpenVoice 出v2版本了 只需要上传一段20秒到5分钟之间的声音,就可以克隆声音。 单人讲话 没有背景噪音 时间在20秒至5分钟之间 本地部署我没有做,我在myshell的官网上测试了一下,可能是上传的音频有杂音,导致不是很清…

人机交互系统文本分类 text classification环节源码(E-commerce)

我把pre-trained model 下载到了本地 效果如下(到时候把代码中的sequence 和labels换成自己的text和分类就行了。): 源码见链接: https://download.csdn.net/download/qqqweiweiqq/89211553

2024年好用又便宜的云手机!哪款性价比高?

随着科技的飞速发展,云计算技术也在不断演进,而云手机作为其创新之一,已经开始在我们的生活中崭露头角。它通过将手机的硬件和软件功能移到云端,让用户能够借助强大的云计算资源完成各种任务。2024年,哪款云手机性价比…

Ubuntu关闭防火墙、关闭selinux、关闭swap

关闭防火墙 打开终端,然后输入如下命令,查看防火墙状态: sudo ufw status 开启防火墙命令如下: sudo ufw enable 关闭防火墙命令如下: sudo ufw disable 关闭selinux setenforce 0 && sed -i s/SELINUXe…

QML中使用正则表达式

我想在TextField控件中使用正则表达式,然后GPT4给出的回答是这样的: TextField {id: versionInputplaceholderText: qsTr("输入版本号")validator: RegExpValidator { regExp: /^[a-zA-Z0-9]*$/ } // 仅允许字母和数字width: 120 // 设置合…

SpringBoot中多数据源灵活切换解决方案

本篇内容介绍了“SpringBoot中如何使用Dynamic Datasource配置多数据源”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 源码地址/文档说明 功能特性: 支持 数据源分组…

软件设计师-重点的创建型设计模式

一、简单工厂: 简单工厂模式属于创建型模式,但不属于23种设计模式之一。 软考中图 二、工厂方法: 意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。 结…

YOLOV5 TensorRT部署 BatchedNMS(engine模型推理)(下)

主要是在王新宇代码的基础上改进,引入对BatchedNMS的解码 文章目录 1. 修改yolov5.cpp2.修改yololayer.h1. 修改yolov5.cpp 首先增加全局变量,名字根据转onnx时修改的节点名字来,查看onnx文件可以看到,顺序不要弄错。 const char *INPUT_NAME = “images”; const char …

FFmpeg常用结构体、关键函数、ffplay.c分析

一、常用结构体: 1、AVFormatContext结构体: AVFormatContext是一个贯穿全局的数据结构,很多函数都要用它作为参数。FFmpeg代码中对这个数据结构的注释是format I/O context,此结构包含了一个视频流的格式内容。其中存有AVIputFor…

抖音小店值得做吗?前期需要多少资金的投入?

大家好,我是电商糖果 这两天有位想做店的朋友,问了糖果一个问题。 他说开个体店是不是需要办理个体户营业执照。 我回答是的。 他又问办执照是不是需要花钱。 我说自己去工商局办理是免费的,找人代办市场上的价格一般在二百左右。 对方…

最大层内元素和

题目链接 最大层内元素和 题目描述 注意点 返回层内元素之和 最大 的那几层&#xff08;可能只有一层&#xff09;的层号&#xff0c;并返回其中 最小 的那个树中的节点数在 [1, 10000]范围内-10^5 < Node.val < 10^5 解答思路 广度优先遍历树&#xff0c;使用队列存…

应用内竞价(Bidding)技术为什么一定要结合瀑布流广告分层+混合智能排序技术?

应用内竞价&#xff08;In-App Bidding或Header Bidding&#xff09;即在APP端实现竞价的优势显而易见&#xff0c;接入的所有广告平台按价格实时排序&#xff0c;价高者得&#xff0c;这样使得每次广告请求收益都是最大值&#xff0c;从而实现收益最大化。 竞价机制是买卖双方…

改善员工绩效管理的 8 种最佳方法

企业如何改进绩效管理体系&#xff0c;才能获得最好的结果&#xff1f;请仔细阅读&#xff0c;找出答案… 人力资源部门对组织的成功起着至关重要的作用&#xff0c;组织的员工也是如此。更好的组织管理会带来更高的利润。人力资源部门的工作很大一部分就是规范绩效管理体系&a…

19-Echarts 配置系列之: timeline 动态切换

前言&#xff1a; timeline 动态切换 作用&#xff1a;在同一个图表上展示不同时间段的数据&#xff0c;并实现动态切换的效果。 简介原理&#xff1a;在 timeline 中定义显示节点并与相应的数据结构绑定&#xff0c;然后调用 ECharts 提供的方法&#xff0c;重新渲染图表。 …

基于51单片机的天然气检测报警设计

基于51单片机的天然气检测报警 &#xff08;仿真&#xff0b;程序原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.MQ-5检测煤气浓度&#xff1b; 2.浓度分为低、中、高三档&#xff0c;分别用LED灯绿、黄、红来提示&#xff1b; 3.当浓度到达中档…

SpringCloud简介

微服务架构理论 微服务架构概述 Spring Cloud简介Spring Cloud 技术栈SpringBoot和SpringCloud的关系SpringCloud和Dubbo区别对比相关文档 微服务架构概述 微服务是一种架构模式&#xff0c;将单一应用程序划分成一组小的服务&#xff0c;服务之间相互协调、相互配合&#xff0…

chrome浏览器安装elasticsearch的head可视化插件

head插件简介 elasticsearch-head被称为是弹性搜索集群的web前端&#xff0c;head插件主要是用来和elastic Cluster交互的Web前端 head插件历史 elasticsearch-head插件在0.x-2.x版本的时候是集成在elasticsearch内的&#xff0c;由elasticsearch的bin/elasticsearch-plugin…