java拦截器与AOP的区分理解

您所在的位置:网站首页 拦截器的实现原理是什么 java拦截器与AOP的区分理解

java拦截器与AOP的区分理解

2023-07-18 22:00| 来源: 网络整理| 查看: 265

拦截器 1.了解概括

拦截器是一种切面思想,spring框架中实现了这种思想,提供了拦截器技术的相关接口,常用于日志拦截,登录判断等泛化流程处理中,可结合注解细化拦截范围。

2.基本使用步骤 a. 按照Spring MVC的方式编写一个拦截器类,实现HandlerInterceptor接口

在03-springboot-web中创建interceptor包,并创建一个LoginInterceptor拦截器

代码示例:

 

package com.bjpowernode.springboot.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginInterceptor implements HandlerInterceptor { @Override //进入Controller之前执行该方法 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //登录拦截的业务逻辑 System.out.println("-------登录请求拦截器--------------"); System.out.println(request.getRequestURI().toString()); Object object = request.getSession().getAttribute("user"); if (object == null) { System.out.println("用户没有登录"); return false; } //继续提交请求,false 请求不提交了 return true; } }  b   通过配置类注册拦截器

在03-springboot-web中创建一个config包,创建一个配置类InterceptorConfig,并实现WebMvcConfigurer接口, 覆盖接口中的addInterceptors方法,并为该配置类添加@Configuration注解,标注此类为一个配置类,让Spring Boot 扫描到,这里的操作就相当于SpringMVC的注册拦截器 ,@Configuration就相当于一个applicationContext-mvc.xml

代码示例:

 

package com.bjpowernode.springboot.config; import com.bjpowernode.springboot.interceptor.LoginInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { //需要拦截的路径,/**表示需要拦截所有请求 String[]addPathPatterns={"/**"}; //不需要拦截的路径 String [] excludePathPaterns={ "/boot/get", "/boot/post", "/boot/put", "/myservlet" }; //注册一个登录拦截器 registry.addInterceptor(new LoginInterceptor()) .addPathPatterns(addPathPatterns) .excludePathPatterns(excludePathPaterns); //注册一个权限拦截器 如果有多个拦截器 ,只需要添加以下一行代码 //registry.addInterceptor(new LoginInterceptor()) // .addPathPatterns(addPathPatterns) // .excludePathPatterns(excludePathPatterns); } }

 

c 细化拦截范围

配合注解可细化到方法拦截粒度,首先定义一个注解,然后再需要拦截判断的方法处加注解,最后在拦截器的handler中判断是否有这个注解,根据注解分流处理业务逻辑。在业务代码层产生了一定的侵染。

 

3.细节总结

 

aop 1.了解概况

AOP是一种切面编程的思想,不同于顺序编程,这是一种追求代码零侵染的横向编程思想,只需在配置类中,配置作用点和业务逻辑即可。spring也支持这种思想,实现了相关的接口,提供了更加便捷注解配置方式。

2.使用步骤

1:在pom文件中引入依赖

copy     org.springframework.boot   spring-boot-starter-aop

2:编写AOP类,在类上使用@Aspect、@Component注解。(What层面)

@Aspect:标识这个类是切面类。 @Component:把该类作为bean配置到Ioc容器里。

 

pic-1590653205702.png

 

3:编写切入点方法,在方法上使用@PointCut(execution(public * ...))(where层面)

 

pic-1590653205703.png

 

重点讲解下execution表达式部分,execution是执行的意思。public * com.cx.timer...看起来非常复杂,晦涩难懂。其实这里就是一个方法名的定义:作用域 返回类型 方法名(参数..)。 其中上图的作用域是:public返回类型:* (* 表示Object类型)方法名(参数..) :com.cx.timer.aop.controller是指具体的包名;.* 表示 该包名下的所有的类;*(..) 表示类下所有的方法,不限定参数。

4:编写切面方法,在想要处理的业务上使用@Before、@AfterReturning、@After、@Around、@AfterThrowing注解。(when层面)

@Before:在切入点方法执行之前执行该方法。 @AfterReturning:在切入点方法执行并有返回值才执行该方法。 @After:在执行切入点方法之后执行该方法。 @Around:在执行切入点方法的前后执行该方法。 @AfterThrowing:在切入点方法抛出异常的时候执行该方法。

 

pic-1589440513931.png

3.细节整理

 

对比分析


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3