AOP
面向切面编程,基于动态代理和职责链模式,底层实现有 jdk, cglib 两种方式, 把系统级功能从应用逻辑中抽离出来,封装在通知/增强( Advice )里,例如权限控制,申明式事务
AOP 的使用
1.注解开启 aop
@EnableAspectJAutoProxy
动态注册 aop 入口类 AnnotationAwareAspectJAutoProxyCreator
2.扫描切面类
@ComponentScan(basePackages = {"com.xiangxue"},
includeFilters = {
@ComponentScan.Filter(
type=FilterType.ANNOTATION,classes=Aspect.class)})
3.编写切面
定义 Pointcut(切点) 和 Advice (通知/增强)
AOP 的实现原理
Spring AOP 是依赖 JDK 动态代理 和 CGLIB 代理 实现的
JDK 动态代理 proxyTargetClass = false
实现 InvocationHandler,代理对象必须是某个接口的实现,在运行期间创建一个接口的实现类
CGLIB 代理
实现 MethodInterceptor,在运行期间生成目标类扩展的子类
Target (目标对象)
被代理对象,被通知 (Advice) 对象
Proxy (代理)
将通知织入目标对象之后,形成代理对象
Joinpoint (连接点)
目标对象中,所有可以增强的方法
Pointcut (切点)
切点表达式匹配上的连接点
Weaving (织入)
将通知应用到切点的过程
Advice 通知/增强, 在特定 Joinpoint (连接点) 上执行的方法,有5种类型
before 前置通知, 方法之前执行
after-returning 后置通知, 方法正常完成后执行
after-throwing 异常通知, 方法抛出异常时执行
after 最终通知, 方法完成时执行
around 环绕通知, 方法调用前后
Introduction (引入), 添加额外的方法或者属性到被通知的类
@Aspect 切面, 由 Advice 通知 和 Pointcut 切点 组成
advisor (通知/增强器), 由 Advice 通知 和 Pointcut 切点组成
切面 (Aspect) 里的通知 一般的 bean 就行,通知器(advisor) 里的通知必须实现 Advice 接口
切面 (Aspect) 用于日志,缓存,通知/增强器 (advisor) 用于事务管理