SpringBoot中对Spring AOP的实现

news2024/9/21 19:34:59

文章目录

  • SpringBoot中对Spring AOP的实现
    • AOP简介
    • 引入依赖
    • AOP体系与概念
    • 编写AOP切面类
    • 启动SpringBoot项目然后访问controller控制器
    • 对环绕通知放行
    • execution表达式的含义
    • 通过注解方式定义切点

SpringBoot中对Spring AOP的实现

AOP简介

AOP (Aspect Oriented Programming), 面向切面编程,是Spring的三大核心思想之一,Spring的三大核心思想是:

  • IOC 控制反转,也就是IOC容器,我们可以在容器中事先创建对象,后面用到对象的时候就不用再new了,可以直接从IOC容器里面取出来。
  • DI 依赖注入,就是说Spring的对象是在配置文件里面配置的,可以在配置文件里面把一个对象注入给另外一个对象。
  • AOP 面向切面编程,可以大大的解耦,把一些无关业务逻辑的代码单独的抽取出来

引入依赖

在原先的SpringBoot项目里面多加上一个spring-boot-starter-aop依赖,如下图:
在这里插入图片描述

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

我们没有必要使用原始的Spring框架中的aop,因为需要配置各种配置文件,太繁琐了。好的是,SpringBoot中已经继承了SpringAOP,因此我们直接在SpringBoot中引入对应的依赖就可以了。

AOP体系与概念

简单地去理解,其实AOP要做三类事:

  • 在哪里切入,也就是权限校验等非业务操作在哪些业务代码中执行。
  • 在什么时候切入,是业务代码执行前还是执行后。
  • 切入后做什么事,比如做权限校验、日志记录等。

AOP的体系图:
在这里插入图片描述
一些概念如下图:
在这里插入图片描述

编写AOP切面类

如下图:
在这里插入图片描述
代码如下:

package com.xzy.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * @author xuan
 * @create 2023/10/25
 */
@Component
@Aspect
public class ControllerAspect {

    @Pointcut("execution(* com.xzy.controller.*.*(..))")
    public void pointCut() {

    }

    @After("pointCut()")
    public void doAfter() {
        System.out.println("------------- doAfter.");
    }

    @Before("pointCut()")
    public void doBefore() {
        System.out.println("------------- doBefore.");
    }

    @Around("pointCut()")
    public Object doAround(ProceedingJoinPoint joinPoint) {
        System.out.println("------------- doAround.执行方法之前的处理");
        Object obj = null;
        try {
            obj = joinPoint.proceed();
            System.out.println("------------- doAround.执行方法之后的处理");
        } catch (Throwable t) {
            t.printStackTrace();
        }
        return obj;
    }
}

启动SpringBoot项目然后访问controller控制器

在这里插入图片描述
最后看一下控制台的输出,如下图:
在这里插入图片描述
可以切面的执行顺序是:先执行环绕通知的前置通知,再执行前置通知,接着执行后置通知,最后执行环绕通知的后置通知。

对环绕通知放行

注意一点,在环绕通知中必须要对方法放行,否则程序会卡在环绕通知的地方,如下图:
在这里插入图片描述

execution表达式的含义

在这里插入图片描述

  • 第一个 * : 表示的是返回类型, * 表示的是所有返回类型都可以;
  • 包名com.xzy.controller表示的是需要拦截的包名就是com.xzy.controller包下的类;
  • 第二个 * : 表示的是com.xzy.controller包下的类, * 表示的是所有类都可以;
  • 最后一个 * : 表示的是这个类下面的方法, * 表示的是所有方法都可以;
  • 小括号里的 点点 : 表示的是方法的参数, 点点表示的是任意参数都可以;

通过注解方式定义切点

如下图:
在这里插入图片描述
使用上面的切面的话,就会切入注解是@GetMapping的所有方法。这种方式很适合处理@GetMapping,@PostMapping,@DeleteMapping不同注解有各种特定处理逻辑的场景。

使用注解切面除了使用的是@annotation定义切入点,其它的和上面的切面没啥差别;

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

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

相关文章

