spring aop

aop相关support类介绍 https://www.cnblogs.com/dream-to-pku/p/5735293.html

advisor(切面) = advice + pointcut
MethodInceptor extends Interceptor extends Advice

  1. 声明一个advisor,比较常用AbstractPointcutAdvisor,可以参考aop.support包里各种advisor
    1. 实例化pointcut
    2. 实例化 advice 如MethodInceptor
  2. 把advisor放到配置类中

pointcut

常见的可以参考下方pointDemo以及更下面的切点类型介绍
通常pointcut的实现类中都有matches方法

  1. boolean matches(Method m, Class<?> targetClass)
    • 用于匹配方法,和MethodMatcher 相关
  2. boolean matches(Class<?> clazz);
    • 用于匹配类,和ClassFilter 相关
public interface Pointcut {
    //返回一个ClassFilter
    ClassFilter getClassFilter();

    //返回一个MethodMatcher
    MethodMatcher getMethodMatcher();


    //TruePointCut,对应任何的方法都是匹配(总是匹配)
    Pointcut TRUE = TruePointcut.INSTANCE;
}
public interface MethodInterceptor extends Interceptor {

    @Nullable
    Object invoke(@Nonnull MethodInvocation invocation) throws Throwable;

}

Advisor Demo

可以参考DefaultBeanFactoryPointcutAdvisor extends AbstractBeanFactoryPointcutAdvisor
或者参考MethodSecurityMetadataSourceAdvisor

public class MethodSecurityMetadataSourceAdvisor extends AbstractPointcutAdvisor implements BeanFactoryAware {
    private transient MethodInterceptor interceptor;

    private final Pointcut pointcut = new MethodSecurityMetadataSourcePointcut();
}

Pointcut demo

  @Test
    public void testAspectJExpressionPointCut() throws NoSuchMethodException {
        AspectJExpressionPointcut expressionPointcut = new AspectJExpressionPointcut();
        //设置aspectj表达式,这个比较常用的表达式
        expressionPointcut.setExpression("execution(* cn.tedu.demo.service.UserService.addUser(..))");
        //匹配类
        boolean b = expressionPointcut.matches(UserService.class);
        //直接调用matches匹配方法
        boolean a = expressionPointcut.matches(UserService.class.getDeclaredMethod("addUser", User.class), UserService.class);
        System.out.println(a+"--->"+b);
    }
  @Test
    public void testAnnotationMatchingPointcut() throws NoSuchMethodException {
        //第一个参数是注解,第二参数表示是否在接口和父类的查找该注解
        AnnotationMatchingPointcut pointcut = new AnnotationMatchingPointcut(Transactional.class, false);
        //匹配方法上是否有@Transactional注解
        boolean a = pointcut.getMethodMatcher().matches(UserService.class.getDeclaredMethod("addUser", User.class), UserService.class);
        //匹配类上是否有@Transactional注解
        boolean b = pointcut.getClassFilter().matches(UserService.class);
        System.out.println(a+"--->"+b);
    }

Advice Demo

  • 可以参考下面的增强类型,应该就会MethodInterceptor和ThrowsAdvice就行了

AspectJ Demo

@Aspect
public class AnnotationAdvisor {
  @Before("execution(* jiang.service.impl.UserServiceImpl.*(..))")
  public void before() {
    System.out.println("=======方法执行前========");
  }

  @After("execution(* jiang.service.impl.UserServiceImpl.*(..))")
  public void after() {
    System.out.println("=======注解方法执行后后后后========");
  }

  @Around("execution(* jiang.service.impl.UserServiceImpl.*(..))")
  public void around(ProceedingJoinPoint joinPoint) throws Throwable {
    System.out.println("======环绕前=====");

    Signature signature = joinPoint.getSignature();
    System.out.println(signature);
    // 调用了这个,才会执行被代理对象相应的方法
    joinPoint.proceed();
    System.out.println("======环绕后=======");

  }
}

创建增强类

Spring使用增强类定义横切逻辑,同时由于Spring只支持方法连接点,增强还包括了在方法的哪一点加入横切码的方位信息,所以增强既包含横向逻辑,又包含部分连接点的信息。
1.增强类型
AOP联盟为增强定义了org.aopalliance.aop.Advice接口,Spring支持5种类型的增强,安装增强在目标类方法的连接点设置
①:前置增强:org.springframework.aop.BeforeAdvice代表前置增强,因为Spring只支持方法级的增强,所以MethodBeforeAdvice是目前可用的前置增强,表示杂目标方法执行前实施增强而。
②:后置增强:org.springframework.aop.AfterReturningAdvice代表后增强,表示在目标方法执行后实施增强
③:环绕增强:org.aopalliance.intercept.MethodInterceptor代表环绕增强,表示在目标方法前后执行增强
④:异常抛出增强:org.springframework.aop.ThrowsAdvice代表抛出异常增强,表示在目标方法抛出异常后实施增强(事务)
⑤:引介增强:org.springframework.aop.IntroductionInterceptor代表引介增强,表示在目标类中添加一些新的方法和属性

切点

静态方法切点:

org.springframework.aop.support.StaticMethodMatcerPointcut是静态方法切点的抽象基类,默认情况下它匹配所有的类。StaticMethodMatcherPointcut包括两个主要的子类
分别是NameMatchMethodPointcut和AbstractRegexpMethodPointcut,前者提供简单字符串匹配方法前面,而后者使用正则表达式匹配方法前面。

注解切点:

org.springframework.aop.support.annotation.AnnotationMatchingPointcut实现类表示注解切点。

表达式切点:

org.springframework.aop.support.ExpressionPointcut接口主要是为了支持AspectJ切点表达式语法而定义的接口

流程切点:

org.springframework.aop.support.ControlFlowPointcut实现类表示控制流程切点。ControlFlowPointcut是一种特殊的切点,它根据程序执行堆栈的信息查看目标方法是否由某一个方法直接或间接发起调用,以此判断是否为匹配的连接点

复合切点:

org.springframework.aop.support.ComposablePointcut实现类是为了创建多个切点而提供的方便操作类,它所有的方法都返回ComposablePointcut类,这样就可以使用链接表达式对切点进行操作

切面类型

一般切面:Advisor代表一般切面,仅包含一个Advice,他本身就是一个简单的切面,只不过他代表的横切连接点是所有目标类的所有方法。
切点切面:PointcutAdvisor具有切点的切面,包含Advice和Pointcut两个类,这样就可以通过类,方法名以及方法方位等信息灵活地定义切面的连接点
引介切面:IntroductionAdvisor引介切面,引介切面是对应引介增强的特殊切面,它应用于类层面上,使用ClassFilter进行定义。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容

  • **** AOP 面向切面编程 底层原理 代理!!! 今天AOP课程1、 Spring 传统 AOP2、 Spri...
    luweicheng24阅读 1,369评论 0 1
  • 什么是AOP 面向切面编程(AOP)和面向对象编程(OOP)类似,也是一种编程模式。Spring AOP 是基于 ...
    小波同学阅读 303评论 0 0
  • title: spring——AOP与事务.mddate: 2020-07-14 13:10:16categori...
    EllisonPei阅读 1,414评论 0 1
  • Spring AOP 代理 1. Spring AOP 增强类型 AOP 联盟为通知 Advice 定义了 org...
    希希里之海阅读 291评论 0 1
  • 一AOP相关概念Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,...
    知识学者阅读 762评论 0 1