Spring AOP面向切面编程案例 (注解驱动开发)
AOP(动态代理):指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式;
【1】导入 aop 模块;Spring AOP:(spring-aspects);
【2】定义一个业务逻辑类(MathCalculator),在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx);
【3】定义一个日志切面类(LogAspects):切面类里面的方法需要动态感知 MathCalculator.div 运行到哪里然后执行;
通知方法:
■ 前置通知(@Before):logStart:在目标方法(div)运行之前运行;
■ 后置通知(@After):logEnd:在目标方法(div)运行结束之后运行(无论方法正常结束还是异常结束);
■ 返回通知(@AfterReturning):logReturn:在目标方法(div)正常返回之后运行;
■ 异常通知(@AfterThrowing):logException:在目标方法(div)出现异常以后运行;
■ 环绕通知(@Around):动态代理,手动推进目标方法运行(joinPoint.procced());
【4】给切面类的目标方法标注何时何地运行(通知注解);
【5】将切面类和业务逻辑类(目标方法所在类)都加入到容器中;
【6】必须告诉 Spring 哪个类是切面类(给切面类上加一个注解:@Aspect)
【7】给配置类中加 @EnableAspectJAutoProxy 【开启基于注解的 aop 模式】
【三步】:1)、将业务逻辑组件和切面类都加入到容器中;告诉 Spring 哪个是切面类(@Aspect)
2)、在切面类上的每一个通知方法上标注通知注解,告诉 Spring 何时何地运行(切入点表达式)
3)、开启基于注解的 aop 模式;@EnableAspectJAutoProxy
【提前】:导入 aspects 依赖
1 <dependency>
2 <groupId>org.springframework</groupId>
3 <artifactId>spring-aspects</artifactId>
4 <version>5.1.5.RELEASE</version>
5 </dependency>
【切面类】
1 /**
2 * 切面类
3 * @Aspect: 告诉Spring当前类是一个切面类
4 */
5 @Aspect
6 public class LogAspects {
7
8 //抽取公共的切入点表达式
9 //1、本类引用
10 //2、其他的切面引用
11 @Pointcut("execution(public int com.atguigu.aop.MathCalculator.*(..))")
12 public void pointCut(){};
13
14 //@Before在目标方法之前切入;切入点表达式(指定在哪个方法切入)
15 @Before("pointCut()")
16 public void logStart(JoinPoint joinPoint){
17 Object[] args = joinPoint.getArgs();
18 System.out.println(""+joinPoint.getSignature().getName()+"运行。。。@Before:参数列表是:{"+Arrays.asList(args)+"}");
19 }
20
21 @After("com.atguigu.aop.LogAspects.pointCut()")
22 public void logEnd(JoinPoint joinPoint){
23 System.out.println(""+joinPoint.getSignature().getName()+"结束。。。@After");
24 }
25
26 //JoinPoint一定要出现在参数表的第一位
27 @AfterReturning(value="pointCut()",returning="result")
28 public void logReturn(JoinPoint joinPoint,Object result){
29 System.out.println(""+joinPoint.getSignature().getName()+"正常返回。。。@AfterReturning:运行结果:{"+result+"}");
30 }
31
32 @AfterThrowing(value="pointCut()",throwing="exception")
33 public void logException(JoinPoint joinPoint,Exception exception){
34 System.out.println(""+joinPoint.getSignature().getName()+"异常。。。异常信息:{"+exception+"}");
35 }
【正常类】
1 public class MathCalculator {
2 public int div(int i,int j){
3 System.out.println("MathCalculator...div...");
4 return i/j;
5 }
6 }
【配置类】
1 @EnableAspectJAutoProxy
2 @Configuration
3 public class MainConfigOfAOP {
4
5 //业务逻辑类加入容器中
6 @Bean
7 public MathCalculator calculator(){
8 return new MathCalculator();
9 }
10
11 //切面类加入到容器中
12 @Bean
13 public LogAspects logAspects(){
14 return new LogAspects();
15 }
16 }
Spring AOP面向切面编程案例 (注解驱动开发)的更多相关文章
- Spring AOP 面向切面编程相关注解
Aspect Oriented Programming 面向切面编程 在Spring中使用这些面向切面相关的注解可以结合使用aspectJ,aspectJ是专门搞动态代理技术的,所以比较专业. ...
- 详细解读 Spring AOP 面向切面编程(二)
本文是<详细解读 Spring AOP 面向切面编程(一)>的续集. 在上篇中,我们从写死代码,到使用代理:从编程式 Spring AOP 到声明式 Spring AOP.一切都朝着简单实 ...
- 浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~
简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring ...
- 【Spring系列】Spring AOP面向切面编程
前言 接上一篇文章,在上午中使用了切面做防重复控制,本文着重介绍切面AOP. 在开发中,有一些功能行为是通用的,比如.日志管理.安全和事务,它们有一个共同点就是分布于应用中的多处,这种功能被称为横切关 ...
- spring AOP面向切面编程学习笔记
一.面向切面编程简介: 在调用某些类的方法时,要在方法执行前或后进行预处理或后处理:预处理或后处理的操作被封装在另一个类中.如图中,UserService类在执行addUser()或updateUse ...
- 从源码入手,一文带你读懂Spring AOP面向切面编程
之前<零基础带你看Spring源码--IOC控制反转>详细讲了Spring容器的初始化和加载的原理,后面<你真的完全了解Java动态代理吗?看这篇就够了>介绍了下JDK的动态代 ...
- Spring AOP面向切面编程详解
前言 AOP即面向切面编程,是一种编程思想,OOP的延续.在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等.在阅读本文前希望您已经对Spring有一定的了解 注:在能对代码进行添 ...
- 详细解读 Spring AOP 面向切面编程(一)
又是一个周末, 今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西,名字与 OOP 仅差一个字母,其实它是对 OOP 编程方式的一种补充,并非是取而代之. ...
- Spring Aop面向切面编程&&自动注入
1.面向切面编程 在程序原有纵向执行流程中,针对某一个或某一些方法添加通知,形成横切面的过程叫做面向切面编程 2.常用概念 原有功能:切点,pointcut 前置通知:在切点之前执行的功能,befor ...
- Spring AOP 面向切面编程入门
什么是AOP AOP(Aspect Oriented Programming),即面向切面编程.众所周知,OOP(面向对象编程)通过的是继承.封装和多态等概念来建立一种对象层次结构,用于模拟公共行为的 ...
随机推荐
- 微信小程序云开发,快速生成短信验证码
使用微信小程序云函数实现注册短信验证码的管理,并不是一件分分钟的事,目前想要存储验证码只能放到数据库中,因为存储后才能和用户提交上来的验证码做比较. 管理验证码主要涉及到:生成.存储.校验.有效期管理 ...
- Linux 第三节(重定向符,通配符,管道符,转义符,VIM编辑器)
1.输入重定向符 < 2.输出重定向符 将我们的命令原本要输出到屏幕的内容,输出到文件里面 标准信息 > 覆盖> 追加>> 错误信息 2> 覆盖2> ...
- Windows系统更改/迁移用户目录
系统盘为C盘,C盘空间不足,C盘太满了,C盘清理时查看发现C:\Users目录占用几十个GB,以下方法可将Users目录大部分空间转移. 1. 准备工作 更改/迁移用户目录之前先自行备份当前用户的资料 ...
- oracle-11.2.0.4静默安装----RedHat7.5
1.配置/etc/hosts文件和关闭seliux和firewall防火墙 编辑/etc/hosts文件 [root@henry ~]# vim /etc/hosts [root@henry ~]# ...
- gpio 理解
NVIC :NVIC_Init(&NVIC_Initsture); 1.NVIC只是设置某一种中断的优先级,而不是打开某种中断. 2.ppp_ITConfig():才是开/关具体某种中断使能位 ...
- c++标准官网
gcc官网: https://gcc.gnu.org/ c++参考手册: https://en.cppreference.com/w/cpp c++教程网站: https://www.learncpp ...
- K8S中Pod概念
一.资源限制 Pod 是 kubernetes 中最小的资源管理组件,Pod 也是最小化运行容器化应用的资源对象.一个 Pod 代表着集群中运行的一个进程.kubernetes 中其他大多数组件都是围 ...
- toString能转换number类型吗
let num = 60console.log(toString(num)) // [object Undefined] console.log(String(num)) // 60
- JQUERY选择器大全(转载)
在Web应用程序中,大部分的客户端操作都是基于对象的操作,要操作对象就必须先获取对象,jQuery提供了强大的选择器让我们获取对象.我人为地将jQuery选择器分为两大部分:选择对象和筛选条件.选择对 ...
- YY播放器源码解析
YY播放器使用Flutter编写的一个聚合播放器, 起因是看了 ZY-Player的源码, 发现实现挺有意思的, 也比较简单 地址: https://github.com/waifu-project/ ...