模拟线程死锁现象:两个线程同时抢两个互斥锁

下面业务逻辑的分析 1.如果 flag 为 T&#xff0c;线程 A 就会先得到 / 持有 o1 对象锁&#xff0c;然后尝试去获取 o2 对象锁 2.如果线程 A 得不到 o2 对象锁&#xff0c;就会 Blocked 3.如果 flag 为 F &#xff0c;线程 B 就会先得到 / 持有 o2 对象锁&#xff0c;然后尝试去…

【python】numpy常用属性

文章目录 np.rangenp.quantilenp.digitizenp.randomrandseedpermutation np.uniquenp.zerosnp.sumnp.logtransposebool判断 首先导入numpy import numpy as npnp.range np.range(start, end, step): 获取指定区间和步长的列表。 np.arange(0, 1, 0.1) # 区间: [0, 1), 步长…

大疆 dji mini4pro 不同充电器头 充电速度

协议 dp100w 头线 充电功率33.2w 指示灯快闪 一加手机官方充电头线&#xff08;协议&#xff1a;wrap65w闪充&#xff09; 12.1w 指示灯慢闪 官方 DJI Mini 4 Pro - 技术参数 - DJI 大疆创新 总结 买pd快充协议的头线即可。

(三)库存超卖案例实战——使用redis分布式锁解决“超卖”问题

前言 在上一节内容中我们介绍了如何使用mysql数据库的传统锁&#xff08;行锁、乐观锁、悲观锁&#xff09;来解决并发访问导致的“超卖问题”。虽然mysql的传统锁能够很好的解决并发访问的问题&#xff0c;但是从性能上来讲&#xff0c;mysql的表现似乎并不那么优秀&#xff…

ATA-8061射频功率放大器在心室导管式扩压电式测力传感器中的应用

心室导管式扩压电式测力传感器是一种广泛应用于心血管领域的关键设备&#xff0c;用于测量心脏内部的压力变化。本文将主要介绍关于压电式测力传感器的相关知识概念&#xff0c;以及功率放大器在心室导管式扩压电式测力传感器研究中的重要应用。我们通过对传感器原理和功率放大…

使用 JDAudioCrawler 将下载的音频存储到本地存储

前言 在当今数字化时代&#xff0c;音频数据的获取和处理变得越来越重要。本文将访问网易云音乐为案例&#xff0c;介绍如何使用JDAudioCrawler这个强大的工具&#xff0c;将音频数据存储下载到本地存储中。将详细介绍实现的流程和代码细节。 什么是 JDAudioCrawler DAudioC…

2023运营级别网赚网盘平台搭建(源码+教程)

023运营级别网赚网盘平台搭建&#xff08;源码教程&#xff09; 为什么要自己搭建网盘&#xff0c;现在许多大厂的网盘&#xff0c;文件都添加了许多限制&#xff0c;有好多文件会遭到和谐&#xff0c;而且大部分网盘也都会限速&#xff0c;不开通VIP是很难用的&#xff01;这…

【Docker】Docker Compose服务依赖与健康检查

docker compose环境变量 为增加安全性&#xff0c;在前面的python例子中增加redis的密码校验&#xff0c;密码从环境变量中获取&#xff1a; from flask import Flask from redis import StrictRedis import os import socketapp Flask(__name__) redis StrictRedis(hostos…

企业在数字化转型时如何通过SD-WAN保证业务连续性

企业数字化建设离不开高品质的网络&#xff0c;随着信息化系统和应用的部署&#xff0c;传统网络线路逐渐暴露出不同的问题&#xff0c;包括&#xff1a; 线路资源利用率低易造成浪费 关键业务流量被抢占&#xff0c;缺乏保障 网络不可视&#xff0c;无法实时查看线路情况 故…

利用已存在的conda环境

一、已存在的环境 二、在Pycharm中使用这些环境

Linux 基于sysfs的GPIO读写操作

https://bbs.huaweicloud.com/blogs/297252 前言 最近接触到Linux系统中的GPIO开发&#xff0c;这里做个小总结&#xff0c;也分享一下&#xff1b;本文会介绍GPIO的读写&#xff0c;介绍基本原理&#xff0c;以及不同读写方式的性能。 一、GPIO sysfs interface 基本原理 …

