spring AOP学习

概念

  • 面向切面编程
  • 横向扩展
  • 动态代理

相关术语

动态代理

spring在运行期,生成动态代理对象,不需要特殊的编译器

Spring AOP的底层就是通过JDK动态代理或者CGLIb动态代理 技术为目标Bean执行横向织入

  1. 目标对象实现了接口,spring使用JDK的java.lang.reflect.Proxy类代理
  2. 若目标对象没有实现任何接口,spring使用CGLib库生成目标对象的子类

AOP通知类型

  • 前置通知
  • 后置通知
  • 环绕通知
  • 异常通知
  • 引介通知

AOP切面类型

  • Advisor:代表一般切面,Advice本身就是一个切面,对目标类所有方法进行拦截
  • PointcutAdvisor:代表具有切点的切面,可以指定拦截目标类哪些方法

AspectJ

实现spring AOP的一个框架

通知类型

@Before 前置通知,相当于BeforeAdvice

@AfterReturning 后置通知,相当于AfterReturningAdvice

@Around 环绕通知,相当于MethodInterceptor

@AfterThrowing异常抛出通知,相当于ThrowAdvice

@After 最终final通知,不管是否异常,该通知都会执行

切入点表达式

注意:

代码在 spring-aop中

java 复制代码
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class MyAdvice {

    /**
     * 可以获取到方法的返回值
     * 给update方法进行后置增强
     */
    @AfterReturning(value = "execution(* cn.ting.aop.aspectj.*.update(..))",returning="result")
    public void after(String result){
        System.out.println("后置通知"+result);
    }

    /**
     *
     * 给insert方法进行前置增强
     */
    @Before(value = "execution(* cn.ting.aop.aspectj.*.insert(..))")
    public void before(JoinPoint joinPoint){
        System.out.println("前置通知"+joinPoint.getTarget());
    }

    /**
     * 环绕通知
     * @param joinPoint
     */
    @Around(value = "execution(* cn.ting.aop.aspectj.*.find(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("前置通知");
        Object proceed = joinPoint.proceed();
        System.out.println("后置通知");
        return proceed;
    }

}
相关推荐
YuTaoShao14 分钟前
Java八股文——JVM「内存模型篇」
java·开发语言·jvm
开开心心就好23 分钟前
电脑扩展屏幕工具
java·开发语言·前端·电脑·php·excel·batch
凡人的AI工具箱1 小时前
PyTorch深度学习框架60天进阶学习计划-第57天:因果推理模型(二)- 高级算法与深度学习融合
人工智能·pytorch·深度学习·学习·mcp·a2a
Gsen28191 小时前
AI大模型从0到1记录学习 大模型技术之机器学习 day27-day60
人工智能·学习·机器学习
零叹2 小时前
篇章十 数据结构——排序
java·数据结构·算法·排序算法
一个有女朋友的程序员2 小时前
Spring Boot 整合 Smart-Doc:零注解生成 API 文档,告别 Swagger
java·spring boot·smart-doc
苹果醋32 小时前
AI大模型竞赛升温:百度发布文心大模型4.5和X1
java·运维·spring boot·mysql·nginx
网安INF2 小时前
CVE-2020-1938源码分析与漏洞复现(Tomcat 文件包含/读取)
java·网络·web安全·网络安全·tomcat·漏洞复现
nenchoumi31192 小时前
UE5 学习系列(九)光照系统介绍
java·学习·ue5