Spring AOP 笔记 简单易解

简介: Spring AOP 笔记 简单易解

什么是AOP


AOP:全称是Aspect Oriented Programming即:面向切面编程。

面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

也就是,使用代理技术,在不修改代码的基础上,对已有方法进行增强。


AOP专业术语


目标类:需要被增强的类

连接点:需要被增强的类中可能要被增强的方法

切入点:就是被增强了的方法

通知/增强:增强的方法

切面:切入点和通知点的结合

织入:增强添加到目标类的具体链接点上的过程

代理:一个类被AOP织入增强后 就产生了一个结果代理对象                                                

代理模式


AOP有两种代理模式 一种是JDK动态代理 一种是cglib代理


第一种必须要有接口和实现类 在有接口的情况下 自动采用JDK动态代理


第二种是没有接口的情况下 采用cglib代理  (使用前提 不能被final修饰)


切入点表达式


 execution:用于匹配方法执行的连接点


execution表达式


       execution([修饰符] 返回值类型 包名.类名.方法名(参数类型列表)[throws 异常])


返回值:


       *任意返回值


包名:


       包名.包名.*.dao       任意模块下的dao    


       包名.包名.*sys        固定后缀的包


       包名.包名..              任意包或子包


类名:


       *类名        固定后缀


       类名*        固定前缀


       *                任意类


参数:


       (..)        参数任意


       (*)        任意一个参数


下面有一些练习参考


 全匹配方式:
    public void com.czxy.service.impl.CustomerServiceImpl.saveCustomer()
  访问修饰符可以省略 
    void com.czxy.service.impl.CustomerServiceImpl.saveCustomer()
  返回值可以使用*号,表示任意返回值
    * com.czxy.service.impl.CustomerServiceImpl.saveCustomer()
  包名可以使用*号,表示任意包,但是有几级包,需要写几个*
    * *.*.*.*.CustomerServiceImpl.saveCustomer()
  使用..来表示当前包,及其子包
    * com..CustomerServiceImpl.saveCustomer()
  类名可以使用*号,表示任意类
    * com..*.saveCustomer()
  方法名可以使用*号,表示任意方法
    * com..*.*()
  参数列表可以使用*,表示参数可以是任意数据类型,但是必须有参数
    * com..*.*(*)
  参数列表可以使用..表示有无参数均可,有参数可以是任意类型
    * com..*.*(..)
  全通配方式:
    * *..*.*(..)


通知类型


前置通知


       @Before 在方法的前面使用

    @Before("execution(* com.czxy.demo16_aop.service..*.*(..))")
    public void myBeforeAdvice() {
        System.out.println("开启事务");
    }

后置通知


       @AfterReturning 在方法的后面使用 returning指定方法的的返回值变量名 方法形参名必须和返回值变量名一样 切入点(目标类被增强的方法)返回什么 返回值变量就是什么

1.// 返回值:类型 变量名
//    类型,必须是Object
//      变量名,需要通过returning设置,且提供对应的方法参数
@AfterReturning(value="切入点表达式", returning = "返回值变量名")
public void 方法名(Object 返回值变量名) {
}


环绕通知



       @Around 在方法的前后执行 ProceedingJoinPoint对象是JoinPoint的子接口 该对象只能用在@Around的切面方法中有两个方法:


       Object proceed() throws Throwable        执行目标方法


       Object proceed(Object[] var1) throws Throwable    传入的新的参数去执行目标方法  


    // 环绕通知:必须手动执行目标方法(连接点) 
  //   1) ProceedingJoinPoint 可执行连接点
  //   2) proceedingJoinPoint.proceed() 执行切入点(目标类的方法)
  //   3) 需要将切入点返回值返回给下一个调用者
    @Around("execution(* com.czxy.demo16_aop.service..*.*(..))")
    public Object myAroundAdvice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕前2");
        // 执行目标
        Object proceed = proceedingJoinPoint.proceed();
        System.out.println("环绕后2");
        return proceed;
    }


异常通知


       @AfterThrowing 当切入点出现异常的时候 异常通知才会执行 把异常信息封装在Throwable中

    // 异常通知,可以获得异常具体信息,异常类型(Throwable) 异常变量名
    @AfterThrowing(value="execution(* com.czxy.demo16_aop.service..*.*(..))",throwing = "e")
    public void myAfterThrowingAdvice(Throwable e) {
        System.out.println("异常通知:" + e.getMessage());
    }

最终通知


       @Afrer 无论切入点是否报错 最终都会执行最终通知

    @After("execution(* com.czxy.demo16_aop.service..*.*(..))")
    public void myAfterAdvice() {
        System.out.println("释放资源");
    }

抽取切入点

       当需要修改切入点表达式的时候 这时候就要一个一个去修改 很麻烦 所以我们把切入点抽取出来 方便我们修改切点表达式

    // 抽取公共切入点表达式
    @Pointcut("execution(* com.czxy.demo16_aop.service..*.*(..))")
    private void myPointcut() {
    }
    // 前置通知
//    @Before("myPointcut()")
    public void myBeforeAdvice() {
        System.out.println("开启事务2");
    }

小结


       try{

           // 前置通知、环绕通知

           // 目标类的方法

           // 后置通知、环绕通知

       } catch() {

           // 抛出异常通知

       } finally {

           // 最终通知

       }


//前置通知 @Before

//后置通知 @AfterReturning

//环绕通知 @Around

//抛出异常通知 @AfterThrowing

//最终通知 @After


配置类


       配置类必须开启切面支持 使用@EnableAspectJAutoProxy 而切面类需要使用@Aspect来标识它是一个切面类

相关文章
|
2月前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
2月前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
69 5
|
2月前
|
Java 开发者 Spring
深入解析:Spring AOP的底层实现机制
在现代软件开发中,Spring框架的AOP(面向切面编程)功能因其能够有效分离横切关注点(如日志记录、事务管理等)而备受青睐。本文将深入探讨Spring AOP的底层原理,揭示其如何通过动态代理技术实现方法的增强。
76 8
|
2月前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
2月前
|
XML 监控 安全
深入调查研究Spring AOP
【11月更文挑战第15天】
49 5
|
2月前
|
Java 开发者 Spring
Spring AOP深度解析:探秘动态代理与增强逻辑
Spring框架中的AOP(Aspect-Oriented Programming,面向切面编程)功能为开发者提供了一种强大的工具,用以将横切关注点(如日志、事务管理等)与业务逻辑分离。本文将深入探讨Spring AOP的底层原理,包括动态代理机制和增强逻辑的实现。
49 4
|
3月前
|
存储 缓存 Java
Spring高手之路23——AOP触发机制与代理逻辑的执行
本篇文章深入解析了Spring AOP代理的触发机制和执行流程,从源码角度详细讲解了Bean如何被AOP代理,包括代理对象的创建、配置与执行逻辑,帮助读者全面掌握Spring AOP的核心技术。
57 3
Spring高手之路23——AOP触发机制与代理逻辑的执行
|
2月前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
44 1
|
2月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
45 0
|
3月前
|
XML Java 数据格式
Spring的IOC和AOP
Spring的IOC和AOP
64 0