可以把AOP看成是工厂机器织布,在一块白布上绣花纹。
先说几个概念:
①JoinPoint
:在Java的世界里,我把它理解成一个一个的方法,百分之80的代码都是在方法中执行的,当然还有百分之20的类似在代码块中的代码。当然这百分之80的就可以满足大多数需求了。就相当于织布中的绣花纹的地方,你要绣花纹的地方就是JoinPoint。
②PointCut
:我把它理解成JoinPoint的定义,意思是PointCut可以定义一组JoinPoint。比如织布的样图上标注的需要绣花纹的地方,然后大家织布的时候都会在那个地方绣花纹。
③Advice
:这是你要加入的逻辑之外的代码,比如日志,权限等。在织布的世界里,这个就是花纹,当然花纹的绣法有很多种,比如你要绣在前面,修在后面,或者绣一圈。
④Aspect/Advisor
:简单的理解就是,aspect/advisor = pointCut + advice。织入代码的地方+要织入的代码就等于绣花纹的地方+要绣的花纹的样式。
以上是主要的概念,还有一些比较次要的概念:
⑤Target
:目标对象,就是你要添加功能的对象,比如织布里的那块白布。
⑥Weaving
:织入器。你要绣花纹总要工具吧,比如织布机。一般使用ProxyFactory
。
Spring的aop是使用Spring Aop
实现的,当然还有功能更全面的AspectJ
。使用的时候要明白几个东西:
①PointCut
由ClassFilter
和MethodMatcher
组成,一个过滤类,一个匹配方法。
package org.springframework.aop;
import java.lang.reflect.Method;
import org.springframework.lang.Nullable;
public interface MethodMatcher {
MethodMatcher TRUE = TrueMethodMatcher.INSTANCE;
boolean matches(Method var1, @Nullable Class<?> var2);
boolean isRuntime();
boolean matches(Method var1, @Nullable Class<?> var2, Object... var3);
}
这里要说一点,MethodMatcher
里有两个重载的方法,这两个方法被一个isRuntime()
分割,重载的方法唯一的区别就是是否匹配方法的参数。根据这个区别,可以把MethodMatcher分别静态MethodMatcher和动态MethodMatcher,根据PointCut包含的MethodMatcher,又可以把PointCut分为静态PointCut和动态PointCut。
②Advice分为很多种类,比如BeforeAdvice
,AfterReturningAdvice
,ThrowsAdvice
等,AroundAdvice
使用
org.aopalliance.intercept.MethodInterceptor
来实现。
③Aop使用代理模式来实现,比如在织入的时候,即ProxyFactory
。ProxyFactory在创建代理的时候会根据Target
进行判断,如果目标类有实现接口,则会使用jdk的动态代理
来实现,如果没有,则使用cglib
来实现。当然你也可以指定实现了接口的类使用cglib来实现,设置ProxyFactory
对象的proxyTargetClass
和optimize
属性为true
即可。
④除了方法级别的advice,还有类级别的advice,就是Introduction
,它可以为一个类增加新的功能(方法)。称之为引入。可以使用@DeclareParents
。道理是一样的。