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面向切面编程案例 (注解驱动开发)的更多相关文章

  1. Spring AOP 面向切面编程相关注解

    Aspect Oriented Programming 面向切面编程   在Spring中使用这些面向切面相关的注解可以结合使用aspectJ,aspectJ是专门搞动态代理技术的,所以比较专业.   ...

  2. 详细解读 Spring AOP 面向切面编程(二)

    本文是<详细解读 Spring AOP 面向切面编程(一)>的续集. 在上篇中,我们从写死代码,到使用代理:从编程式 Spring AOP 到声明式 Spring AOP.一切都朝着简单实 ...

  3. 浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~

    简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring ...

  4. 【Spring系列】Spring AOP面向切面编程

    前言 接上一篇文章,在上午中使用了切面做防重复控制,本文着重介绍切面AOP. 在开发中,有一些功能行为是通用的,比如.日志管理.安全和事务,它们有一个共同点就是分布于应用中的多处,这种功能被称为横切关 ...

  5. spring AOP面向切面编程学习笔记

    一.面向切面编程简介: 在调用某些类的方法时,要在方法执行前或后进行预处理或后处理:预处理或后处理的操作被封装在另一个类中.如图中,UserService类在执行addUser()或updateUse ...

  6. 从源码入手,一文带你读懂Spring AOP面向切面编程

    之前<零基础带你看Spring源码--IOC控制反转>详细讲了Spring容器的初始化和加载的原理,后面<你真的完全了解Java动态代理吗?看这篇就够了>介绍了下JDK的动态代 ...

  7. Spring AOP面向切面编程详解

    前言 AOP即面向切面编程,是一种编程思想,OOP的延续.在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等.在阅读本文前希望您已经对Spring有一定的了解 注:在能对代码进行添 ...

  8. 详细解读 Spring AOP 面向切面编程(一)

    又是一个周末, 今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西,名字与 OOP 仅差一个字母,其实它是对 OOP 编程方式的一种补充,并非是取而代之. ...

  9. Spring Aop面向切面编程&&自动注入

    1.面向切面编程 在程序原有纵向执行流程中,针对某一个或某一些方法添加通知,形成横切面的过程叫做面向切面编程 2.常用概念 原有功能:切点,pointcut 前置通知:在切点之前执行的功能,befor ...

  10. Spring AOP 面向切面编程入门

    什么是AOP AOP(Aspect Oriented Programming),即面向切面编程.众所周知,OOP(面向对象编程)通过的是继承.封装和多态等概念来建立一种对象层次结构,用于模拟公共行为的 ...

随机推荐

  1. 我的编程之路刷题⑦:Problem 2719.--约瑟夫问题

    2719: 约瑟夫问题   时间限制 : 1.000 sec  内存限制 : 128 MB 题目描述 有M个人,其编号分别为1-M.这M个人按顺序排成一个圈.现在给定一个数N,从第一个人开始依次报数, ...

  2. 兼容url传参

    //兼容url传参            if(java.nio.charset.Charset.forName("ISO-8859-1").newEncoder().canEnc ...

  3. Arduino开发ESP8266——安装与配置ESP8266开发板

    一.安装Arduino 1.下载安装包:点击打开 2.安装:直接点击下一步直至安装完成.如下图所示: 二.下载ESP8266开发板库: 在这面填写ESP8266开发板地址:http://arduino ...

  4. react文件分片上传

    参考文档: https://blog.csdn.net/weixin_39887846/article/details/113492372 https://juejin.cn/post/6844904 ...

  5. 通用CSS命名惯例

    通用的 CSS 命名惯例 在参与规模庞大.历时漫长.且参与人数众多的项目时,要确保每一行代码都像是同一个人编写的:这就要求所有开发者,都遵守相同的代码规范.在先前的文章前端项目开发规范意见,从宏观角度 ...

  6. JetPack Compose 入门还得是官方

    官方写的真不错! 和那些所谓"教程"比真的简单高效不罗嗦! 所以还得是官方! 使用 Jetpack Compose 更快地打造更出色的应用 https://developer.an ...

  7. What is the Best Python IDE for Data Science?

    Created by Guido van Rossum, Python was first released back in 1991. The interpreted high-level prog ...

  8. 免费Linux RDP,用来练习linux或者Python,还能做成远程桌面

        分类:资源| 阅读:1103次阅读 goorm提供了免费的Linux容器,用它来在线练习命令行是非常不错的. 它的注册非常简单:https://ide.goorm.io/ 直接用谷歌账号登录即 ...

  9. turtle绘制风轮

    题目要求: 使用turtle库,绘制一个风轮效果,其中,每个风轮内角为45度,风轮边长150像素. 我的代码: import turtle turtle.setup(500,500,100,200) ...

  10. []Python][simple]Serialize data with Pickle and deserialize data from pickle

    序列化 import pickle friend = {"Dan": [20, "Lodon", 123123], "Mary" : [24 ...