spring-aop通知类型

294 阅读1分钟

通知配置语法

<aop:通知类型 method=“切面类中的方法名” pointcut="切点表达式"/>

通知类型

前置通知:

aop:before

@Before

后置通知

aop:after-returning

@AfterReturning

环绕通知

aop:around

@Around

异常抛出通知

aop:throwing

@AfterThrowing

最终通知

aop:after

@After

xml环绕通知示例:

package com.itheima.aop;

import org.aspectj.lang.ProceedingJoinPoint;

public class MyAspect {
  void before(){
    System.out.println("前置增强");
  }

  void after(){
    System.out.println("最终通知");
  }

  public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    System.out.println("环绕增强前");
    Object result = proceedingJoinPoint.proceed();
    System.out.println("环绕增强后");
    return result;
  }
}

注解方式aop:

切面类:

package com.itheima.anno;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect //标识MyAspect是一个切面类
@Component("myAspect")
public class MyAspect {
  @Before("execution(* com.itheima.anno.Target.*(..))")
  void before(){
    System.out.println("前置增强");
  }

  void after(){
    System.out.println("最终增强");
  }

  public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    System.out.println("环绕增强前");
    Object result = proceedingJoinPoint.proceed();
    System.out.println("环绕增强后");
    return result;
  }
}

目标类:

package com.itheima.anno;

public interface Target {
  void save();
}




package com.itheima.anno;

import org.springframework.stereotype.Component;

@Component("target")
public class TargetImpl implements Target {
  public void save(){
    System.out.println("----save---");
  }

}

applicationContext-anno.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 组件扫描-->
    <context:component-scan base-package="com.itheima.anno"/>
    <!-- aop 自动代理-->
    <aop:aspectj-autoproxy/>
</beans>