-
AOP是一种编程思想,面向切面编程
-
使用动态代理机制
- Cglib
- JDK
-
概念
- 切面(Aspect):在AOP中切面指的就是“切面类”切面类中管理着增强的公共行为代码(通知)和切入方式(切点)。由通知(Aovice)和切点(Pointcut)组成。
- 连接点(Join point):在Spring AOP中,一个连接点总是代表一个方法的执行,即需要增强的方法。
- 通知(Aovice):在切面的某个特定的连接点上执行的动作。Spring在内以拦截器做通知模型的,并维护着一个以连接点为中心的拦截器链。通知类型:
- 前面(Before)
- 后面(After)
- 异常(afterThrowing)
- 返回值(afterReturning)
- 环绕(包含前后Around)
- 目标对象(Target):目标对象指将要被增强的对象。即包含主业务逻辑的类的对象。
- 切点(Pointcut):匹配连接点的断言。通知和切点表达式相关联,并在满足这个切点的连接点上运行(例如,当执行某个特定名称的方法时)。Spring默认使用AspectJ切点语义。
- 顾问(Advisor):顾问是Advice的一种包装体现,Advisor是Pointcut以及Advice的一个结合,用来管理Advice和Pointcut。
- 织入(Weaving):将通知切入连接点的过程叫织入
- 引入(Introductions):可以将其他接口和实现动态引入到targetClass中
-
切点(Pointcut):匹配连接点的断言。具体定位的连接点。
-
通知(Aovice):在切面的某个特定的连接点上执行的动作。
-
顾问(Advisor):是Advice的一种包装体现,Advisor是包括Pointcut和Advice的一个结合,用来管理Advice和Pointcut,是将Advice注入程序中Pointcut位置的代码。
- 原生API实现AOP
- 自定义方法实现AOP
- 注解实现AOP
- 在真正实例化Bean之前会对切面类进行解析;
- 判断是否解析过,如果解析过直接从缓存中取;
- 如果没有解析过,遍历所有的BeanNames,解析被@Aspect注解标记的类;
- 提取这些类中的所有Advice通知方法封装成Advisor;
- 将提取出的Advisors放入缓存;
- 在初始化Bean后会创建代理;
- 如果之前在循环依赖中创建过动态代理,在初始化后则不需要再次创建动态代理;
- 如果之前在循环依赖没有创建过动态代理,就找到当前Bean匹配的advisor(根据切点规则筛选),如果没有找到符合的advisor就返回原生Bean;
- 创建动态代理
- 如果设置了 不会进if,说明强制使用cglib
- 检查当前Bean是否有接口,如果有则使用JDK代理,如果没有则使用CGLIB代理
- 调用方法会调用动态代理类的invoke方法;
- 将advice全部转会为拦截器通过责任链模式调用;



