博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java拦截器与AOP的区分理解
阅读量:4298 次
发布时间:2019-05-27

本文共 3383 字,大约阅读时间需要 11 分钟。

拦截器

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;@Configurationpublic 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.细节整理

 

对比分析

转载地址:http://fxnws.baihongyu.com/

你可能感兴趣的文章
opecv训练数字 0, 2(简单分类)
查看>>
图片修改 + 文字修改
查看>>
字符是识别结果
查看>>
字符是识别结果2
查看>>
字符是识别---4----直方图+图片数据信息+增加二值化处理后
查看>>
字符是识别---5----只利用直方图信息
查看>>
A图片识别错误分析,阈值影响
查看>>
字符是识别---6---只利用直方图信息--训练样本+二值化
查看>>
字符是识别---7---直方图信息+源数据20*20--训练样本+二值化
查看>>
字符是识别---8--直方图信息+源数据20*20--训练样本+二值化
查看>>
字符是识别---9--直方图信息+源数据20*20--训练样本0~9+二值化 单纯的0~9字符识别还可以
查看>>
字符是识别---10--源数据20*20--训练样本0~A----基于TensorFlow+CNN实现
查看>>
字符是识别---11--源数据20*20--训练样本0~Z----基于TensorFlow+CNN实现
查看>>
字符是识别---12--源数据20*20--训练样本0~Z----基于TensorFlow+LeNet实现
查看>>
window10(64bit)环境下安装基于TensorFlow后端的Keras 教程
查看>>
字符是识别---13-源数据20*20--训练样本0~Z----二值化参数影响训练结果
查看>>
resize接口实现之-------双线性插值法解读
查看>>
字符识别之----------resize后增加二值化操作,提高字符识别正确率
查看>>
win10下CUDA和CUDNN的安装(超详细)!亲测有效!
查看>>
openalpr截取出的字符识别结果
查看>>