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.hqwc.cn/news/650742.html

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

相关文章

运行django

确保app被注册 urls.py中编写url 视图对应关系 命令行启动 python manage.py runserver

NIO之ByteBuffer

NIO中的ByteBuffer是缓冲区,其中有几个比较重要的属性capacity,position和limit。 capacity: 其中,capacity是缓冲区的容量大小,在分配内存空间后不会改变。 limit: limit是限制位置,在读写模…

VOS3000加装登陆服务器安全防护系统有用吗

VOS3000是一款专业的软交换系统,它主要用于中小规模的VoIP运营业务,包括运营费率设定、套餐管理,账户管理、业终端管理、网关管理、数据查询、卡类管理、号码管理、系统管理等功能1。而关于加装登陆服务器安全防护系统是否有用,这…

synchronized 之谜

序言 本文给大家介绍一下 synchronized 关键字的部分原理。 一、内存中的 Java 对象 class A {private String attr; }先引入一个问题:上面类 A 有一个属性 attr。当类 A 实例化之后的对象在内存中是如何表示的呢? 在内存中,Java 对象由三…

php动态高亮web源代码

php动态高亮web源代码 注:配置好不允许高亮的文件名,安全第一 #php实现动态展示目录树结构源代码 适用于开放源代码,结合html缓存使用效果更佳,因循环较多不适合放首页 能力有限没实现行号 效果截图 代码 4个文件放统一目录…

大数据分析与应用实验(黑龙江大学)

实验一 Hadoop伪分布式实验环境搭建与WordCount程序 一、实验目的 1、学习搭建Hadoop伪分布式实验环境 2、在伪分布式实验环境下运行WordCount程序 二、实验内容 1、搭建Hadoop伪分布式实验环境,并安装Eclipse。 2、在Eclipse环境下,编写并执行Wor…

怎样选购内衣洗衣机?2024年5款最新推荐机型种草

随着科技的不断发展,内衣洗衣机成为了家家户户必备的小家电之一,为我们的生活带来了极大的便利。但面对市场上众多的内衣洗衣机品牌,如何选择一款质量好的内衣洗衣机呢?本文将为您推荐5款最新的内衣洗衣机品牌,从而帮助…

【C++】C++中的构造函数和析构函数详解

欢迎来到CILMY23的博客 本篇主题为:C中的构造函数和析构函数详解 个人主页:CILMY23-CSDN博客 系列专栏:Python | C | C语言 | 数据结构与算法 感谢观看,支持的可以给个一键三连,点赞关注收藏。 写在前头&#xff1…

GaN HEMT中短沟道效应的建模

来源:Modeling of Short-Channel Effects in GaN HEMTs(TED 20年) 摘要 在本文中,我们提出了一种用于估算GaN高电子迁移率晶体管(HEMT)器件中短沟道效应(SCEs)的显式和解析的基于电…

手搓单链表(无哨兵位)(C语言)

目录 SLT.h SLT.c SLTtest.c 测试示例 单链表优劣分析 SLT.h #pragma once#include <stdio.h> #include <assert.h> #include <stdlib.h>typedef int SLTDataType;typedef struct SListNode {SLTDataType data;struct SListNode* next; }SLTNode;//打印…

vue2项目升级到vue3经历分享1

依据vue官方文档&#xff0c;vue2在2023年12月31日终止维护。因此决定将原来的岁月云记账升级到vue3&#xff0c;预计工作量有点大&#xff0c;于是想着把过程记录下来。 原系统使用的技术栈 "dependencies": {"axios": "^0.21.1","babel-…

springboot+vue新疆肉牛智慧牧场养殖系统

系统涉及的对象是奶牛。 系统使用员工有管理员和普通员工。 管理员有修改的权限&#xff0c;普通员工没有。 系统需要包含奶牛的编号&#xff0c;种类&#xff0c;体重&#xff0c;健康情况、生长情况、牛奶产量&#xff0c;以及上次更新数据时间等信息&#xff0c;管理员可以对…