当前位置: 首页 > news >正文

对Spring当中AOP的理解

        AOP(面向切面编程)全称Aspect Oriented Programminge

        AOP就是把系统中重复的代码抽取出来,单独开发,在系统需要时,使用动态代理技术,在不修改源码的基础上,将单独开发的功能通知织入(应用)到系统中的过程,完成完整的代码逻辑

        优点:减少重复代码、提高开发效率、提高维护性

AOP相关术语:

        1. Joinnoint(连接点):连接点是指那些被拦截到的点。这些点指的是方法,spring只支持方法类型的连接点。指切面在系统中要应用的位置,spring 中能够使用切面的位置为方法,所以连接指方法连接点指要调用某个方法时拦截到对这个方法的调用,做一些其他事情然后再执行目标方法拦截到的方法就是连接点。

        2. Pointcut(切入点):指我们要对那些Joinpoint进行拦截的定义,spring中使用切入点表达式定义(切入点表达式)简单理解,切入点是对连接点的描述,它将多个连接点进行概括的定义。

        3. Advice(通知):指拦截到joinpoint之后所要做的事情就是通知

         通知:前置通知、后置通知、异常通知、最终通知、环绕通知

        4. Target(目标对象):代理的目标对象

        5. Weaving(织入):将通知应用到切入点的过程

        6.Proxy(代理) :代理对象 

        7. Aspect(切面) :切入点和通知的总称

         简单说AOP是,在系统执行某个方法时,在执行这个方法前或方法后去执行另一段程序(另一段程序就是AOP中的通知),而拦截这个方法的定义可以称为切入点

        

SprinaAOP.的使用步骤(基于注解):
        1.引入spring依赖包和aop.植入依赖包 Aspect Weaver包或者spring-aspects包:

         2.创建切面类
        3.将切面类交个spring进行管理,使用@Component注解
        4.将切面类设置为一个切面,使用@Aspect注解
        5.编写切入点poincut,使用切入点表达式定义连接点(方法)。
        Execution(表达式)
        表达式写法:访问修饰符返回类型包名.包名.类名.方法名(参数列表)//指定那些方法做为切入点(拦截那些方法)

使用具体方法方式:@PointCut( execution(* com.xxx.service.UserService.addUser(..)))

了解更多Execution表达式Introduction to Pointcut Expressions in Spring | Baeldung

        6.编写相关通知

        7.切面源码

       

            在看切面源码前,我们需要提前把所需的环境先准备好,这里看一下我的结构:

        

这块我直接用service包下的UserService接口的addUser()和它的实现类UserServiceImpl来进行体现上述Advice(通知).

先看UserService接口

package com.xxx.service;public interface UserService {public String addUser(int id,String name);public void delUser();
}

UserServiceImpl

package com.xxx.service.impl;import com.xxx.service.UserService;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl implements UserService {@Overridepublic String addUser(int id,String name) {System.out.println("UserServiceImpl--------addUser");return "你好:"+name;}@Overridepublic void delUser() {System.out.println("UserServiceImpl--------delUser");}
}

下面我们来看最主要的aspects包下的UserAspects类,该类就是对上述addUser()方法进行前置通知、后置通知、异常通知、最终通知、环绕通知。

首先咱们先看前置通知:

在前置通知前首先我们执行一下程序,结果如下:

然后我们加上前置通知代码后,再看结果:

package com.xxx.aspects;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;@Aspect       //切面注解
@Component    //交给Spring进行控制翻转
@EnableAspectJAutoProxy  //开启spring的切面自动代理功能
public class UserAspects {@Pointcut("execution(* com.xxx.service.UserService.addUser(..))")public void pointCuts() {}/*前置通知*/@Before("pointCuts()")public void beforeAdvice(){System.out.println("前置被通知执行");}
}

 再加上前置通知后,结果如下:

下面我们来看后置通知,通过上述的前置通知,我们可以推断出后置通知应该就是addUser()执行后进行通知的,下面我们来看看是不是这样的。首先和之前一样,加上后置通知的代码:

package com.xxx.aspects;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;@Aspect       //切面注解
@Component    //交给Spring进行控制翻转
@EnableAspectJAutoProxy  //开启spring的切面自动代理功能
public class UserAspects {@Pointcut("execution(* com.xxx.service.UserService.addUser(..))")public void pointCuts() {}/*前置通知*/@Before("pointCuts()")public void beforeAdvice(){System.out.println("前置被通知执行");}/*后置通知*/@AfterReturning("pointCuts()")public void AfterAdvice(){System.out.println("后置被通知执行");}
}

