散播应用中多处的功能被称为横切关注点
横切关注点从概念上讲是与业务分离的,但往往会直接嵌入到业务中
多个类使用到相同的功能。最常见到的就是继承或委托
为什么不使用继承
如果整个应用都使用相同的基类,会导致脆弱的对象体系
为什么不使用委托
可能需要对委托对象进行复杂的调用
把横切关注点与业务分离是面向切面编程(AOP)要解决的重要问题
AOP 已经形成了自己的术语,常见的有 1. 通知 2. 切点 3. 连接点
切面要完成的工作被称为通知,它定义了切面要做什么,何时使用
何时使用
前置通知 Before
后置通知 After
返回通知 After-returning
异常通知 After-throwing
环绕通知 Around
触发通知的时机叫做连接点
把切面应用到目标对象并创建新的代理对象的过程。
织入可以在多个时期发生:
编译期
类加载期
运行期
基于代理的经典AOP
纯POJO切面
@AspectJ注解驱动切面
注入式 AspectJ切面,适用Spring各种版本
因为Spring 基于动态代理实现的AOP
Spring 不支持对字段和构造器连接点
AspectJ 和 JBoss 除了方法切点,还支持字段和构造器
arg()
限制连接点的匹配参数为为指定类型的执行方法
@args()
限制连接点匹配参数由指定注解标注的执行方法
execution()
用于匹配是连接点的执行方法
this()
限制连接点匹配 AOP代理的bean引用为指定类型的类
target
限制连接点匹配目标对象为指定类型的类
@target()
限制连接点匹配特定的执行对象,这些对象对应的类要有指定类型的注解
within()
限制连接点匹配指定的类型
@within()
限制连接点匹配注解所标注的类型
@annotation
限定匹配 带有指定注解的连接点
bean()
限定beanId
当在Spring 中使用其他指示器时,会抛出异常
只有 execution 指示器是实际执行匹配的,其他都是限制匹配的