AOP(Aspect-Oriented Programming):⾯向切⾯编程。对多个业务代码横切来实现统⼀的业务管理,⽽不⽤侵⼊业务代码本身。这样⾯向切⾯的编程思想就是AOP。
使⽤场景:⽇志记录,事务管理,性能统计,安全控制,异常处理等
优点:代码解耦,统⼀业务功能对具体业务⽆侵⼊性,这样可扩展性更好,灵活性更⾼
SpringAOP是采取动态代理的⽅式,具体是基于JDK和CGLIB两种:
- JDK动态代理:需要被代理类实现接⼝,使⽤ InvocationHandler 和 Proxy 动态的⽣成代理类
- CGLIB动态代理:需要被代理类能被继承,不能被final修饰。使⽤ MethodInterceptor 来对⽅法拦截。CGLIB底层是基于ASM字节码框架,在运⾏时动态⽣成代理类
SpringAOP如何使⽤:@Aspect定义切⾯,并注册到容器中,使⽤@Pointcut定义好切点⽅法后,可以对⽬标⽅法进⾏拦截:
- 前置通知 :使⽤@Before:通知⽅法会在⽬标⽅法调⽤之前执⾏。
- 后置通知 :使⽤@After:通知⽅法会在⽬标⽅法返回或者抛出异常后调⽤。
- 返回之后通知 :使⽤@AfterReturning:通知⽅法会在⽬标⽅法返回后调⽤。
- 抛异常后通知 :使⽤@AfterThrowing:通知⽅法会在⽬标⽅法抛出异常后调⽤。
- 环绕通知 :使⽤@Around:通知包裹了被通知的⽅法,在被通知的⽅法通知之前和调⽤之后执⾏⾃定义的⾏为。