加上后置通知后,运行结果如下:

下面我们来看异常通知,字面意思就是,在程序出现异常的时候就会出现该通知,下面我们就看相关的代码:

package com.xxx.aspects;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;@Aspect       //切面注解
@Component    //交给Spring进行控制翻转
@EnableAspectJAutoProxy  //开启spring的切面自动代理功能
public class UserAspects {@Pointcut("execution(* com.xxx.service.UserService.addUser(..))")public void pointCuts() {}/*前置通知*/@Before("pointCuts()")public void beforeAdvice(){System.out.println("前置被通知执行");}/*后置通知*/@AfterReturning("pointCuts()")public void AfterAdvice(){System.out.println("后置被通知执行");}/*异常通知*/@AfterThrowing("pointCuts()")public void throwAdvice(){System.out.println("异常通知执行");}
}

由于异常通知是在程序出现异常的时候才会执行该通知,那么咱们就给addUser()中来个异常

下面我们来看运行结果:

这儿需要注意的是异常通知和后置通知只能执行其中一个,通知的执行过程类似于下面这种:

下面的最终通知就不写了,它前面所述的其它通知类似,环绕通知就是一个可以做它们4个做的事情,下面直接把源码给出来看一下就行了:

        

package com.xxx.aspects;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;@Aspect       //切面注解
@Component    //交给Spring进行控制翻转
@EnableAspectJAutoProxy  //开启spring的切面自动代理功能
public class UserAspects {@Pointcut("execution(* com.xxx.service.UserService.addUser(..))")public void pointCuts() {}/*前置通知*/@Before("pointCuts()")public void beforeAdvice(){System.out.println("前置被通知执行");}/*后置通知*/@AfterReturning("pointCuts()")public void AfterAdvice(){System.out.println("后置被通知执行");}/*异常通知*/@AfterThrowing("pointCuts()")public void throwAdvice(){System.out.println("异常通知执行");}/*最终通知*/@After("pointCuts()")public void finallyAdvice(){System.out.println("最终通知执行");}/*环绕通知就是可以把上面四个通知都可以实现* */@Around("pointCuts()")public String aroundAdvice(ProceedingJoinPoint proceedingJoinPoint){try {System.out.println("环绕通知----前置被通知执行");String proceeds = (String) proceedingJoinPoint.proceed();return proceeds;} catch (Throwable e) {e.printStackTrace();}return null;}}

相关文章:

对Spring当中AOP的理解

AOP(面向切面编程)全称Aspect Oriented Programminge AOP就是把系统中重复的代码抽取出来,单独开发,在系统需要时,使用动态代理技术,在不修改源码的基础上,将单独开发的功能通知织入(应用)到系统中的过程,完…...

【Vue】2-8、Axios 网络请求

cdn&#xff1a;<script src"https://unpkg.com/axios/dist/axios.min.js"></script> 注&#xff1a;使用 CDN 链接就可以不需要去下载对应的 js 文件到本地&#xff0c;只需要联网即可使用&#xff0c;可以减少项目的体积 <!DOCTYPE html> <…...

Vue中嵌入原生HTML页面

Vue中嵌入html页面并相互通信 需求&#xff1a;b2b支付需要从后获取到数据放到form表单提交跳转&#xff0c;如下&#xff1a; 但是vue目前暂时没找到有类似功能相关文档&#xff0c;所以我采用iframe嵌套的方式 1. Vue中嵌入Html <iframe src"/static/gateway.htm…...

streampark+flink一键整库或多表同步mysql到doris实战

streamparkflink一键整库或多表同步mysql到doris实战&#xff0c;此应用一旦推广起来&#xff0c;那么数据实时异构时&#xff0c;不仅可以减少对数据库的查询压力&#xff0c;还可以减少数据同步时的至少50%的成本&#xff0c;还可以减少30%的存储成本&#xff1b; streampar…...

Vim实战:使用 Vim实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…...

学习MySQL ENUM数据类型

学习MySQL ENUM数据类型 ENUM是MySQL中的一个字符串对象&#xff0c;它允许从预定义的值列表中选择一个值。这种数据类型特别适用于值的数量有限且不太可能变化的情况。 定义ENUM类型 在定义ENUM类型时&#xff0c;你需要明确列出所有可能的字符串值。例如&#xff1a; CRE…...

88.合并两个有序数组

88.合并两个有序数组 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 **注意&#xff1a;**最…...

python查询xml类别

第一章 导包 import os from xml.etree.ElementTree import ElementTree第二章 存储类别 # 定义一个空集合用于存储类别 classes set()第三章 遍历所有XML文件 # 遍历指定目录下的所有XML文件 for filename in os.listdir(/home/li/PycharmProjects/Annotations):if filena…...

