1:什么是Aspect切面
Aspect切面其实也就是一种切面,但它不针对url路径,它是可以直接针对执行的方法的。
过滤器 拦截器 Aspect切面 对比
三者功能类似,但各有优势,从过滤器--》拦截器--》切面,拦截规则越来越细致,执行顺序依次是过滤器、拦截器、Aspect切面。
一般情况下数据被过滤的时机越早对服务的性能影响越小;
权限校验,一般情况下,所有的请求都需要做登陆校验,此时就应该使用过滤器在最顶层做校验;
日志记录,一般日志只会针对部分逻辑做日志记录,而且牵扯到业务逻辑完成前后的日志记录,此时应该考虑拦截器,
然而拦截器也是依据URL做规则匹配,因此相对来说不够细致,
因此我们会考虑到使用Aspect切面实现,Aspect切面可以针对代码的方法级别做拦截,很适合日志功能。
2: 引入相关POM包
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
3:Aspect设置切面
有两种方式使用Aspect来进行切面
1:环绕通知方式 只需要@Around注解即可
2:定义切点方式 :
先用@Pointcut定义切点 设置对应的切点名称
再使用 @Before 以及 @After 来设置该对应切点名称的的前后逻辑
两者最重要的核心点是设置 execution 的对应切面 所监视的方法
@Aspect
@Component
public class AspectAnnotationComponent {
//环绕通知。
//注意要有ProceedingJoinPoint参数传入。
//execution配置规则 首先是:包名 然后是: 类名 然后是方法名:方法名 括号内是:参数
//调用controller包下的任意类的任意方法时均会调用此方法 (注意:如果找不到 会提示显示红色)
//@Around("execution(* com.controller.*.*(..))")
@Around("execution(* com.example.demo.aspect.AspectTest.aspectMethodTestOne(..))")
public void sayAround(ProceedingJoinPoint proceedingJoinPoint)
throws Throwable{
System.out.println("注解类型环绕通知@Around ..环绕前");
proceedingJoinPoint.proceed();//执行方法
System.out.println("注解类型环绕通知@Around ..环绕后");
}
//定义切点
@Pointcut("execution(* com.example.demo.aspect.AspectTest.aspectMethodTestTwo(..))")
public void sayings(){
}
@Before("sayings()")
public void sayHello(){
System.out.println("注解类型 @Pointcut 前置通知");
}
//后置通知
@After("sayings()")
public void sayGoodbey(){
System.out.println("注解类型 @Pointcut 后置通知");
}
}
4:设置被Aspect 监视的代码
@Service
public class AspectTest {
/**
* 已经被Aspect切面方式 @Around 环绕
*/
public void aspectMethodTestOne(){
System.out.println("我是 aspectMethodTestOne ");
}
/**
* 已经被Aspect切面方式 @Pointcut定义为切点 并设置 before 与 after逻辑
*/
public void aspectMethodTestTwo(){
System.out.println("我是 aspectMethodTestTwo ");
}
}
5:测试结果
项目连接
请配合项目代码食用效果更佳:
项目地址:
https://github.com/hesuijin/hesuijin-study-project
Git下载地址:
https://github.com.cnpmjs.org/hesuijin/hesuijin-study-project.git
springboot-filter-interceptor项目模块下 aspect包
网友评论