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;是硬件和软件之间的接口。它定义…

优化需求类 Markdown 文件以提高 RAG 系统查询准确度

标题&#xff1a;优化需求类 Markdown 文件以提高 RAG 系统查询准确度 目录 概述示例 Markdown 文件处理步骤处理步骤代码详解 合并标题与内容丰富标题语义清洗文本生成摘要语义文本切分 综合处理向量化与存储检索示例总结 概述 处理需求类的 Markdown 文件时&#xff0c;由于…

leetcode 找不同

389. 找不同 已解答 简单 相关标签 相关企业 给定两个字符串 s 和 t &#xff0c;它们只包含小写字母。 字符串 t 由字符串 s 随机重排&#xff0c;然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。 示例 1&#xff1a; 输入&#xff1a;s "abcd"…

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;验证是否安…

JavaScript 原型

JavaScript 的原型&#xff08;Prototype&#xff09;是其面向对象编程模型的核心概念之一&#xff0c;它决定了对象如何继承属性和方法。通过理解 JavaScript 的原型&#xff0c;你可以更好地理解对象之间的关系以及如何扩展对象功能。 核心概念 [[Prototype]]&#xff08;内部…

React中组件通信的几种方式

在构建复杂的React应用时&#xff0c;组件之间的通信是至关重要的。从简单的父子组件通信到跨组件状态同步&#xff0c;不同组件之间的通信方式多种多样。 1. 父子组件通信 父子组件通信是 React 中最基本的通信方式之一。在这种模式下&#xff0c;数据是从父组件通过 props …

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

二叉树知识点 一.树的概念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 个简单步骤进行配…

计算机视觉:赋予机器“看”的能力

引言 计算机视觉是一门科学&#xff0c;它试图使计算机能够像人类一样解释和理解视觉信息。这个领域结合了人工智能、机器学习、计算机科学和认知心理学等多个学科的知识&#xff0c;旨在创建能够“看”和“理解”图像和视频的系统。随着技术的进步&#xff0c;计算机视觉已经…

javaScript交互案例2

1、京东侧边导航条 需求&#xff1a; 原先侧边栏是绝对定位当页面滚动到一定位置&#xff0c;侧边栏改为固定定位页面继续滚动&#xff0c;会让返回顶部显示出来 思路&#xff1a; 需要用到页面滚动事件scroll&#xff0c;因为是页面滚动&#xff0c;所以事件源是document滚动…

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文件所在目…

Web3游戏先锋 Big Time Studios 重磅推出 $OL 通证,赋能 Open Loot 游戏平台

作为 Web3 游戏领域的领军者&#xff0c;Big Time Studios 不仅创造了热门游戏《Big Time》&#xff0c;还开发了 Open Loot 平台&#xff0c;至今交易量已超过 5 亿美元。如今&#xff0c;Open Loot 平台的活跃用户可以获得 $OL 代币&#xff0c;这是该平台推出的首个实用型代…

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曲线下面积…