Spring6 AOP 面向切面编程

1. 概念

  • 面向切面编程:一种编程思想。
  • proxy动态代理(实现了这种思想):在原方法执行时,给原方法的前面或着后面增加其他的方法。增加的方法并不会写在原方法中
    1. 原方法就是目标方法,
    2. 增加的方法就是代理方法
  • 面向切面的好处:
    1. 不必修改原来的代码
    2. 方法中只负责业务的逻辑,像验证、日志、事务管理都可以使用切面解决
  • 面向切面的7个名词:
    1. 连接点:指的是位置,也就是原方法的前面和后面
    2. 切点:在连接点使用的代理方法
    3. 通知:①目标方法之前:前置通知,②目标方法之后:后置通知,③前后都有:环绕通知,④目标方法异常时执行:异常通知,⑤finall里面:最终通知
    4. 切面:
    5. 织入:描述过程。
    6. 目标对象
    7. 代理对象

2. 全注解开发

1. 文件结构

在这里插入图片描述

依赖

    <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.1.14</version></dependency><!-- spring AOP使用的是aspects框架, aspects框架是专业的做切面的框架--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>6.1.14</version></dependency>

2. 目标对象

import org.springframework.stereotype.Component;
// 目标对象
@Component
public class TargetObject {public void targetMethod(){System.out.println("目标对象执行:................");}
}

3. 切面类


@Component
@Aspect // 切面对象
@Order(1) // 目标对象有多个切面对象时,使用Order注解,优先级越小越先执行
public class FirstAopClass {// 切点表达式@Pointcut("execution(* com.example.service.TargetObject.*(..))")public void pointCut() {}// 前置通知@Before("pointCut()")public void before(JoinPoint joinPoint) {// 除环绕通知外,其他通知都有JoinPoint,从参数中可以获得,类名、方法名、参数等System.out.println("前置通知:1");// 目标对象的类名String targetClassName = joinPoint.getSignature().getDeclaringTypeName();// 目标方法的方法名String targetMethodName = joinPoint.getSignature().getName();// 目标方法的参数Object[] args = joinPoint.getArgs();
//    System.out.println("目标对象的类名:" + targetClassName);
//    System.out.println("目标方法的方法名:" + targetMethodName);
//    System.out.println("目标方法的参数:" + Arrays.toString(args));}// 后置通知@AfterReturning("pointCut()")public void afterReturning() {System.out.println("后置通知:1");}// 环绕通知@Around("pointCut()")public void around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("环绕前置通知:1");pjp.proceed(); // 执行目标方法,因为目标方法没有参数,所以不用传参,也没有返回值所以不用returnSystem.out.println("环绕后置通知:1");}// 异常通知:目标方法产生异常才执行此通知@AfterThrowing("pointCut()")public void afterThrowing() {System.out.println("异常通知:1");}// 最终通知:无论目标方法有没有异常都会执行@After("pointCut()")public void after() {System.out.println("最终通知:1");}
}

4. 配置类


import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
/** @EnableAspectJAutoProxy(proxyTargetClass = true)* 1. 动态代理,proxyTargetClass=true 使用 Cglib 动态代理* 2. proxyTargetClass不写,默认使用 JDK 动态代理需要有接口* */
@Configuration  // 声明这是个用于配置的类(IOC、AOP 都需要使用这个注解指定注解类)
@ComponentScan({"com.example.service"})  // IOC配置: 指定要扫描的包.ioc
@EnableAspectJAutoProxy(proxyTargetClass = true)  // AOP配置,感觉true和false没有区别
public class SpringConfig {}

