Spring AOP核心原理与实战指南
一.AOP概述
AOP为Aspect Oriented Programming的缩写,是面向切面编程,是OOP的延续,是Java中的一个重要内容.利用AOP可以对业务逻辑和非业务逻辑进行隔离,从而使得各个部分之间的耦合度降低,提高代码重用性.
核心原理:使用动态代理(代理对象)的方式在执行方法前后或者出现异常时加入相关逻辑,我们只需配置调用时间
使用案例:事务处理,权限判断,日志打印等
1.连接点:类中可以被增强的方法,简单点来说就是可以加入非业务逻辑的方法
2.切入点:类中有很多方法可以被增强,但实际只有个别方法会被增强,那么被增强的方法就称为切入点
3.通知:通知是指一个切面在特定的连接点要做的事情
4.目标:代理的目标对象(连接点,切入点所在的类)
5.代理:向目标对象应用通知时所创建的代理对象
二.Spring框架对AOP的实现
AOP是Java中的一种重要的编程思想,很多框架都对AOP进行了实现,Spring就是其中之一,可以完成面向切面编程
AspectJ是一个基于JAVA语言的AOP框架,支持注解式开发,所以Spring将AspectJ引入到了自己的框架中
要在Spring框架中使用AspectJ框架只需要导入相关jar
<dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.2.2.RELEASE</version>
</dependency>
然后在Spring框架中的配置文件中启动AspectJ支持
<aop:aspectj-autoproxy />
三.通知类型代码示例
*任意返回值 方法地址(参数 ..代表任意参数)
1.前置通知(@Before):在目标方法之前执行
@Before("execution(* springpro.service.BookService.addBook())")public void savelog(){System.out.println("保存日志");}
2.后置通知(@After):在目标方法之后执行,即使方法出现异常也会执行
@After("execution(* springpro.service.BookService.addBook())")public void savelog1(){System.out.println("保存日志");}
3.返回通知(@AfterReturning):在方法指向完成之后执行,方法出现异常则不执行
@AfterReturning("execution(* springpro.service.BookService.addBook())")public void savelog3(){System.out.println("保存日志");}
4.异常通知(@AfterThrowing):在方法出现异常时执行
@AfterThrowing(value = "execution(*springpro.service.BookService.addBook())",throwing = "e")public void commonException(Throwable e){System.out.println(e.getMessage());}
这里需要注意的是value用于定义切点,throwing用于将目标方法抛出的异常绑定到通知方法的参数,这里参数使用Throwable是因为它是Exception和Error的超类,提升代码扩展性
5.环绕通知(@Around):可以同时执行其他四个通知
@Around("execution(* springpro.service.BookService.addBook())")public void around(ProceedingJoinPoint joinPoint){try {System.out.println("前置通知"); Object[] args = joinPoint.getArgs();//获取目标方法的参数joinPoint.proceed();//调用我们自己的目标方法System.out.println("返回通知");} catch (Throwable e) {System.out.println("异常通知");throw new RuntimeException(e);}System.out.println("后置通知");}