Spring AOP简单总结
面向切面编程(Aspect Oriented Programming),是OOP的补充及延续。Spring AOP是在Spring IOC基础上所做的扩展,把程序分解为方面或关注点(剥离出业务)。
AOP实现了源码组成无关性,通过预编译方式(AspectJ)和运行期动态代理模式(Spring AOP/JBoss)实现。
一、应用范围
- 持久化(Persistence)
- 事务管理(Transaction Management)
- 安全(Security)
- 日志(Logging)、跟踪(Tracing)、优化(Profiling)、监控(Monitoring)
- 调试(Debugging)
- 认证(Authentication)
- 错误/异常处理(Error/Exception handing)
- 性能优化(Performance optimization)
- 资源池(Resource pooling)
- 懒加载(Lazy loading)
- 同步(Synchronization)
二、核心概念
-
Joinpoint(连接点):程序执行过程中的特定点,用于指定在程序的什么地方通过AOP加入额外的逻辑。如方法的调用、方法执行的过程、类的初始化、对象的实例化等。
-
Advice(通知):连接点出运行的代码。分为前置通知、后置通知、环绕通知、异常通知。
-
Pointcut(切入点):用于定义某个通知何时执行的一组连接点。如一个典型的连接点是方法的调用,而一个典型的切入点就是对某个类的所有方法调用的集合。
-
Aspect(方面):通知和切入点的组合。这个组合定义了一段程序中应该包括的逻辑以及何时执行改逻辑。
-
Weaving(织入):将方面真正加入程序代码的过程。根据AOP方案的不同可分为编译时和运行时。
-
Target Object(目标对象):接受AOP操作修改的对象。
-
Introduction(引入):改变目标对象的操作。如给对象加入新的方法或字段、让它实现某个接口。
-
AOP Proxy(AOP代理):将通知应用到目标对象后创建的对象。对于客户端来说,目标对象和代理对象是一样的。
-
Advisor(顾问):在Spring中一个Advisor就是一个aspect的完整的模块化标识。一般的,一个Advisor包括通知和切入点,是通知和切入点的配置器。
三、AOP原理—代理
-
静态代理
代理对象与被代理对象都必须实现同一个接口。在代理对象中可以实现日志记录等相关服务,并在需要的时候再呼叫被代理的对象;被代理对象中可以只保留业务逻辑。
-
动态代理
在程序运行时,运用反射机制动态创建。
四、通知的类型
- Before advice(前置通知)
- After returning advice(后置通知)
- Around advice(环绕通知)、
- Throws advice(抛出通知/异常通知)
五、代理实现方式
-
Proxy Factory Bean
创建AOP Proxy的基本方法,结合IOC容器一起使用。通知和切入点都可以被IOC管理起来通过使用Java的动态代理或者CGLIB,能够代理接口或class。
-
自动代理
BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator