Spring AOP

hi ,大家好,今天为大家带来String AOP相关的知识
Spring AOP_第1张图片

文章目录

  • 1. AOP定义
  • 2. AOP功能
  • 3.Spring AOP相关概念
    • 3.1 AOP 组成
    • 3.2Spring AOP实现
      • 3.2.1添加Spring AOP框架
      • 3.2.2 定义切面
      • 3.2.3定义切点
      • 3.2.4定义通知
  • 3.3Spring AOP实现原理

1. AOP定义

AOP(Aspect Oriented Programming):⾯向切⾯编程,它是⼀种思想,它是对某⼀类事情的集中处理,旨在提高代码的模块化和复用性.
比如对登录功能的统一处理,没有AOP的时候到哪一个页面都得进行用户的登录判断,有了AOP,就可以集中在一个类里面进行处理,所有页面在加载之前先走这个登录功能,降低代码的耦合性

2. AOP功能

AOP(面向切面编程)是一种编程范式,它通过将应用程序分解成核心业务和横切关注点,然后通过动态代理等技术,在横切关注点处插入特定的代码逻辑,完成一些通用的功能,如日志记录、性能监控、事务管理等。AOP的主要功能包括:

  1. 日志记录:通过在业务方法执行前后插入日志记录代码,记录请求的参数、响应结果等信息,以便于系统运行监控和错误排查。

  2. 权限控制:通过在业务方法执行前后插入权限验证代码,判断用户的角色、权限等信息,以确定是否有权限执行该方法。

  3. 缓存管理:通过在业务方法执行前后插入缓存管理代码,在缓存中查询是否有该数据,并将查询结果缓存到本地,以提高系统性能。

  4. 事务管理:通过在业务方法执行前后插入事务管理代码,确保业务操作的一致性和完整性,防止出现数据不一致或者中断导致的数据损失等不良后果。

  5. 异常处理:通过在业务方法执行前后插入异常处理代码,对异常情况进行处理,抛出自定义的异常信息,方便上层调用者进行处理。
    Spring AOP和AOP的关系
    AOP是一种思想,Spring AOP是一个框架,是AOP思想的实现

3.Spring AOP相关概念

3.1 AOP 组成

3.2Spring AOP实现

3.2.1添加Spring AOP框架

	<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>

3.2.2 定义切面

package com.example.demo.common;

import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;


//定义切面
@Aspect
@Component
public class UserAspect {

}

3.2.3定义切点

Spring AOP_第2张图片

3.2.4定义通知

先来认识一下通知

1 前置通知(Before Advice):在目标方法执行前执行,可以在方法执行前进行一些准备工作。

2 后置通知(After Advice):在目标方法执行后执行,可以在方法执行后进行一些收尾工作。

3 返回通知(After Returning Advice):在目标方法执行并返回结果后执行,可以获取方法执行结果并进行一些操作。

4 异常通知(After Throwing Advice):在目标方法抛出异常时执行,可以对抛出的异常进行捕获和处理。

5 环绕通知(Around
Advice):在目标方法执行前后都可以执行,可以在方法执行前进行一些准备工作,在方法执行后进行一些收尾工作,并可以控制方法的执行流程。

通知定义的是被拦截的⽅法具体要执⾏的业务
Spring AOP_第3张图片
我们拦截的是UserController类里面的所有方法,所以在执行该类的目标方法时,就会执行通知
Spring AOP_第4张图片

Spring AOP_第5张图片
我们没有针对ArticleController进行拦截,
Spring AOP_第6张图片

Spring AOP_第7张图片
在这里插入图片描述
所以没有执行通知

   //环绕通知
    @Around("pointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕通知执行之前");
      Object obj=  joinPoint.proceed();
        System.out.println("环绕通知执行之后");
        return obj;
    }

Spring AOP_第8张图片

可以看到先前置通知和后置通知在环绕通知之间执行,环绕通知是在最前面和最后面执行,执行目标方法就是 Object obj= joinPoint.proceed()这一句对应的UserConttroller类里面的方法,最终返回给框架执行

3.3Spring AOP实现原理

Spring AOP是构建在动态代理上的.所以Spring 对于AOP的支持局限于方法级别的拦截
什么是动态代理呢?
是一种编程技术,可以在运行时动态生成代理类,来代替原始对象进行某些操作。动态代理可以用于很多场景,例如日志记录、性能统计、安全控制、事务管理等。

比如李华和李明都想喝蜜雪,那么就需要出去买,这样就得出去俩两次,很麻烦,所以可以一起点外卖,让外卖小哥送两杯,那么这个外卖员就相当于动态代理

Spring 动态代理组成:
1.JDK Proxy(代理对象必须实现接口,才能实现动态代理)
JDK Proxy的实现原理就是利用Java反射机制,动态生成一个代理类,代理类实现需要被代理的接口,并将代理对象的方法调用转发给实现
2.CGLIB(实现代理类的子类实现动态代理),由于由于实现子类需要继承,而一个类想要被继承不能被final修饰,所以,CGLIB的限制条件:被final修饰的类不能被代理

JDK Proxy VS CGLIB

1.出身不同
JDK Proxy来源于Java,CGLIB来源于第三方
2.实现方式不同:
JDK Proxy是通过Java反射机制在运行时动态生成代理类,而CGLIB则是通过继承被代理类来创建代理类。
3.性能不同:JDK Proxy比CGLIB要快,因为JDK Proxy是直接使用Java反射机制调用被代理对象的方法,而CGLIB使用的是动态生成的代理类来调用被代理对象的方法,因此会涉及到类加载和方法调用,相对来说比较耗时。

今天的讲解就到这里,下期再见!
Spring AOP_第9张图片

你可能感兴趣的:(java,spring,mybatis)