什么是AOP
- AOP Aspect Oriented Programing 面向切面编程
- AOP 采用横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存)
- Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期间通过代理方式向目标类织入增强代码
相关术语
- JoinPoint(连接点)是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点
- Pointcut(切入点)是指我们要对哪些joinpoint进行拦截的定义
- Advice(通知/增强)所谓通知是指拦截到Joinpoint之后所要做的事情就是通知,分为前置通知,后置通知,异常通知,最终通知,环绕通知
- Introduction(引介)是指一种特殊的通知在不修改类代码的前提下,Introduction可以在运行期间为类动态地添加一些方法或Field
- Target(目标)代理的目标对象
- Weaving (织入)是指把增强代码应用到目标上,生成代理对象的过程,spring采用动态代理织入,而AspectJ采用编译期织入和类装在期织入
- Proxy(代理):是指生成的代理对象
- Aspect(切面)是切入点和通知(引介)的结合
JDK动态代理
使用CGLIB生成代理
Spring AOP切面类型
Advisor切面
PointCutAdvisor 切点切面
proxyTargetClass
- true 目标对象实现了接口 使用CGLIB代理机制
- true 目标对象没有接口(只有实现类) 使用CGLIB代理机制
- false 目标对象实现了接口 使用JDK动态代理机制(代理所有实现了的接口)
- false 目标对象没有接口(只有实现类) 使用CGLIB代理机制
自动创建代理
BeanNameAutoProxyCreatoe 根据Bean名称创建代理
DefaultAdvisorAutoProxyCreator