【Spring应用级学习】AOP
为什么要用AOP
AOP是一种代码复用的方式,通过使用继承的方式也可以实现代码复用,那么为什么要用AOP呢?
AOP 是代码级别的代码复用
继承只可以停留在复用方法和属性,但是 AOP 可以是代码级别的复用,即使没有继承关系,也可以使用它。
AOP 是用反射实现
AOP 的 Java 底层基础是反射(reflection),通过 Proxy 和 InvocationHandler 实现动态代理,来进行代码的织入
Java 动态代理依赖于接口(Proxy.getProxy() 必须传入接口),CGLib 可以依赖于类进行代理。
AOP中的一些行话
在了解行话之前,先要知道 AOP 的关键是对复用的代码进行织入,实现代码的复用。那么就有以下几个问题:
- 织入的代码在哪里
- 织入的位置在哪里
- 织入的时间在哪里
增强(Advice)
增强就是需要织入的复用代码。增强还包括织入的时间,通过它的类名字来反映织入的时间:在方法执行前、在方法执行后、在异常抛出后进行织入。
// 在方法执行前进行织入
MethodBeforeAdvice
// 在方法执行完后进行织入
MethodAfterAdvice
Spring 的织入时间仅仅在方法的层面上,即在类加载前,类加载后,类初始化前,类初始化后进行织入 Spring 是不支持的
连接点
连接点就是那些可以织入代码的位置,但是并不意味着这些位置统统需要织入复用代码。连接点有两点组成
- 执行点:即需要织入的那个方法
- 方位:需要织入的时间
切入点
切入点就像 SQL 语句中的查询语句,执行点为表中的数据,通过在切入点中设定规则,来将执行点找到。
// 用于设定方法匹配规则
public boolean matches(Method method, Class clazz)
// 用于设定类匹配规则
public ClassFilter getClassFilter()
切入点匹配方法到时候有两种匹配方式:静态匹配和动态匹配
切面
切点加上增强就是切面,切面是一个拥有所有织入信息的类,Proxy 通过它可以完成织入。
方法的匹配
静态匹配指的是在匹配方法的时候,通过方法的签名进行匹配,而且仅匹配一次;动态匹配会在运行期间匹配传入参数的值,因此每次调用方法都要进行屁屁额