Spring全家桶系列--SpringBoot之AOP详解(上)

简介: Spring全家桶系列--SpringBoot之AOP详解(上)

准备工作


首先,使用AOP要在build.gradle中加入依赖


  1. //引入AOP依赖
  2. compile "org.springframework.boot:spring-boot-starter-aop:${springBootVersion}"


然后在application.yml中加入


  1. spring:
  2.  aop:
  3.    proxy-target-class: true


1.@Pointcut 切入点


定义一个切点。

例如我们要在一个方法加上切入点,根据方法的返回的对象,方法名,修饰词来写成一个表达式或者是具体的名字


我们现在来定义一个切点


  1. package com.example.aop;

  2. import org.aspectj.lang.annotation.Aspect;
  3. import org.aspectj.lang.annotation.Pointcut;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.stereotype.Component;

  7. /**
  8. * 类定义为切面类
  9. */
  10. @Aspect
  11. @Component
  12. publicclassAopTestController{
  13.    privatestaticfinalLogger logger =LoggerFactory.getLogger(AopTestController.class);
  14.    /**
  15.     * 定义一个切点
  16.     */
  17.    @Pointcut(value ="execution(public String test (..))")
  18.    publicvoid cutOffPoint(){
  19.    }
  20. }


这里的切点定义的方法是


  1.    @GetMapping("hello")
  2.    publicString test(){
  3.        logger.info("欢迎关注Java知音");
  4.        return"i love java";
  5.    }


如果你想写个切入点在所有返回对象为Area的方法,如下


@Pointcut("execution(public com.example.entity.Area (..))")


等很多写法,也可以直接作用在某些包下


注意:private修饰的无法拦截


2.@Before前置通知


在切入点开始处切入内容


在之前的AopTestController类中加入对test方法的前置通知


  1.    @Before("cutOffPoint()")
  2.    publicvoid beforeTest(){
  3.        logger.info("我在test方法之前执行");
  4.    }


这里@Before里的值就是切入点所注解的方法名


image.png


在方法左侧出现的图标跟过去以后就是所要通知的方法 这里就是配置正确了,我们来浏览器调用一下方法


image.png


联想一下,这样的效果可以用在哪里,想像如果要扩展一些代码,在不需要动源代码的基础之上就可以进行拓展,美滋滋


3.@After 后置通知


和前置通知相反,在切入点之后执行

  1.    @After("cutOffPoint()")
  2.    publicvoid doAfter(){
  3.        logger.info("我是在test之后执行的");
  4.    }


控制台执行结果


image.png


这里定义一个通知需要重启启动类,而修改通知方法的内容是可以热部署的


4.@Around环绕通知


和前两个写法不同,实现的效果包含了前置和后置通知。

当使用环绕通知时,proceed方法必须调用,否则拦截到的方法就不会再执行了

环绕通知=前置+目标方法执行+后置通知,proceed方法就是用于启动目标方法执行的

  1.    ThreadLocal<Long> startTime =newThreadLocal<>();
  2.    @Around("cutOffPoint()")
  3.    publicObject doAround(ProceedingJoinPoint pjp){
  4.        startTime.set(System.currentTimeMillis());
  5.        logger.info("我是环绕通知执行");
  6.        Object obj;
  7.        try{
  8.            obj = pjp.proceed();
  9.            logger.info("执行返回值 : "+ obj);
  10.            logger.info(pjp.getSignature().getName()+"方法执行耗时: "+(System.currentTimeMillis()- startTime.get()));
  11.        }catch(Throwable throwable){
  12.            obj=throwable.toString();
  13.        }
  14.        return obj;
  15.    }


执行结果:


image.png


1.环绕通知可以项目做全局异常处理

2.日志记录

3.用来做数据全局缓存

4.全局的事物处理 等




相关文章
|
16天前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
1月前
|
存储 缓存 Java
Spring高手之路23——AOP触发机制与代理逻辑的执行
本篇文章深入解析了Spring AOP代理的触发机制和执行流程,从源码角度详细讲解了Bean如何被AOP代理,包括代理对象的创建、配置与执行逻辑,帮助读者全面掌握Spring AOP的核心技术。
40 3
Spring高手之路23——AOP触发机制与代理逻辑的执行
|
21天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
30 1
|
23天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
34 1
|
17天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
31 0
|
1月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
67 2
|
1月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
109 1
|
1月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
28 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
1月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
27 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
1月前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
105 0
下一篇
无影云桌面