文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringAOP初识——初学者向

2023-08-31 19:13

关注

Spring中最重要的两个部分

        1.IOC 控制反转
        2.AOP面向切面编程

      博主之前有一篇文章是关于SpringIOC的理解:关于SpringIOC的理解有需要的小伙伴可以自行跳转。
 

      下面,我们今天来一起学习下SpringAOP相关的知识点。SpringAOP的英文全称是——(Aspect-Oriented Programming)面向切片编程,切片的理解大家可以想象一下切片面包,一个面包整体就是我们的项目,而把面包从业务的角度切成一片一片的,这些切片就是我们的业务。我们来举一个例子,比如下面这张图:

        在我们没有使用SpringAOP时,我们想要实现一个电商项目的日志追踪功能,我们需要在我们的每个业务层中都去添加这一功能相关的代码,繁琐而且缠绕,比如登录Service中本来只需要处理登录业务相关的代码逻辑,但是却不得不加入输出打印日志相关的代码。但是使用了AOP面向切面编程之后:

         我们只需要在controller 和 service中间切上那么一刀,把我们的日志追踪功能添加进去,然后通知Spring,并标注切入点。我们就可以实现业务之间的解耦,让每一块单独的业务只关心自己当前模块的相关业务。代码不再缠绕。总结一下:

那么我们如何去使用SpringAOP中的功能呢?

SpringAOP使用步骤
1.导入依赖

我们在maven中导入SpringAOP的相关依赖,
 

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

2.创建切面组件, 封装横切关注点代码

        通过@Aspect注解标注这个是切面组件

3.标注通知 @Before()

        就是通知Spring在什么之前执行以下相关代码,如上代码段中就是告诉Spring,要在personServiceImpl这个业务实现类中的所有方法前执行,如果需要标注具体方法,可以通过@Pointcut统一管理切入点。

4.标注切入点 "bean(personServiceImpl)"

5.在切面中获取用户调用的方法: 连接点(JoinPoint)

@Aspect //表示这就是切面@Component//组件注解public class DemoAspect {    private static Logger logger         LoggerFactory.getLogger(DemoAspect.class);        @Before("bean(personServiceImpl)")    public void log(JoinPoint joinPoint){        // Signature: 签名, 这里是方法签名        // 方法签名: 方法名 + 参数列表        Signature signature = joinPoint.getSignature();        logger.debug("方法前记录下用户行为:{} 时间执行了 {}",                LocalDateTime.now(), signature);    }}

 

@AfterReturning 中获取返回值

@AfterThrowing中获取异常信息

@AfterReturning(value = "bean(personServiceImpl)", returning = "result")public void test2(JoinPoint joinPoint, Object result){    Signature signature = joinPoint.getSignature();    logger.debug("方法正常结束记录下用户行为:{} 时间执行了 {}, 返回值:{}",            LocalDateTime.now(), signature, result);}@AfterThrowing(value = "bean(personServiceImpl)", throwing = "e")public void test3(JoinPoint joinPoint, Exception e){    Signature signature = joinPoint.getSignature();    logger.debug("方法异常结束记录下用户行为:{} 时间执行了 {} 异常: {}",            LocalDateTime.now(), signature, e.getMessage());}

@Pointcut 统一管理切入点 
 

@Aspect //切面组件, 注解, 来自 aspectj@Componentpublic class DemoAspect {    private static Logger logger = LoggerFactory.getLogger(DemoAspect.class);        @Pointcut("bean(personServiceImpl)")    public void personService(){}        @Before("personService()")    public void log(JoinPoint joinPoint){        // Signature: 签名, 这里是方法签名        // 方法签名: 方法名 + 参数列表        Signature signature = joinPoint.getSignature();        logger.debug("方法前记录下用户行为:{} 时间执行了 {}",                LocalDateTime.now(), signature);    }    @After("personService()")    public void test(JoinPoint joinPoint){        Signature signature = joinPoint.getSignature();        logger.debug("方法后记录下用户行为:{} 时间执行了 {}",                LocalDateTime.now(), signature);    }        @AfterReturning(value = "personService()", returning = "result")    public void test2(JoinPoint joinPoint, Object result){        Signature signature = joinPoint.getSignature();        logger.debug("方法正常结束记录下用户行为:{} 时间执行了 {}, 返回值:{}",                LocalDateTime.now(), signature, result);    }        @AfterThrowing(value = "personService()", throwing = "e")    public void test3(JoinPoint joinPoint, Exception e){        Signature signature = joinPoint.getSignature();        logger.debug("方法异常结束记录下用户行为:{} 时间执行了 {} 异常: {}",                LocalDateTime.now(), signature, e.getMessage());    }}

@Around 环绕通知, 强大的万能通知!

在连接点(JoinPoint)环绕执行

@Around 可以替代: @Before @After 等全部通知

@Around("personService()")public Object demo(ProceedingJoinPoint joinPoint) throws Throwable{    Signature signature = joinPoint.getSignature();    logger.debug("在连接点{}之前", signature);    Object value = joinPoint.proceed();  //执行目标连接点方法    logger.debug("在连接点{}之后", signature);    // 狸猫换太子: 替换返回值的演示    // Around 通知中, 可以对返回值进行加工处理, 实现丰富的行为    // if (value instanceof List){    //      value = new ArrayList<>();    // }    return value;}

使用注意事项:

来源地址:https://blog.csdn.net/Lee_92/article/details/126208247

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