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