Android 备案公钥、签名 MD5获取方法

公钥和 MD5 值可以通过安卓开发工具、Keytool、Jadx-GUI 等多种工具获取&#xff0c;本文以 jadx-gui 为例。 1 windows 下载 jadx-gui 工具 下载 jadx-gui 工具 在这里选择一个下载 下载后 解压文件 双击运行程序&#xff0c;然后选择 release apk安装包 2 Mac 打开终端&a…

基于springboot实现企业客户信息反馈平台管理系统项目【项目源码+论文说明】

基于springboot实现企业客户信息反馈平台管理系统演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把企业客户信息反馈管理与现在网络相结合&#xff0c;利用java技术建设企业客户信息反馈平台&#xff0c;实现企业客户信息反馈的信息化。则对于进一步提高企业客户信息反…

1024程序员节优惠来啦 | 芒果YOLO专栏《全年首次优惠全场8.8折活动来啦》,一年一次,优惠券数量有限,先到先得!

芒果YOLO改进专栏 订阅即可享受 优惠券直接减免&#xff0c;芒果专栏全场优惠&#xff01;&#xff01; 1024程序员 全年优惠活动 来啦&#xff01;&#xff01;&#xff01;&#xff01; 芒果专栏全场优惠8.8折&#xff01;&#xff01; 文章目录 活动时间&#x1f525;&…

全面解析优化企业Microsoft 365网络的加速方案

您的员工是否有因为Microsoft 365频繁掉线、卡顿、无法登录而向IT部门抱怨过&#xff1f; 很多时候企业会以为是自身网络带宽不足才导致访问失败&#xff0c;但是在采取增加带宽的方案后&#xff0c;办公文档协同打开仍旧很慢&#xff0c;文件分享依旧需要等待较长的时间&…

【漏洞复现】蓝凌EIS智慧协同平台任意文件上传

目录 蓝凌智慧协同平台介绍 漏洞搜索 漏洞点 漏洞复现 nuclei poc 验证 漏洞修复 蓝凌智慧协同平台介绍 蓝凌智慧协同平台是个自动化办公OA&#xff0c;具有多端同步、无缝协作,提供移动端&#xff08;蓝凌KK、阿里钉钉、微信企业号&#xff09;、桌面端、网页端多端应…

『第四章』一见倾心:初识小雨燕(上)

在本篇博文中,您将学到如下内容: 1. 基本数据类型2. 基本操作符3. 枚举和结构4. 类和 Actor5. 属性、方法与访问控制6. 聚集总结夜月一帘幽梦,春风十里柔情。 无声交谈情意深,一见心曲绕梁成。 1. 基本数据类型 无论是 macOS 还是 iOS 上的开发,Swift 基础类型和功能都内置于…

淘宝API接口(商品信息获取,订单管理,库存管理,数据分析和优化)

淘宝API接口可以用于许多业务场景&#xff0c;以下是一些常见的应用场景&#xff1a; 商品信息获取&#xff1a;通过淘宝API接口可以获取商品的详细信息&#xff0c;包括商品标题、价格、库存、销量、评价等数据。这些信息可以用于在自己的网站或应用程序中展示商品&#xff0…

17 结构型模式-享元模式

1 享元模式介绍 2 享元模式原理 3 享元模式实现 抽象享元类可以是一个接口也可以是一个抽象类,作为所有享元类的公共父类, 主要作用是提高系统的可扩展性. //* 抽象享元类 public abstract class Flyweight {public abstract void operation(String extrinsicState); }具体享…

在外包干了2年,我悟了...

前言 简单的说下&#xff0c;我大学的一个同学&#xff0c;毕业后我自己去了自研的公司&#xff0c;他去了外包&#xff0c;快两年了我薪资、技术各个方面都有了很大的提升&#xff0c;他在外包干的这两年人都要废了&#xff0c;技术没一点提升&#xff0c;学不到任何东西&…