首页 > 其他分享 >SpringAOP介绍与简单实现

SpringAOP介绍与简单实现

时间:2024-03-13 20:58:05浏览次数:12  
标签:通知 切点 目标 pip 介绍 简单 SpringAOP 执行 方法

AOP

简介

AOP(Aspect Oriented Progarmming)意为:面向切面编程,可以通过预编译的方式和运行期动态代理实现在不修改源代码的情况下给程序动态同一添加功能的一种技术。

AOP的编程思想就是把很多类对象重的横切问题点,从业务逻辑中分离出来,从而达到解耦的目的,增加代码的重用性,提高开发效率。

AOP的底层是基于动态代理实现的,动态代理包括JDK的动态代理(基于接口)和CGLIB的动态代理(基于继承)。

用途

日志记录异常处理
权限验证缓存处理
事务处理数据持久化
效率检查内容分发

核心概念

  • aspect:切面,切面由切点和通知组成,即包括横切逻辑的定义也包括连接点的定义
  • pointcut:切点,每个类都拥有多个连接点,可以理解是连接点的集合
  • joinpoint:连接点,程序执行的某个特定位置,如某个方法调用前后等
  • weaving:织入,将增强添加到目标类的具体连接点的过程
  • advice:通知,是织入到目标类连接点上的一段代码,就是增强到什么地方?增强什么内容?
  • target:目标对象,通知织入的目标类
  • aop Proxy:代理对象,即增强后产生的对象

五种通知类型

  • 前置通知(Before advice):在目标方法执行之前执行。它的执行条件是目标方法被调用之前。
  • 后置通知(After advice):在目标方法执行之后执行。它的执行条件是目标方法的执行已经完成,无论是否发生异常。
  • 返回通知(After-returning advice):在目标方法成功执行并返回结果后执行。它的执行条件是目标方法成功执行并且返回结果,没有抛出异常。
  • 异常通知(After-throwing advice):在目标方法抛出异常后执行。它的执行条件是目标方法抛出了异常。
  • 环绕通知(Around advice):在目标方法执行之前和之后都执行。它的执行条件是目标方法被调用。

历史

我们以日志为例:

传统的日志模式是在每一个需要打印日志的方法内写一遍日志方法,这样子会产生大量的重复代码。后来大家将重复的代码进行提炼,提炼成一个类,也就是公共类。之后再进行打印日志时只需要引入对应的logger类即可。

但是这样子仍存在一些问题:

  • 很多类对象和Logger依然存在依赖关系,甚至每个类中的方法都需要调用Logger。
  • 如果修改了方法,需要修改n遍,不能一次修改完成。

实现步骤

我们以增强日志显示为例

1.定义一个切面类Aspect

即在声明的类,添加@Compent和@Aspect两个注解,SpringBoot要引入spring-boot-stater-aop依赖包。

package com.ruoyi.lxy.controller;

import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class MyAdvice {
       private Logger logger = LoggerFactory.getLogger(MyAdvice.class);
}

2.定义切点Pointcut

定义切点,并定义切点在哪些地方执行,采用@Pointcut注解完成,例如@Pointcut(public*com.xxx.xxx.*.*(..))

规则:修饰符(可写可不写,但不能用*)+返回值类型+哪些包下的类+哪些方法+方法参数 "*" 代表不限,".." 两个点代表参数不限

    //定义一个切面
    @Pointcut(value = "execution(* com.ruoyi.lxy.controller.*.*(..))")
    public void myPointcut(){

    }

3.定义Advice通知

选择一个切点并利用五种通知类型注解来完成在某些切点的增强动作。

其中around与其他四种声明的参数不同,为ProceedingJoinPoint pip。

其中pip.proceed();是最重要的功能,它用于控制整个切入函数的执行。

//通知
    public Object myLogger(ProceedingJoinPoint pip) throws Throwable{

        //获取类名
        String className = pip.getTarget().getClass().toString();
        //获取方法名
        String methodName = pip.getSignature().getName();
        //获取参数数组
        Object[] array = pip.getArgs();

        ObjectMapper objectMapper = new ObjectMapper();

        logger.info("执行调用前的操作");

        Object proceed = pip.proceed();

        logger.info("执行调用后的操作");

        return proceed;
    }

简单理解一下就是是定义一个切面类,类里面用切点来选择你要进行切入的类和方法,最后在通知里面选择一个切点来实现你要进行增强的功能。

标签:通知,切点,目标,pip,介绍,简单,SpringAOP,执行,方法
From: https://blog.csdn.net/qq_62188992/article/details/136681707

相关文章

  • 实验1_C语言输入输出和简单程序应用编程实验报告
    实验任务一1.task1_1点击查看代码#include<stdio.h>#include<stdlib.h>intmain(){ printf("0\n"); printf("<H>\n"); printf("II\n"); printf("0\n"); printf("<H>\n"); printf(&quo......
  • 【性能测试】移动测试md知识总结第1篇:移动端测试课程介绍【附代码文档】
    移动测试完整教程(附代码资料)主要内容讲述:移动端测试课程介绍,移动端测试知识概览,移动端测试环境搭建,ADB常用命令学习主要内容,学习目标,学习目标,1.window安装andorid模拟器,学习目标。主流移动端自动化测试工具,Appium环境搭建,appium入门案例,App基础操作API,手机控件查看工具uiaut......
  • 2024最新华为OD机试试题库全 -【提取字符串中最长合法简单数学表达式】- C卷
    1.......
  • 实验1 C语言输入输出和简单程序编写
    task1_11#include<stdio.h>2intmain()3{4printf("O\n");5printf("<H>\n");6printf("II\n");78printf("O\n");9printf("<H>\n");10......
  • 实验1 C语言输入输出和简单程序编写
    任务1任务2任务3任务3(去掉getchar)任务4任务5任务6任务7任务8......
  • 【ansible】ansible的介绍和安装
    前言运维自动化云计算核心职能搭建平台架构日常运营保障性能效率优化相关工具代码管理(SCM):GitHub、GitLab、BitBucket、SubVersion构建工具:maven、Ant、Gradle自动部署:Capistrano、CodeDeploy持续集成(CI):Jenkins、Travis配置管理:Ansible、SaltStack、Chef、P......
  • Python collections详细介绍及实例
    Python的collections库提供了许多有用的数据结构,这些数据结构是对内建数据类型的补充。以下是一些collections库中主要数据结构的详细介绍和示例:CounterCounter是一个字典子类,用于计数可哈希对象。常用于统计字符出现的次数、列表中元素出现的次数等。示例:fromcollections......
  • 简单了解Promise
    回调地狱:回调地狱是指回调函数中嵌套回调函数的情况。回调函数是为了实现代码顺序执行而出现的一种操作,会造成代码可读性差,后期难维护。一、Promise是什么?Promise是最早由社区提出和实现的一种解决异步编程的方案,比其他传统的解决方案(回调函数和事件)更合理更强大。ES6将其写......
  • L2-033 简单计算器(Python)
    作者 陈越单位 浙江大学本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示,计算器由两个堆栈组成,一个堆栈 S1​ 存放数字,另一个堆栈 S2​ 存放运算符。计算器的最下方有一个等号键,每次按下这个键,计算器就执行以下操作:从 S1​ 中弹......
  • QT TCP通信介绍
    QT是一个跨平台的C++应用程序开发框架,它提供了一套完整的工具和库,用于开发各种类型的应用程序,包括图形用户界面(GUI)应用程序、命令行工具、网络应用程序等。QT提供了丰富的功能和类来简化网络通信的开发,其中包括TCP通信。TCP通信是一种可靠的、面向连接的通信协议,它在网络中......