spring之Spring AOP基于注解
文章目录
- 前言
- 一、Spring AOP基于注解的所有通知类型
- 1、前置通知
- 2、后置通知
- 3、环绕通知
- 4、最终通知
- 5、异常通知
- 二、Spring AOP基于注解之切面顺序
- 三、Spring AOP基于注解之通用切点
- 三、Spring AOP基于注解之连接点
- 四、Spring AOP基于注解之全注解开发
前言
通知类型包括:
- 前置通知:@Before目标方法执行之前的通知
- 后置通知:@AfterReturning目标方法执行之后的通知
- 环绕通知:@Around目标方法之前添加通知,同时目标方法执行之后添加通知
- 异常通知:@AfterThrowing发生异常之后执行的通知
- 最终通知:@After放在finally语句块中的通知 -
一、Spring AOP基于注解的所有通知类型
1、前置通知
//@Before(切点表达式 确定在哪里进行切入)标注的方法就是一个前置通知,在目标类的目标方法执行之前执行@Before("execution(* com.powernode.spring.service.UserService.* (..))")public void beforeAdvice(){System.out.println("前置通知");}

2、后置通知
//后置通知@AfterReturning("execution(* com.powernode.spring.service.UserService.* (..))")public void afterReturningAdvice(){System.out.println("后置通知");}

3、环绕通知
//环绕通知@Around("execution(* com.powernode.spring.service.UserService.* (..))")public void aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {//前面的代码System.out.println("前环绕");//执行目标joinPoint.proceed();//执行目标//后面的代码System.out.println("后环绕");}
注意:需要添加一个参数(ProceedingJoinPoint )去执行目标方法

4、最终通知
//最终通知@After("execution(* com.powernode.spring.service.UserService.* (..))")public void afterAdvice(){System.out.println("最终通知");}

5、异常通知
目标方法中设计异常:
@Service("userservice") //将这个类纳入spring容器管理
public class UserService { //目标类public void login(){ //目标方法System.out.println("系统正在进行身份认证....");if(1==1){throw new RuntimeException("运行时异常");}}
}
//异常通知@AfterThrowing("execution(* com.powernode.spring.service.UserService.* (..))")public void afterThrowing(){System.out.println("异常通知");}

发生异常后,后置通知以及后环绕都没有了
二、Spring AOP基于注解之切面顺序
再增加一个安全切面:
public class SecurityAspect { //安全切面//通知+切点@Before("execution(* com.powernode.spring.service.UserService.* (..))")public void beforeAdvice(){System.out.println("前置通知:安全……");}
}
那么安全切面和日志切面的执行顺序如何来排呢?
@Order注解
@Order(1)
@Order(2)
谁的数字越小优先级越高

三、Spring AOP基于注解之通用切点
切面表达式写了多次,怎么解决?
@Pointcut("execution(* com.powernode.spring.service.UserService.* (..))")public void 通用切点(){//这个方法只是一个标记。方法名随意,方法体中也不需要写任何代码。}@Before("通用切点()")public void beforeAdvice(){System.out.println("前置通知");}
跨类的话:
@Before("com.powernode.spring.service.LogAspect.通用切点()")public void beforeAdvice(){System.out.println("前置通知:安全……");}

三、Spring AOP基于注解之连接点
JoinPoint在Spring容器调用这个方法的时候自动传过来
我们可以用它来获取目标方法的签名
@Before("通用切点()")public void beforeAdvice(JoinPoint joinPoint){System.out.println("前置通知");System.out.println("目标方法的方法名:"+joinPoint.getSignature().getName());}

四、Spring AOP基于注解之全注解开发
SpringConfig 代替spring.xml文件
@Configuration//代替spring.xml文件
@ComponentScan({"com.powernode.spring.service"}) //组件扫描
@EnableAspectJAutoProxy(proxyTargetClass = true) //开启aspectj的自动代理
public class SpringConfig {
}
测试程序:
@Testpublic void testNoXml(){ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);UserService userservice = (UserService) ac.getBean("userservice");userservice.login();}

