在 Spring Boot 中,拦截器和动态代理都是用来实现功能增强的,所以在很多时候,有人会认为拦截器的底层是通过动态代理实现的,所以本文就来盘点一下他们两的区别,以及拦截器的底层实现。uM528资讯网——每日最新资讯28at.com
uM528资讯网——每日最新资讯28at.com
此时用户登录权限的验证方法就会执行,这就是拦截器的执行过程。因此,可以得出结论,拦截器的实现主要是依赖 Servlet 或 Spring 执行流程来进行拦截和功能增强的。uM528资讯网——每日最新资讯28at.com
二、动态代理
动态代理是一种设计模式,它是指在运行时提供代理对象,来扩展目标对象的功能。在 Spring 中的,动态代理的实现手段有以下两种:uM528资讯网——每日最新资讯28at.com
- JDK 动态代理:通过反射机制生成代理对象,目标对象必须实现接口。
- CGLIB 动态代理:通过生成目标类的子类来实现代理,不要求目标对象实现接口。
动态代理的主要作用包括:uM528资讯网——每日最新资讯28at.com
- 扩展目标对象的功能:如添加日志、验证参数等。
- 控制目标对象的访问:如进行权限控制。
- 延迟加载目标对象:在需要时才实例化目标对象。
- 远程代理:将请求转发到远程的目标对象上。
三、拦截器 VS 动态代理
因此,我们可以得出结论,拦截器和动态代理虽然都是用来实现功能增强的,但二者完全不同,他们的主要区别体现在以下几点:uM528资讯网——每日最新资讯28at.com
- 使用范围不同:拦截器通常用于 Spring MVC 中,主要用于拦截 Controller 请求。动态代理可以使用在 Bean 中,主要用于提供 bean 的代理对象,实现对 bean 方法的拦截。
- 实现原理不同:拦截器是通过 HandlerInterceptor 接口来实现的,主要是通过 afterCompletion、postHandle、preHandle 这三个方法在请求前后进行拦截处理。动态代理主要有 JDK 动态代理和 CGLIB 动态代理,JDK 通过反射生成代理类;CGLIB 通过生成被代理类的子类来实现代理。
- 加入时机不同:拦截器是在运行阶段动态加入的;动态代理是在编译期或运行期生成的代理类。
- 使用难易程度不同:拦截器相对简单,通过实现接口即可使用。动态代理稍微复杂,需要了解动态代理的实现原理,然后通过相应的 api 实现。
小结
在 Spring Boot 中,拦截器和动态代理都是用来实现功能增强的,但二者没有任何关联关系,它的区别主要体现在使用范围、实现原理、加入时机和使用的难易程度都是不同的uM528资讯网——每日最新资讯28at.com