• Spring Aop 入门与理解


    1.什么是AOP

    OOP是面向切面编程,AOP是面向切面编程。

    这两个有什么区别呢,我的理解是这样的,oop就是给我一个功能我一条路写到黑,我不管我只要实现。

    aop不一样,我的理解就是不同功能就抽出来,比如日志,事务抽出来,要用的时候组装一下就可以实现你这个功能,oop就是我的逻辑里面就也会有日志啊,事务的问题。当然只有正真看到代码才能感受其中的奥妙!

    1.1 AOP的优势

    1. 提高代码的重用性
    2. 业务代码的简洁
    3. 业务代码维护更高效
    4. 业务功能扩展更便捷

    1.2 AOP的核心概念

    1.3 入门级案例配置

    1. <bean id="Logs" class="com.zx.Aop.MyAop"></bean>
    2. <aop:config>
    3. <!--切点-->
    4. <aop:pointcut id="myPt" expression="execution(* *..*(..))"/>
    5. <!--切面,目前切面与切点的关系就在这边配置,切点这边配置的就是所有bean对象-->
    6. <aop:aspect ref="Logs">
    7. <aop:before method="logs" pointcut-ref="myPt"></aop:before>
    8. </aop:aspect>
    9. </aop:config>

    这边的Logs就是我的通知类。也就是共性方法,抽取出来了。

    2. Aop 特性

    2.1 切点表达式

    这边大概讲一下,怎么匹配的,有个印象就行,到时候分析不出来就百度问!

     2.1.1切入点类型

    这边就简单概述一下,其实就是全局切入点和局部切入点和私有切入点

    为啥这边切入点要首先介绍呢,这个还是比较重要的,到时候可能存在该切入的没有匹配上,不该切入的切入了。所以正常用AOP的公司规范特别重要,什么包名,类名,方法名。乱写的话根本玩不转。 

    2.2 通知类型 

    下面着重介绍一下环绕通知

    通知顺序的问题是看配置的顺序,配置的顺序决定着通知的顺序

    2.3 通知获取切点的入参和返回值以及处理异常

    这个非常重要,需要认真看

    第一种获取参数的方法

     这是第二种获取的方法

     获取返回值

    处理异常

    3. AOP注解

    这边就直接贴代码比较直观了

    1. package com.zx.Aop;
    2. import org.aspectj.lang.JoinPoint;
    3. import org.aspectj.lang.ProceedingJoinPoint;
    4. import org.aspectj.lang.annotation.*;
    5. import org.springframework.stereotype.Component;
    6. @Aspect
    7. @Component
    8. public class MyAop {
    9. @Pointcut("execution(* *..*(..))")
    10. public void Mypt(){
    11. }
    12. public void logs(){
    13. System.out.println("开始请求方法!日志功能");
    14. }
    15. @Before("Mypt()")
    16. /**这边入参数可以啥都不配
    17. * */
    18. public void before(JoinPoint joinPoint){
    19. Object[] args = joinPoint.getArgs();
    20. System.out.println("开始请求方法!before..."+ args[0]);
    21. }
    22. /**这边是配上参数的写法,不这样写会报错
    23. * */
    24. @Before(value = "MyPointAop.py2() && args(joinPoint)")
    25. public void before1(int joinPoint){
    26. System.out.println("开始请求方法!before1..."+ joinPoint);
    27. }
    28. @After("Mypt()")
    29. public void after(){
    30. System.out.println("开始请求方法!after");
    31. }
    32. @AfterReturning(value = "Mypt()",returning = "rets")
    33. public void afterReturning(Object rets){
    34. System.out.println("开始请求方法!afterReturning" + rets);
    35. }
    36. @AfterThrowing(value = "Mypt()",throwing = "throwable")
    37. public void afterThrowing(Throwable throwable){
    38. System.out.println("开始请求方法!afterThrowing" + throwable.getMessage());
    39. }
    40. @Around("Mypt()")
    41. public Object around(ProceedingJoinPoint point) {
    42. System.out.println("开始请求方法!aroundBefore");
    43. /**
    44. * 注意这边是调用切点方法
    45. */
    46. Object proceed = null;
    47. try {
    48. proceed = point.proceed();
    49. } catch (Throwable e) {
    50. e.printStackTrace();
    51. }
    52. System.out.println("开始请求方法!aroundAfter");
    53. return proceed;
    54. }
    55. }

     这边贴几个注意事项

    3.1 aop注解执行顺序

     3.2 注解配置方法

    4.最后一个小tips

    1. @Around("Mypt()")
    2. public Object around(ProceedingJoinPoint point) {
    3. //这个对象有很多有意思的数据,感兴趣的可以打印一下
    4. Signature signature = point.getSignature();
    5. System.out.println(signature.toLongString());
    6. System.out.println("开始请求方法!aroundBefore");
    7. /**
    8. * 注意这边是调用切点方法
    9. */
    10. Object proceed = null;
    11. try {
    12. proceed = point.proceed();
    13. } catch (Throwable e) {
    14. e.printStackTrace();
    15. }
    16. System.out.println("开始请求方法!aroundAfter");
    17. return proceed;
    18. }

     

         

  • 相关阅读:
    Ps:陷印
    Java-调用R语言和调用Python(前后端展示)
    Linux从root账号切换到普通账号并执行shell脚本
    【测试工具】UnixBench 测试
    XML配置文件
    面试官:你了解数据湖吗?翻译翻译什么是数据湖
    MSP430F5529时钟系统配置
    虚拟存储器
    树莓派系统镜像备份
    高数 | 周洋鑫 冲刺预测题自用整理复习
  • 原文地址:https://blog.csdn.net/zdreamLife/article/details/125474288