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。道理是一样的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值