AOP
- 面向切面的编程技术,允许程序模块化横向切割关注点或横向切割责任划分。
应用场景
- 日志,事务,异常。
Aspect
- AOP的核心就是切面,它将多个类封装成可重用的模块,该模块提供一组API提供横切功能。
- 比如,一个日志模块可以被称作日志的AOP切面。根据需求的不同,一个应用程序可以有若干切面。在Spring AOP中,切面通过带有@Aspect注解的类实现。
关注点
- 应用中模块的行为
横切关注点
- 将相同关注点横向切割(比如日志,事务)
连接点
- 应用程序中,插入切面的位置
通知
- 通知某个方法执行前或执行后要做的动作,实际上是要通过AOP触发的代码段
- before:前置通知
- after:后置通知
- after-returning:方法成功完成后通知
- after-throwing:方法异常时通知
- around:环绕通知(方法执行前、后)
切点
- 切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。也就是切面通知的入口。
- @PointCut
引入
- 在类中增加新的功能,我的理解是代理的继承。
- @DeclareParents @EnableAspectAutoProxy
实现
- 动态代理
织入
- 静态织入:编译器或加载期织入 Aspectj
- 动态织入:运行时织入 SpringAOP 可以指定jdk代理,cglib代理
实现
- 基于注解
- 基于xml
动态代理
JDK Proxy:面向接口,创建代理比cglib快。
CGLib Proxy:通过字节码底层继承实现,创建慢,运行速度比jdk proxy快
高版本自动选择代理方式,如果类没有实现接口,会自动调用cglib接口。