导航:更多的spring注解标签点击这里
声明了切面类我们还需要定义切面的内容面向切面编程是spring的一个重要思想,也是精华之一
@Aspect
这是一个切面的注解,声明是一个额外的面向切面的功能
用法示例:
@Aspect
public class AspectTest { }
当然,别忘了添加maven依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.4</version>
</dependency>
声明了切面类,我们还需要有具体的切面内容,springs提供了3个注解,如下所示
@After//后置建言(advice),在原方法前执行。
@Before//前置建言(advice),在原方法后执行。
@Around//环绕建言(advice),在原方法执行前执行,在原方法执行后再执行(@Around可以实现其他两种advice)
@Pointcut//即定义拦截规则,确定有哪些方法会被切入
使用示例
@Aspect
@Component
public class AspectTest {
@Before("d()")
public void a(JoinPoint joinPoint){
System.out.println("前置");
}
@After("d()")
public void b(JoinPoint joinPoint){
System.out.println("后置");
}
@Around("d()")
public Object c(ProceedingJoinPoint pjp)throws Throwable{
System.out.println("环绕1");
Object obj=pjp.proceed();
System.out.println("环绕2");
return obj;
}
@Pointcut("@annotation(org.yly.minbox.boot.Test.Log)")//切入点,这里采用添加了注解来切入
public void d(){}
}
@RestController
public class Web {
@RequestMapping("a123")
@Log
public String aaa(String a){
System.out.println("执行的方法体");
return "111111";
}
}
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
}
效果示例:
@AfterThrowing//异常环绕
AfterThrowing是一个增强环绕,当出现异常的时候走次方法,
使用示例
@AfterThrowing(throwing="ex",pointcut="d()")
public void AfterThrowing(Throwable ex){
System.out.println("出现异常"+ex.getMessage());
}
我们可以修改一下刚才那个接口,增加一个异常
执行效果
@AfterReturning//异常环绕
AfterReturning也是后置环绕,但是他和@After不一样的是可以获取主方法体的返回值
使用示例:
@AfterReturning(returning="returnValue",pointcut="d()")
public void AfterRun(JoinPoint joinPoint,Object returnValue){
System.out.println("有返回值的后置环绕="+returnValue);
}
效果:
@Order//排序
环绕排序,当一个方法同时满足多个同等环绕设置时优先走哪个方法
示例
注意(1)
启动环绕功能需要告诉spring,如果是mvc,xml配置如下
<aop:aspectj-autoproxy proxy-target-class="true"/>
如果是boot,需要在启动文件加上@EnableAspectJAutoProxy,如下图所示
注意(2)
Around环绕与其他的不同,前置环绕与后置环绕都是走完自动走下一步,但是Around他需要我们手动执行下一步,通过调用参数ProceedingJoinPoint 的proceed方法,否则会跳过方法体,如下所示
如果不调用proceed方法会导致前置环绕与方法体本身都无法执行
proceed方法用来区分方法执行前后环绕,proceed调用前的代码为方法执行前置环绕,proceed后的代码为后置环绕
After,Before,Around,AfterReturning的顺序
Around→Before→方法体→Around→After→AfterReturning