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

【Spring进阶系列丨第十篇】基于注解的面向切面编程(AOP)详解

文章目录

  • 一、基于注解的AOP
    • 1、配置Spring环境
    • 2、在beans.xml文件中定义AOP约束
    • 3、定义记录日志的类【切面】
    • 4、定义Bean
    • 5、在主配置文件中配置扫描的包
    • 6、在主配置文件中去开启AOP的注解支持
    • 7、测试
    • 8、优化改进
    • 9、总结

在这里插入图片描述

一、基于注解的AOP

1、配置Spring环境

<dependencies><!-- 导入Spring的jar包--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.1.RELEASE</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version></dependency>
</dependencies>

2、在beans.xml文件中定义AOP约束

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>

3、定义记录日志的类【切面】

@Component("logger")
@Aspect // 表示的是一个切面
public class Logger {// 目的:在调用业务方法之前进行增强【前置通知】@Before("execution(* cn.bdqn.service.impl.*.*(..))")public void beforePrintLog(){System.out.println("前置通知----beforePrintLog---开始打印日志啦");}// 后置通知@AfterReturning("execution(* cn.bdqn.service.impl.*.*(..))")public void afterReturningPrintLog(){System.out.println("后置通知----afterReturningPrintLog");}
}

​ 注意,该类的两个细节:

a、@Component注解向容器中注册一个Bean。

b、@Aspect注解表示这个是一个切面类。

c、@Before注解表示的是这个是前置增强/前置通知。

4、定义Bean

package cn.bdqn.domain;public class User {}
package cn.bdqn.service;
public interface UserService {// 保存用户public void save(User user);
}
package cn.bdqn.service.impl;
@Service("userService")	// 向容器中注册Bean
public class UserServiceImpl implements UserService {@Overridepublic void save(User user) {System.out.println("保存用户啦");}
}

​ 注意:对于业务Bean,我们也需要通过@Service注解来向容器中注册。

5、在主配置文件中配置扫描的包

<beans><context:component-scan base-package="cn.bdqn"/>
</beans>

6、在主配置文件中去开启AOP的注解支持

<beans><aop:aspectj-autoproxy/>
</beans>

7、测试

public class UserServiceTest {@Testpublic void testUserService() throws Exception{ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");UserService userService = (UserService) ac.getBean("userService");userService.queryAll();}
}

8、优化改进

​ 问题:我们看到对于切面类中定义的通知,有一个共性问题是,切入点表达式是相同的 , 那我们在想能否也像xml配置的那样,把切入点表达式给抽取出来呢?答案是可以的,改造如下:

@Component("logger")
@Aspect // 表示的是一个切面
public class Logger {@Pointcut("execution(* cn.bdqn.service.impl.*.*(..))")private void pt(){}// 目的:在调用业务方法之前进行增强【前置通知】@Before("pt()")public void beforePrintLog(){System.out.println("前置通知----beforePrintLog---开始打印日志啦");}// 演示的后置通知@AfterReturning("pt()")public void afterReturningPrintLog(){System.out.println("后置通知----afterReturningPrintLog");}
}

9、总结

  • 配置业务Bean

    @Service("userService")
    public class UserServiceImpl implements UserService{}
    
  • 配置切面Bean

  • 需要在切面类上定义@Aspect // 表示的是一个切面

    @Component("logger")
    @Aspect // 表示的是一个切面
    public class Logger {}
    
  • 在切面类中的通知方法上定义相应的通知

    @Before: 前置通知
    @AfterReturning:后置通知
    @AfterThrowing: 异常通知
    @After:最终通知
    @Around: 环绕通知
    
  • 定义切入点表达式

    @Before("execution(* cn.bdqn.service.impl.*.*(..))")
    public void beforePrintLog(){System.out.println("前置通知----beforePrintLog---开始打印日志啦");
    }
    
  • 在主配置文件中去开启AOP的注解