5. 测试方法

  @Testpublic void test() {// 1. 创建IOC容器ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);// 2. 从IOC容器中获取BeanTargetObject targetObject = ctx.getBean("targetObject", TargetObject.class);// 3. 执行目标对象中的目标方法,切面方法会自动执行targetObject.targetMethod();}

6. 执行顺序

环绕前置通知:1
前置通知:1
目标对象执行:................
后置通知:1
最终通知:1
环绕后置通知:1

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

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

相关文章

计算机组成与原理(2) basic of computer architecture

Instruction Set Architecture (ISA) 和 Hardware System Architecture (HSA) 是计算机体系结构中两个重要的层次&#xff0c;它们各自的职责和作用如下&#xff1a; Instruction Set Architecture (ISA) 定义 ISA是指令集体系结构&#xff0c;是硬件和软件之间的接口。它定义…

window的wsl(Ubuntu)安装kafka步骤

环境&#xff1a;Win11 WSL(Linux子系统Ubuntu) apache-zookeeper-3.9.3-bin kafka_2.12-3.8.1 思路&#xff1a;apache上分别下载zookeeper和kafka&#xff0c;在wsl环境安装。在kafka上创建消息的topic&#xff0c;发送消息&#xff0c;接受消息&#xff0c;验证是否安…

数据结构树和二叉树知识点和递归序列

二叉树知识点 一.树的概念1.1关于树的名词解释 二.二叉树的概念1. 二叉树性质&#xff1a; 三.满二叉树与完全二叉树递归前序遍历递归中序遍历递归后续遍历 一.树的概念 树是一种非线性数据结构&#xff0c;它是由n个或大于n个的结点来组成具有层次关系的一个集合&#xff08;…

速通前端篇 —— CSS

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;速通前端 目录 CSS的介绍 基本语法规范 CSS选择器 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 CSS常见样式 颜…

使用 Elastic 3 步实现基于 OTel 的原生 K8s 和应用可观测性

作者&#xff1a;来自 Elastic Bahubali Shetti Elastic 的 OpenTelemetry 发行版现已支持 OTel Operator&#xff0c;可使用 EDOT SDK 自动检测应用程序&#xff0c;并管理 EDOT OTel Collector 的部署和生命周期以实现 Kubernetes 可观察性。了解如何通过 3 个简单步骤进行配…

stack、queue、priority_queue、deque的使用和模拟实现

目录 1.容器适配器 2.stack stack的常用接口及使用示例 stack的模拟实现 3.queue queue的常用接口及使用示例 queue的模拟实现 4.priority_queue priority_queue的常用接口及使用示例 priority_queue的模拟实现 5.deque 认识deque deque底层的数据结构 deque和ve…

Linux的cuDNN(cudnn)安装教程(CUDA(cuda\cuda toolkit))

CUDA(cuda\cuda toolkit&#xff09;安装教程 https://blog.csdn.net/huiyayaya/article/details/143863835?spm1001.2014.3001.5502官网下载cudnn https://developer.nvidia.com/rdp/cudnn-archive这个下载到自己的电脑 下载到本地就好 复制到服务器 切换到cudnn文件所在目…

Kafka中ACKS LSO LEO LW HW AR ISR OSR解析

名称解释 ACKS&#xff08;Acknowledgments&#xff09;确认、回执 LW&#xff08;Low watermark&#xff09;低水位、LSO&#xff08;Log start offset&#xff09;起始偏移量 HW&#xff08;High watermark&#xff09;高水位 LEO&#xff08;Log end offset&#xff09;…

C++设计模式行为模式———迭代器模式

文章目录 一、引言二、迭代器模式三、总结 一、引言 迭代器模式是一种行为设计模式&#xff0c; 让你能在不暴露集合底层表现形式 &#xff08;列表、 栈和树等&#xff09; 的情况下遍历集合中所有的元素。C标准库中内置了很多容器并提供了合适的迭代器&#xff0c;尽管我们不…

智能体Agent调研

单个智能体建模与优化现状 人类长期以来追求类似于或超越人类水平的人工智能 (AI)&#xff0c;而 基于AI的代理&#xff08;Agent&#xff09;被认为是一个有前途的研究方向。传统计算机领域的Agent有多种&#xff0c;如自动化脚本、网络爬虫、推荐系统、软件机器人能够独立自…

SAP PI/PO Proxy2JDBC SQL_QUERY动态接口示例

目录 背景&#xff1a; 完整demo步骤&#xff1a; IR: ID: SPROXY: 测试代码&#xff1a; 注意点&#xff1a; 背景&#xff1a; 中途临时帮客户项目做其他功能&#xff0c;项目上有部分开发项需要通过PO去第三方数据库取数&#xff0c;项目上的开发对PO不太熟&#xf…

【汇编语言】数据处理的两个基本问题(三) —— 汇编语言的艺术:从div,dd,dup到结构化数据的访问

文章目录 前言1. div指令1.1 使用div时的注意事项1.2 使用格式1.3 多种内存单元表示方法进行举例1.4 问题一1.5 问题一的分析与求解1.5.1 分析1.5.2 程序实现 1.6 问题二1.7 问题二的分析与求解1.7.1 分析1.7.2 程序实现 2. 伪指令 dd2.1 什么是dd&#xff1f;2.2 问题三2.3 问…

模型的评估指标——IoU、混淆矩阵、Precision、Recall、P-R曲线、F1-score、mAP、AP、AUC-ROC

文章目录 预测框的预测指标——IoU&#xff08;交并比&#xff09;分类预测指标混淆矩阵&#xff08;Confusion Matrix&#xff0c;TP、FP、FN、TN)Precision&#xff08;精度&#xff09;Recall&#xff08;召回率&#xff09;P-R曲线F1-scoreTPR、TNR、FPR、FNRROC曲线下面积…

轻量云服务器:入门级云计算的最佳选择

在云计算领域&#xff0c;轻量云服务器逐渐成为小型企业、个人开发者和初创公司关注的热点。它凭借高性价比、简单易用和稳定性能&#xff0c;正在改变传统的服务器部署方式。本文将详细解析轻量云服务器的定义、优势、适用场景及如何选择最佳方案&#xff0c;帮助您全面了解这…

【初阶数据结构篇】归并排序、计数排序

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

移远通信5G RedCap模组RG255C-CN通过中国电信5G Inside终端生态认证

近日&#xff0c;移远通信5G RedCap模组RG255C-CN荣获中国电信颁发的5G Inside终端生态认证证书。这表明&#xff0c;该产品在5G基本性能、网络兼容性、安全特性等方面已经过严格评测且表现优异&#xff0c;将进一步加速推动5G行业终端规模化应用。 中国电信5G Inside终端生态认…

Towards Reasoning in Large Language Models: A Survey

文章目录 题目摘要引言什么是推理?走向大型语言模型中的推理测量大型语言模型中的推理发现与启示反思、讨论和未来方向 为什么要推理?结论题目 大型语言模型中的推理:一项调查 论文地址:https://arxiv.org/abs/2212.10403 项目地址: https://github.com/jeffhj/LM-reason…

Android Studio | 修改镜像地址为阿里云镜像地址,启动App

在项目文件的目录下的 settings.gradle.kts 中修改配置&#xff0c;配置中包含插件和依赖项 pluginManagement {repositories {maven { urluri ("https://www.jitpack.io")}maven { urluri ("https://maven.aliyun.com/repository/releases")}maven { urlu…

Python | Leetcode Python题解之第564题数组嵌套

题目&#xff1a; 题解&#xff1a; class Solution:def arrayNesting(self, nums: List[int]) -> int:ans, n 0, len(nums)for i in range(n):cnt 0while nums[i] < n:num nums[i]nums[i] ni numcnt 1ans max(ans, cnt)return ans

2024-11-17 -MATLAB三维绘图简单实例

1. x -1:0.05:1; y x; [X, Y] meshgrid(x, y); f (X, Y) (sin(pi * X) .* sin(pi * Y)) .^ 2.*sin(2.*X2.*Y); mesh(X, Y, f(X, Y)); % 调用函数f并传递X和Y xlabel(X-axis); ylabel(Y-axis); zlabel(Z-axis); title(Surface Plot of (sin(pi * X) .* sin(pi * Y)) .^ 2.*…