AOP相关概念漫谈

可以把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。使用的时候要明白几个东西:
PointCutClassFilterMethodMatcher组成,一个过滤类,一个匹配方法。

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分为很多种类,比如BeforeAdviceAfterReturningAdviceThrowsAdvice等,AroundAdvice使用

org.aopalliance.intercept.MethodInterceptor

来实现。
③Aop使用代理模式来实现,比如在织入的时候,即ProxyFactory。ProxyFactory在创建代理的时候会根据Target进行判断,如果目标类有实现接口,则会使用jdk的动态代理来实现,如果没有,则使用cglib来实现。当然你也可以指定实现了接口的类使用cglib来实现,设置ProxyFactory对象的proxyTargetClassoptimize属性为true即可。
④除了方法级别的advice,还有类级别的advice,就是Introduction,它可以为一个类增加新的功能(方法)。称之为引入。可以使用@DeclareParents。道理是一样的。

猜你喜欢

转载自blog.csdn.net/a_842297171/article/details/80914907