相关文章:
spring之Spring AOP基于注解
文章目录前言一、Spring AOP基于注解的所有通知类型1、前置通知2、后置通知3、环绕通知4、最终通知5、异常通知二、Spring AOP基于注解之切面顺序三、Spring AOP基于注解之通用切点三、Spring AOP基于注解之连接点四、Spring AOP基于注解之全注解开发前言 通知类型包括&#x…...
LeetCode题目笔记——6362. 合并两个二维数组 - 求和法
文章目录题目描述题目链接题目难度——简单方法一:常规双指针遍历代码/Python方法二:字典\哈希表代码/Python总结题目描述 给你两个 二维 整数数组 nums1 和 nums2. nums1[i] [idi, vali] 表示编号为 idi 的数字对应的值等于 vali 。nums2[i] [idi, …...
【C#基础】C# 常用语句讲解
序号系列文章3【C#基础】C# 数据类型总结4【C#基础】C# 变量和常量的使用5【C#基础】C# 运算符总结文章目录前言语句概念1,迭代语句1.1 for 语句1.2 foreach 语句1.3 while 语句1.4 do 语句2,选择语句2.1,if 语句2.2,else 语句2.3…...
腾讯云——负载均衡CLB
负载均衡 CLB 提供四层(TCP 协议/UDP 协议/TCP SSL 协议)和七层(HTTP 协议/HTTPS 协议)负载均衡。您可以通过 CLB 将业务流量分发到多个后端服务器上,消除单点故障并保障业务可用性。CLB 自身采用集群部署,…...
6.关于系统服务的思考—— native vs java
文章目录native服务 以sensor service为例Native 服务java 服务, 以vibrate为例java 服务 以一个demo为例native服务 以sensor service为例 service启动 SystemServer.startBootstrapServices---->>>mSystemServiceManager.startService—>>>Sen…...
SQL语句创建视图:
前言 🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯 c语言初阶 🔑个人信条: 🌵知行合一 🍉本篇简介:>:介绍数据库中有关视图的知识,参考学校作业. 金句分享:…...
使用BP神经网络和Elman Net预测航班价格(Matlab代码实现)
👨🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…...
JavaWeb9-volatile解决内存可见性和指令重排序问题
目录 1.解决内存可见性问题 2.解决指令重排序问题 3.volatile缺点 4.特使使用场景 volatile(易变的,易挥发的,不稳定的)可以解决内存可见性和指令重排序的问题。 1.解决内存可见性问题 代码在写入 volatile 修饰的变量时&am…...
Docker - 镜像操作命令
镜像名称一般分为两部分组成:[repository]:[tag]在没有指定tag时,默认是latest,代表最新版本的镜像1.下载docker镜像 docker pull repository:tag2.查看本地所有镜像 docker images3.创建镜像别名 docker tag repository:tag repository111:tag4.查看镜像…...
全栈之路-前端篇 | 第三讲.基础前置知识【前端标准与研发工具】学习笔记
欢迎关注「全栈工程师修炼指南」公众号 点击 👇 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习! 涉及 企业运维、网络安全、应用开发、物联网、人工智能、大数据 学习知识 “ 花开堪折直须折,莫待无花…...
Tomcat 线上调优记录
原始Tomcat配置 启动参数Plaintext-Xms256m -Xmx512m -XX:MaxPermSize128m Tomcat 参数配置XML<Executor name"tomcatThreadPool" namePrefix"catalina-exec-" maxThreads"1500" minSpareThreads"50" maxIdleTime"600000&q…...
学习 Python 之 Pygame 开发坦克大战(四)
学习 Python 之 Pygame 开发坦克大战(四)坦克大战添加音效1. 初始化音效2. 加入游戏开始音效和坦克移动音效3. 添加坦克开火音效4. 添加装甲削减音效5. 添加坦克爆炸音效6. 添加子弹击中边界音效坦克大战添加音效 我的素材放到了百度网盘里,…...
New和Malloc的使用及其差异
1,new的使用关于new的定义:new其实就是告诉计算机开辟一段新的空间,但是和一般的声明不同的是,new开辟的空间在堆上,而一般声明的变量存放在栈上。通常来说,当在局部函数中new出一段新的空间,该…...
2023年细胞生物学复习汇总
细胞分化 1.什么是细胞分化?细胞分化的特点是什么? 答:(1)细胞分化(cell differentiation)是指同一来源的细胞逐渐产生出形态结构、功能特征各不相同的细胞类群的过程,其结果是在空间…...
光伏VSG-基于虚拟同步发电机的光伏并网逆变器系统MATLAB仿真
采用MATLAB2021b仿真!!!仿真模型1光伏电池模块(采用MATLAB自带光伏模块)、MPPT控制模块、升压模块、VSG控制模块、电流滞环控制模块。2s时改变光照强度 !!!VSG输出有功功率、无功功率…...
高可用 - 02 Keepalived_VRRP工作原理
文章目录Keepalived VS HeartbeatKeepalived的用途VRRP与工作原理物理路由器和虚拟路由器Keepalived VS Heartbeat Keepalived是Linux下一个轻量级的高可用解决方案,它与Heartbeat、RoseHA实现的功能类似,都可以实现服务或者网络的高可用,但…...
vue实现xml在线编辑功能
先看效果 避免误会 这是一个在线编辑器 我们可以在这上面随意的编写xml代码格式 我们修改上面的内容之后 就可以在控制台输出内容 如果这正是您想要的东西 那就可以先创建一个vue项目 我们先引入依赖 npm install brace -S npm install element-ui -S npm install vue-cli…...
GitHub Workflow
GitHub Workflow 基本流程 把远程仓库克隆到本地 git clone xxxx.git在本地切换至新的分支 git checkout -b new_branch修改本地仓库的文件 项目修改完成后,查看修改的内容 git diff上传修改之后的内容到本地暂存区 git add modified_files将本地暂存区的代码更新…...
vue学习
vue 其实你只要安装一个vue-cli 就可以了 vue-cli 你可以用比较高的版本 这 当然是 可以滴...
Windows使用ssh协议远程连接ubuntu linux系统
Windows使用ssh协议远程连接ubuntu linux系统一、Windows远程连接ubuntu linux系统二、开启ubuntu ssh服务三、获取ubuntu子系统的ip地址四、从windows上通过ssh连接到ubuntu子系统五、设置ubuntu系统ssh自启动(18.04)一、Windows远程连接ubuntu linux系…...
从‘套娃’结构到SOTA效果:我是如何用U2-Net搞定商品抠图与海报生成的
从‘套娃’结构到SOTA效果:我是如何用U2-Net搞定商品抠图与海报生成的 去年双十一大促前,我们电商团队遇到了一个棘手问题:每天新增的上万张商品图需要快速去除背景,用于生成营销海报。传统Photoshop手动处理每张图需要5-10分钟&a…...
Smart AM60 Armbian适配:从电视盒子到高性能服务器的蜕变之路
Smart AM60 Armbian适配:从电视盒子到高性能服务器的蜕变之路 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, r…...
让业务人员直接“问“数据库:Spring AI Alibaba NL2SQL 实战指南
不用学 SQL,不用找开发排期,用大白话就能查数据——这不是未来,而是现在就能落地的方案。 一个真实的痛点 你是公司的运营负责人,想知道"上个月华东地区复购率最高的三个品类"。 在传统模式下,这个需求的链…...
5分钟终极指南:在Windows上完美使用苹果触控板的完整方案
5分钟终极指南:在Windows上完美使用苹果触控板的完整方案 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precision-touchpad…...
如何快速掌握Unity游戏模组管理:5分钟终极指南
如何快速掌握Unity游戏模组管理:5分钟终极指南 【免费下载链接】unity-mod-manager UnityModManager 项目地址: https://gitcode.com/gh_mirrors/un/unity-mod-manager 还在为Unity游戏模组安装繁琐而烦恼吗?每次想为游戏添加新功能,却…...
Asian Beauty Z-Image Turbo商业应用:快速生成品牌宣传东方形象照
Asian Beauty Z-Image Turbo商业应用:快速生成品牌宣传东方形象照 大家好,今天我们来聊一个对品牌方、市场人员和内容创作者特别有吸引力的工具——Asian Beauty Z-Image Turbo。如果你正在为品牌宣传、社交媒体内容或营销活动寻找高质量的东方形象照&a…...
Node.js 结合 LangChainJS 实现智能对话系统的实战探索
1. 为什么选择Node.js和LangChainJS构建智能对话系统 最近几年,智能对话系统已经成为开发者工具箱里的标配。作为一个在AI领域摸爬滚打多年的老手,我发现Node.js和LangChainJS的组合特别适合快速搭建这类系统。Node.js的异步非阻塞特性让它天生适合处理对…...
3大核心策略!Langchain-Chatchat RAG语义匹配效率提升实战指南
3大核心策略!Langchain-Chatchat RAG语义匹配效率提升实战指南 【免费下载链接】Langchain-Chatchat Langchain-Chatchat(原Langchain-ChatGLM)基于 Langchain 与 ChatGLM, Qwen 与 Llama 等语言模型的 RAG 与 Agent 应用 | Langchain-Chatch…...
保姆级教程:Qwen3-TTS-Tokenizer-12Hz快速入门,小白也能玩转音频压缩
保姆级教程:Qwen3-TTS-Tokenizer-12Hz快速入门,小白也能玩转音频压缩 1. 音频压缩新选择:为什么你需要了解Qwen3-TTS-Tokenizer 想象一下,你有一段30秒的语音消息,原始文件大小约480KB。如果能把它压缩到不到1KB&…...
OpenClaw+千问3.5-9B:自动化学习笔记整理系统
OpenClaw千问3.5-9B:自动化学习笔记整理系统 1. 为什么需要自动化笔记整理 作为一个长期与技术文档打交道的开发者,我发现自己陷入了一个困境:每天阅读大量技术文章、论文和在线课程,但收集的笔记却散落在不同平台——有些在One…...