    aop:aspectj-autoproxy/


在这里插入图片描述

相关文章:

【Spring进阶系列丨第十篇】基于注解的面向切面编程(AOP)详解

文章目录 一、基于注解的AOP1、配置Spring环境2、在beans.xml文件中定义AOP约束3、定义记录日志的类【切面】4、定义Bean5、在主配置文件中配置扫描的包6、在主配置文件中去开启AOP的注解支持7、测试8、优化改进9、总结 一、基于注解的AOP 1、配置Spring环境 <dependencie…...

Leetcode 152. 乘积最大子数组和Leetcode 162. 寻找峰值

文章目录 Leetcode 152. 乘积最大子数组题目描述C语言题解和思路解题思路 Leetcode 162. 寻找峰值题目描述C语言题解和思路解题思路 Leetcode 152. 乘积最大子数组 题目描述 给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的非空连续子数组&#xff08;该子数组中…...

项目实战之网络电话本之发送邮件名片和导出word版个人信息

1、项目介绍 1&#xff09;项目功能 用户管理&#xff1a;分为管理员、和普通用户&#xff0c;设置不同用户的权限 电话本信息管理&#xff1a;支持管理员和普通用户对电话本的信息进行增删改操作&#xff0c;模糊查询&#xff08;根据姓名、地址、单位&#xff09; 文件批…...

前端面试问题汇总 - HTTP篇

1. 登录拦截如何实现&#xff1f; 在前端&#xff0c;可以拦截所有需要登录的请求&#xff0c;如果用户未登录或者登录过期&#xff0c;则跳转到登录页面。 2. http 缓存有哪些&#xff1f; 强缓存&#xff1a; 强缓存是指在客户端请求资源时&#xff0c;先检查本地是否存在缓存…...

Java的IO流

Day35 Java的IO流 概念 Java的IO流是用来处理输入和输出操作的机制&#xff0c;用于在程序和外部数据源&#xff08;如文件、网络连接、内存等&#xff09;之间进行数据传输。Java的IO流主要分为字节流和字符流两种类型&#xff0c;每种类型又分为输入流和输出流。 理解&#…...

Node.js 中的 RSA 加密、解密、签名与验证详解

引言 在现代的网络通信中&#xff0c;数据安全显得尤为重要。RSA加密算法因其非对称的特性&#xff0c;广泛应用于数据的加密、解密、签名和验证等安全领域。本文将详细介绍RSA算法的基本原理&#xff0c;并结合Node.js环境&#xff0c;展示如何使用内置的crypto模块和第三方库…...

vue+element作用域插槽

作用域插槽的样式由父组件决定&#xff0c;内容却由子组件控制。 在el-table使用作用域插槽 <el-table><el-table-column slot-scope" { row, column, $index }"></el-table-column> </el-table>在el-tree使用作用域插槽 <el-tree>…...

MUSA模型

MUSA模型在软件可靠性工程中起到的作用是估计软件的故障/失效数量和故障率。具体来说&#xff0c;MUSA模型包括基本模型和对数模型。 MUSA基本模型假设故障发生的时间间隔服从参数为lambda的指数分布。在这个模型中&#xff0c;当故障被检测到时&#xff0c;发生故障的部分会被…...

avicat连接异常,错误编号2059-authentication plugin…

错误原因为密码方式不对&#xff0c;具体可自行百度 首先管理员执行cmd进入 mysql安装目录 bin下边 我的是C:\Program Files\MySQL\MySQL Server 8.2\bin> 执行 mysql -u -root -p 然后输入密码 123456 进入mysql数据库 use mysql 执行 ALTER USER rootlocalhost IDE…...

阿里云云效CI/CD配置

1.NODEJS项目流水线配置(vue举例) nodejs构建配置 官方教程 注意:下图的dist是vue项目打包目录名称,根据实际名称配置 # input your command here cnpm cache clean --force cnpm install cnpm run build 主机部署配置 rm -rf /home/vipcardmall/frontend/ mkdir -p /home/…...

个人开发者,Spring Boot 项目如何部署

今天给大家分享一下&#xff0c;作为个人开发者&#xff0c;Spring Boot 项目是如何部署的。 环境介绍 Linux docker docker-compose 目录结构 erwin-windrunner - backups - data - jars - build-docker-compose.sh - docker-compose.yml - Dockerfile文件 Dockerfile …...

【Spring进阶系列丨第九篇】基于XML的面向切面编程(AOP)详解

文章目录 一、基于XML的AOP1.1、打印日志案例1.1.1、beans.xml中添加aop的约束1.1.2、定义Bean 1.2、定义记录日志的类【切面】1.3、导入AOP的依赖1.4、主配置文件中配置AOP1.5、测试1.6、切入点表达式1.6.1、访问修饰符可以省略1.6.2、返回值可以使用通配符&#xff0c;表示任…...

学习记录:转发和重定向

转发&#xff08;Forward&#xff09;和重定向&#xff08;Redirect&#xff09;是两种不同的 Web 请求处理方式&#xff0c;它们在功能和行为上有着显著的区别。 区别 转发&#xff08;Forward&#xff09;&#xff1a; 服务器内部跳转&#xff1a;转发是服务器内部的行为&…...

实现(图像、视频等)数据上云存储

实现&#xff08;图像、视频等&#xff09;数据上云存储 实现&#xff08;图像、视频等&#xff09;数据上云存储通常涉及以下几个步骤&#xff1a; 选择云存储服务商&#xff1a; 根据您的需求、预算、地域覆盖、数据安全性、服务稳定性等因素&#xff0c;选择一家合适的云存储…...

LeetCode 454.四数相加II

LeetCode 454.四数相加II 1、题目 题目链接&#xff1a;454. 四数相加 II - 力扣&#xff08;LeetCode&#xff09; 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 <…...

GoogleNet网络训练集和测试集搭建

测试集和训练集都是在之前搭建好的基础上进行修改的&#xff0c;重点记录与之前不同的代码。 还是使用的花分类的数据集进行训练和测试的。 一、训练集 1、搭建网络 设置参数&#xff1a;使用辅助分类器&#xff0c;采用权重初始化 net GoogleNet(num_classes5, aux_logi…...

将数字状态码在后台转换为中文状态

这是我们的实体类 可以看出我们的状态status是2如过返回到前端我们根本不知道2代表的是什么&#xff0c;所以我们需要再这里将数字转换成能看懂的中文状态&#xff0c;首先我们创建一个枚举类 先将我们状态码所对应的中文状态枚举出来&#xff0c;然后创建一个静态方法&#…...

2017NOIP普及组真题 4. 跳房子

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1417\ 核心思想 首先、本题中提到 “ 至少 要花多少金币改造机器人&#xff0c;能获得 至少 k分 ”。看到这样的话语&#xff0c;基本可以考虑要使用 二分答案。 那么&#xff0c;本题中…...

网络与 Internet因特网的基本概念

目录 网络Internet &#xff08;互联网或互连网&#xff09;Internet&#xff08;因特网&#xff09;待续、更新中 网络 指将分布在不同地理位置的、相同或不同类型的网络通过网络互连设备&#xff08;中继器、网桥、路由器或网关等&#xff09;相互连接&#xff0c;形成一个范…...

vue-router 中 router-link 与 a 标签的区别

文章目录 前言 a标签定义 router-link定义 总结 前言 vue-router 中 router-link 与 a 标签的区别 a标签定义 <a> 标签定义超链接&#xff0c;用于从一张页面链接到另一张页面。 从一张页面跳转到另一张页面&#xff0c;但从这里来说就违背了多视图的单页Web应用这个…...

别再只会抓HTTP了!手把手教你配置Fiddler抓取手机App的HTTPS请求(含证书安装避坑)

移动端HTTPS抓包实战&#xff1a;Fiddler配置与证书避坑指南 每次看到App里那些神秘的网络请求&#xff0c;你是不是也好奇它们到底在传输什么数据&#xff1f;作为开发者或测试人员&#xff0c;能够抓取和分析这些请求是基本功。但面对HTTPS加密流量&#xff0c;很多新手往往束…...

Uvicorn与Couchbase Analytics Service集成:构建高性能数据分析API的终极指南

Uvicorn与Couchbase Analytics Service集成&#xff1a;构建高性能数据分析API的终极指南 【免费下载链接】uvicorn An ASGI web server, for Python. &#x1f984; 项目地址: https://gitcode.com/GitHub_Trending/uv/uvicorn 在现代数据驱动的应用开发中&#xff0c;…...

Java AI开发避坑!

文章目录一、当"龙虾"突然发狂二、解剖这场"史诗级翻车"第一刀&#xff1a;插件生态大迁徙第二刀&#xff1a;API 接口一锅端第三刀&#xff1a;安全沙箱锁死第四刀&#xff1a;目录结构洗牌三、Java 开发者的至暗时刻WebSocket 连接闪断MCP 适配器失效技能…...

VS Code终端切换全攻略:从PowerShell到CMD的保姆级教程(含常见问题解决)

VS Code终端切换全攻略&#xff1a;从PowerShell到CMD的保姆级教程&#xff08;含常见问题解决&#xff09; 在开发者的日常工作中&#xff0c;终端是不可或缺的工具。VS Code作为最受欢迎的代码编辑器之一&#xff0c;其内置终端功能强大且高度可定制。然而&#xff0c;许多开…...

HunyuanVideo-Foley音效生成:支持中文prompt理解的城市环境音效精准生成

HunyuanVideo-Foley音效生成&#xff1a;支持中文prompt理解的城市环境音效精准生成 1. 产品概述 HunyuanVideo-Foley是一款专为视频内容创作设计的AI音效生成工具&#xff0c;能够根据中文文本描述精准生成各类环境音效。本镜像为RTX 4090D 24GB显存显卡深度优化的私有部署版…...

Untrunc:10倍速视频修复工具,让损坏的MP4/MOV文件起死回生

Untrunc&#xff1a;10倍速视频修复工具&#xff0c;让损坏的MP4/MOV文件起死回生 【免费下载链接】untrunc Restore a truncated mp4/mov. Improved version of ponchio/untrunc 项目地址: https://gitcode.com/gh_mirrors/un/untrunc 你是否曾经因为视频文件损坏而失去…...

Java面试如何突击?核心知识点有哪些?该如何准备拿下offer?

一、Java 面试核心知识点&#xff08;按考察优先级排序&#xff09;1. Java 基础面向对象&#xff1a;封装、继承、多态&#xff08;重载与重写&#xff09;、抽象类与接口的区别。String 系列&#xff1a;String 不可变性、StringBuilder 与 StringBuffer 的区别、常量池。集合…...

别再纠结模型了!用Python+Simulink快速搭建四旋翼无人机仿真(附完整代码)

用PythonSimulink快速搭建四旋翼无人机仿真实战指南 四旋翼无人机开发中最令人头疼的环节&#xff0c;往往不是控制算法设计&#xff0c;而是如何快速搭建一个可靠的仿真环境。我曾见过不少团队在模型选择上耗费数周时间&#xff0c;最终却陷入理论完美主义陷阱——他们反复纠结…...

「webMAN-MOD」技术探索:构建PS3主机的多功能扩展生态

「webMAN-MOD」技术探索&#xff1a;构建PS3主机的多功能扩展生态 【免费下载链接】webMAN-MOD Extended services for PS3 console (web server, ftp server, netiso, ntfs, ps3mapi, etc.) 项目地址: https://gitcode.com/gh_mirrors/we/webMAN-MOD 一、基础认知&…...

不用下载IDE!浏览器直接练Python二级考题的宝藏网站测评

浏览器直通Python二级考场&#xff1a;零配置备考实战指南 距离全国计算机二级Python考试还有30天&#xff0c;小张的笔记本电脑却突然罢工。维修店报价让他望而却步&#xff0c;而图书馆公共电脑禁止安装软件的规定更让他雪上加霜。这种困境并非个例——据教育技术协会2024年…...