1.什么是AOP
AOP(Aspect Oriented Programming)是一种面向切面的编程思想。面向切面编程是将程序抽象成各个切面,即解剖对象的内部,将那些影响了多个类的公共行为抽取到一个可重用模块里,减少系统的重复代码,降低模块间的耦合度,增强代码的可操作性和可维护性。
AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理、增强处理。
> AOP带来的好处:让我们可以 “专心做事”
2.Spring AOP代理机制
pring 在运行期会为目标对象生成一个动态代理对象,并在代理对象中实现对目标对象的增强。Spring AOP 的底层是通过以下 2 种动态代理机制,为目标对象(Target Bean)执行横向织入的。
- **JDK动态代理:**Spring AOP 默认的动态代理方式,若目标对象实现了若干接口,Spring 使用 JDK 的 java.lang.reflect.Proxy 类进行代理。
- **CGLIB动态代理:**若目标对象没有实现任何接口,Spring 则使用 CGLIB 库生成目标对象的子类,以实现对目标对象的代理。
> 注意:由于被标记为 final 的方法是无法进行覆盖的,因此这类方法不管是通过 JDK 动态代理机制还是 CGLIB 动态代理机制都是无法完成代理的。
3.核心概念
- Joinpoint(连接点)**:指那些被拦截到的点(程序执行过程中明确的点,如方法的调用,或者异常的抛出),在 Spring 中,可以被动态代理拦截目标类的方法。
- **Pointcut(切入点)**:多个连接点的集合,定义了通知应该应用到哪些连接点。
- **Advice(通知)**: 指拦截到 Joinpoint 之后要做的事情,即对切入点增强的内容。
- **Target(目标)**: 指代理的目标对象。
- **Weaving(植入)**: 指把增强代码应用到目标上,生成代理对象的过程。
- **Proxy(代理)** :指生成的代理对象(将通知应用到目标对象后创建的对象)。
- **Aspect(切面)**:切入点和通知的结合。
4.通知分类:
1)前置通知org.springframework.aop.MethodBeforeAdvice在目标方法执行前实施增强。
2)后置通知org.springframework.aop.AfterAdvice在目标方法执行后实施增强。
3)后置返回通知org.springframework.aop.AfterReturningAdvice在目标方法执行完成,并返回一个返回值后实施增强。
4)环绕通知org.aopalliance.intercept.MethodInterceptor在目标方法执行前后实施增强。
5)异常通知org.springframework.aop.ThrowsAdvice在方法抛出异常后实施增强。
6)引入通知org.springframework.aop.IntroductnInterceptor在目标类中添加一些新的方法和属性。