详解SpringBootAOP(Aspect注解⽅式)
常⽤⽤于实现拦截的有:Filter、HandlerInterceptor、MethodInterceptor
第⼀种Filter属于Servlet提供的,后两者是spring提供的,HandlerInterceptor属于Spring MVC项⽬提供的,⽤来拦截请求,在MethodInterceptor之前执⾏。
实现⼀个HandlerInterceptor可以实现接⼝HandlerInterceptor,也可以继承HandlerInterceptorAdapter类,两种⽅法⼀样。这个不在本⽂范围,具体使⽤之前已经写过SpringBoot的(SpringMVC的使⽤⼀样,区别只是配置)
MethodInterceptor是AOP项⽬中的,它拦截的⽬标是⽅法,即使不是Controller中的⽅法。
实现MethodInterceptor⼤致也分为两种,⼀种是实现MethodInterceptor接⼝,另⼀种利⽤Aspect的注解或配置。
关于实现MethodInterceptor接⼝的这种⽅法,还需要在配置⽂件中做配置,在SpringMVC中使⽤还可以,在SpringBoot中使⽤起来似乎没有那么⽅便。
本⽂主要还是说Aspect注解⽅式,个⼈觉得这种⽅法才⽐较灵活,与配置与⼯程整个代码都没有耦合(你添加⼀个类,做⼏个注解就可以⽤
了,⽆需在其他地⽅再做什么),更易应⽤。
⾸先为你的SpringBoot项⽬添加maven依赖,让其⽀持aop(其实就是⾃动引⼊aop需要的⼀些jar)
在l中添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
然后创建Aspect测试类:
package com.shanhy.sboot.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import annotation.Order;
import org.springframework.stereotype.Component;
@Aspect // FOR AOP
@Order(-99) // 控制多个Aspect的执⾏顺序,越⼩越先执⾏
@Component
spring mvc和boot区别public class TestAspect {
@Before("@annotation(test)")// 拦截被TestAnnotation注解的⽅法;如果你需要拦截指定package指定规则名称的⽅法,可以使⽤表达式execution(...),具体百度⼀下资料⼀⼤堆 public void beforeTest(JoinPoint point, TestAnnotation test) throws Throwable {
System.out.println("beforeTest:" + test.name());
}
@After("@annotation(test)")
public void afterTest(JoinPoint point, TestAnnotation test) {
System.out.println("afterTest:" + test.name());
}
}
这样就完成了,然后创建⼀个Controller验证⼀下:
@RestController
@RequestMapping("/test")
public class TestController {
@TestAnnotation(name="abc")
@RequestMapping("/show")
public String show() {
return "OK";
}
@RequestMapping("/show2")
public String show2() {
return "OK2";
}
}
此时我们访问show请求,就会被拦截,控制台会打印输出。如果请求show2则不会被拦截。
注意:
1、在application.properties中也不需要添加spring.aop.auto=true,因为这个默认就是true,值为true就是启⽤@EnableAspectJAutoProxy注解了。
2、你不需要⼿⼯添加 @EnableAspectJAutoProxy 注解。
3、当你需要使⽤CGLIB来实现AOP的时候,需要配置spring.aop.proxy-target-class=true,这个默认值是false,不然默认使⽤的是标准Java的实现。
其实aspectj的会被解析成AOP中的advice,最终被适配成MethodInterceptor,这些都是Spring⾃动完成的,如果你有兴趣,详细的过程请参考springAOP的实现。
关于集中拦截⽅法的区别总结:
HandlerInterceptoer拦截的是请求地址,所以针对请求地址做⼀些验证、预处理等操作⽐较合适。当你需要统计请求的响应时间时MethodInterceptor将不太容易做到,因为它可能跨越很多⽅法或者只涉及到已经定义好的⽅法中⼀部分代码。
MethodInterceptor利⽤的是AOP的实现机制,在本⽂中只说明了使⽤⽅式,关于原理和机制⽅⾯介绍的⽐较少,因为要说清楚这些需要讲出AOP的相当⼀部分内容。在对⼀些普通的⽅法上的拦截HandlerInterceptoer就⽆能为⼒了,这时候只能利⽤AOP的MethodInterceptor。Filter是Servlet规范规
定的,不属于spring框架,也是⽤于请求的拦截。但是它适合更粗粒度的拦截,在请求前后做⼀些编解码处理、⽇志记录等。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论