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(面向对象编程)通过的是继承.封装和多态等概念来建立一种对象层次结构,用于模拟公共行为的 ...
随机推荐
- 中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告4
中国人民公安大学 Chinese people' public security university 网络对抗技术 实验报告 实验四 恶意代码技术 学生姓名 陈禹 年级 2018 区队 ...
- Email Windows发送成功,Linux却发送失败的可能原因
一.linux端口被禁用,通过telnet查看.(我这里没问题) 二.排查环境参数是否一致(我这里没问题) 三.查看jdk版本原因,因为jdk1.8有的版本禁用了ssl 参阅文档:https://bl ...
- Django框架搭建web项目(二)
1.在路径XXXXX\mydjango\mydjango\mydjango下新建views.py(在浏览器中url请求后所展示的内容设置) from django.http import HttpRe ...
- 论MVC架构设计及其应用
论MVC架构设计及其应用 张紫诺1 (1. 位石家庄铁道大学,河北 石家庄 050000) 摘要:随着信息化建设的发展,人们愈发需要考虑采用一种良好的架构实现快速构建企业应用程序的目标.而MVC架构正 ...
- 第13章 MVC和Razor Pages过滤器管道(ASP.NET Core in Action, 2nd Edition)
本章包括 过滤器管道及其与中间件的区别 创建自定义筛选器以重构复杂的操作方法 使用授权筛选器保护您的操作方法和Razor页面 短路筛选器管道以绕过操作和页面处理程序执行 将依赖项注入筛选器 在第1部分 ...
- day28_常用模块——hashlib,logging模块
hashlib(摘要算法) Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度 ...
- Centos7下搭建部署DoClever接口管理平台
项目地址: github:https://github.com/sx1989827/DOClever 码云:https://gitee.com/sx1989827/SBDoc 1.根据官方文档,先安装 ...
- Vue二级联动上传图片
二级联动的后台和之前一样都需要一个字典字段查询来实现二级联动 但是由于VUE语法和AJAX的不同在前台绑定的时候也有所不同 2.1 首先下拉框的写法就有了本质的改变通过v-model="&q ...
- RSA模数N因式分解
模数N: 76190944763750744276324637081713604133996627079343036558766297773626553110133339218840357338899 ...
- vite设置跨域
1. vite.config.ts或者vite.config.js文件 server: { port: 3001, host: '0.0.0.0', open: true, proxy: { // 代 ...