nginx配置及性能优化

1. 请简述nginx的工作原理&#xff1f; Nginx的工作原理基于事件驱动模型和异步非阻塞I/O处理机制。 具体来说&#xff0c;Nginx接收到客户端的请求后&#xff0c;会将该请求映射到配置文件中指定的location block。这个过程中&#xff0c;Nginx本身并不执行实际的工作&#…...

阿里云如何找回域名,进行添加或删除?

权威域名管理介绍说明&#xff0c;包含添加域名、删除域名、找回域名、域名分组等操作介绍。 一、添加域名 非阿里云注册域名或子域名如需使用云解析DNS&#xff0c;需要通过添加域名功能&#xff0c;将主域名或子域名添加到云解析控制台&#xff0c;才可以启用域名解析服务。…...

机器学习 低代码 ML:PyCaret 的使用

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…...

前端入门第二天

目录 一、列表、表格、表单 二、列表&#xff08;布局内容排列整齐的区域&#xff09; 1.无序列表&#xff08;不规定顺序&#xff09; 2.有序列表&#xff08;规定顺序&#xff09; 3.定义列表&#xff08;一个标题多个分类&#xff09; 三、表格 1.表格结构标签 2.合并…...

Django实现富文本编辑器Ckeditor5图片上传功能

上一章我们已经为我们的博客继承了富文本编辑器Ckeditor5,虽然已经可以对文字进行排版处理,虽然已经可以通过插入图片的url地址来插入图片,但还无法通过本地上传图片,那么我们这个富文本编辑器就是不完整的,这一章我们将实现上传图片功能! ​ Ckeditor5图片上传采用的是…...

【C语言】epoll_wait / select

一、epoll_wait和select对比 1. 阻塞和非阻塞 在Linux C语言中进行socket编程时&#xff0c;epoll_wait 和 select 都是用于多路I/O复用的系统调用&#xff0c;但是它们的行为可以设置为阻塞和非阻塞模式&#xff0c;这取决于调用它们时所使用的参数。 让我们分别看看 epoll…...

Java 数据抓取

大家好我是苏麟 , 今天聊聊数据抓取 . 大家合理使用 注意&#xff0c;爬虫技术不能滥用&#xff0c;干万不要给别人的系统造成压力、不要侵犯他人权益! 数据抓取 实质上就是java程序模拟浏览器进行目标网站的访问&#xff0c;无论是请求目标服务器的接口还是请求目标网页内容…...

深度学习之处理多维特征的输入

我们首先来看一个糖尿病的数据集&#xff1a; 在数据集中&#xff0c;我们称每一行叫做sample&#xff0c;表示一个样本&#xff0c;称每一列是feature&#xff0c;也就是特征在数据库里面这就是一个关系表&#xff0c;每一行叫做记录&#xff0c;每一列叫做字段。 每一个样本都…...

西瓜书读书笔记整理(十二) —— 第十二章 计算学习理论(下)

第十二章 计算学习理论&#xff08;下&#xff09; 12.4 VC 维&#xff08;Vapnik-Chervonenkis dimension&#xff09;12.4.1 什么是 VC 维12.4.2 增长函数&#xff08;growth function&#xff09;、对分&#xff08;dichotomy&#xff09;和打散&#xff08;shattering&…...

初探分布式链路追踪

本篇文章&#xff0c;主要介绍应用如何正确使用日志系统&#xff0c;帮助用户从依赖、输出、清理、问题排查、报警等各方面全面掌握。 可观测性 可观察性不单是一套理论框架&#xff0c;而且并不强制具体的技术规格。其核心在于鼓励团队内化可观察性的理念&#xff0c;并确保由…...

闭包的理解?闭包使用场景

说说你对闭包的理解&#xff1f;闭包使用场景 #一、是什么 一个函数和对其周围状态&#xff08;lexical environment&#xff0c;词法环境&#xff09;的引用捆绑在一起&#xff08;或者说函数被引用包围&#xff09;&#xff0c;这样的组合就是闭包&#xff08;closure&#…...

openssl3.2 - 帮助文档的整理

文章目录 openssl3.2 - 帮助文档的整理概述笔记整理后, 非空的文件夹如下整理后, 留下的有点用的文件列表如下备注END openssl3.2 - 帮助文档的整理 概述 openssl3.2源码工程编译安装完, 对于库的使用者, 有用的文档, 远不止安装的那些html. 用everything查找, 配合手工删除,…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...