本文主要是介绍【Java】Spring-AOP与拦截器简洁实操 (上手图解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Java系列文章目录
补充内容 Windows通过SSH连接Linux
第一章 Linux基本命令的学习与Linux历史
文章目录
- Java系列文章目录
- 一、前言
- 二、学习内容:
- 三、问题描述
- 四、解决方案:
- 4.1 认识依赖
- 4.2 使用AOP与拦截器
- 4.2.1 使用AOP
- 4.2.1.1 设置DemoAop类
- 4.2.2.2 设置切面
- 4.2.2.3 设置方法的切点运行情况
- 4.2.2 使用拦截器
- 4.2.3 测试结果与总结
- 4.2.3.1 观察内容
- 4.2.3.2 现象总结
- 五、总结:
一、前言
- 学习Spring-AOP与拦截器
- 有时候使用AOP时不知道他们的执行顺序与关系
二、学习内容:
- Spirng-AOP实操
- 拦截器实操
三、问题描述
- 学习相关注解
🌟 学习执行顺序
四、解决方案:
4.1 认识依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
- 引入依赖后可使用Spring-AOP
4.2 使用AOP与拦截器
4.2.1 使用AOP
4.2.1.1 设置DemoAop类
- 使用
@Aspect
注解
4.2.2.2 设置切面
设置切点使用@Pointcut
- execution(访问修饰符 返回值类型 方法全称)
以下是使用的方法
execution(* com.example.service….(…))
com.example.service. :完整的包路径
com.example.service… :com.example.service下面所有的子孙包
com.example.service…* :com.example.service下面所有的子孙包的所有类
com.example.service…. :com.example.service下面所有的子孙包的所有类的所有方法
com.example.service….(…) :com.example.service下面所有的子孙包的所有类的所有方法,参数打两个点表示任何方法参数(…),即忽略参数
如图所示:
4.2.2.3 设置方法的切点运行情况
@Before
:在目标方法之前运行:前置通知@After
:在目标方法之后运行:后置通知@AfterReturning
:在目标方法正常返回之后:返回通知@AfterThrowing
:在目标方法抛出异常后开始运行:异常通知@Around
:环绕:环绕通知
一般对接口进行切面比较方便这里只是举例直接切方法
切点代码如下:
@RestController
@RequestMapping("/demo")
public class DemoController {@GetMapping("/index")public Result index() {System.out.println("这是demoController...");return Result.success("success");}@GetMapping("/error")public Result error() {System.out.println("这是异常errorController...");throw new RuntimeException("模拟异常");}
}
设置切面类:
@Aspect
@Component
@Slf4j
public class DemoAop {@Autowiredprivate HttpServletRequest request;// @Pointcut("execution(* org.example.aoptest.controller.DemoController.index(..))")@Pointcut("execution(* org.example.aoptest.controller.*.*(..))")public void pt(){System.out.println("这是pt切面");}@Before("pt()")public void before(){System.out.println("这是before切面");}@After("pt()")public void after(){System.out.println("这是after切面");}@AfterReturning(pointcut = "pt()", returning = "result")public void afterReturning(Object result) {System.out.println("这是afterReturning切面");}@AfterThrowing(pointcut = "pt()", throwing = "ex")public void afterThrowing(Exception ex) {System.out.println("这是afterThrowing切面: " + ex.getMessage());}@Around("pt()")public Object exec(ProceedingJoinPoint pjp) throws Throwable {System.out.println("这是around切面...before...");String token = request.getHeader("Authorization");log.info("token:{}",token);if (token.equals("1")){Object process = pjp.proceed();return process;}System.out.println("这是around切面...after...");return Result.error();}}
4.2.2 使用拦截器
拦截器详细的之后总结,我们主要观察AOP与拦截器的顺序
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate DemoInterceptor demoInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {System.out.println("==========");System.out.println(demoInterceptor);System.out.println("==========");registry.addInterceptor(demoInterceptor).addPathPatterns("/**");}
}
WebMvcConfigurer
是 Spring MVC 中的一个接口,用于定制 Web MVC的功能,如添加拦截器、视图解析器、配置静态资源等。实现该接口可以按需调整框架行为,优化 Web 层的功能而不必直接修改默认设置。
@Component
public class DemoInterceptor implements HandlerInterceptor {public DemoInterceptor(){System.out.println("=========================");System.out.println(this);System.out.println("=========================");}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle被调用...");return HandlerInterceptor.super.preHandle(request, response, handler);}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle被调用...");HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}}
-
HandlerInterceptor
是 Spring框架中的一个接口,它定义了请求处理的拦截器。实现该接口可以创建自定义的拦截器类 -
测试的时候要加上请求头
4.2.3 测试结果与总结
4.2.3.1 观察内容
观察图片区别
- 在AOP类里面我们获取请求头是
Authorization
的数据
- 请求头正确且token正确
token为1:
- 请求头正确但token错误
这个可以看出如果不能进入方法那么
@Before
与@After
也不能执行
token为2:
- 请求头错误
- error方法测试
4.2.3.2 现象总结
🌟 很明显方法与Before与After是一体的
🌟 其中@AfterThrow
与@AfterReturning
是在方法执行后出现的优先级比@Before
与@After
高
五、总结:
🌟 很明显方法与Before与After是一体的
🌟 其中@AfterThrow
与@AfterReturning
是在方法执行后出现的,优先级比@Before
与@After
高
- 日志记录:在方法执行前后自动记录日志。
- 事务管理:自动处理数据库事务的开始、提交和回滚。
- 权限控制:在方法执行前进行权限验证。
- 性能监控:记录方法执行时间和调用频率等性能指标。
- 缓存策略:限定条件下缓存方法返回结果,提高性能。
(后续有遇到问题再添加)
声明:如本内容中存在错误或不准确之处,欢迎指正。转载时请注明原作者信息(麻辣香蝈蝈)。
这篇关于【Java】Spring-AOP与拦截器简洁实操 (上手图解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!