• 一文拿捏Spring之AOP


    Spring

    1.Spring的理解

    1.狭义上

    指SpringFramework,特别的控制反转、依赖注入、面向切面、等特性

    2.广义上

    Spring家族的一系列产品,像SpringMVC、SpringBoot、SpringCloud等

    2.aop

    🌟面试题(aop):

    简单介绍一下AOP?

    1. aop就是面向切面编程,是一种编程思想,是对oop的延续

    2. 可以使我们在不改变源码的情况下,对类中的方法功能进行增强

    3. 可以使增强的代码具备复用性、提高开发效率、提高代码的维护性

    1.相关属性

    1. 目标类:被增强的方法所在的类

    2. 连接点:目标类中所有的方法

    3. 切入点:目标类中被增强的方法

    4. 通知:增强的功能

      1. 前置通知 @Before :执行目标方法前要增强的功能

      2. 执行目标方法

        proceed = proceedingJoinPoint.proceed();
      3. 返回后通知 @AfterReturning:目标方法正确执行后要增强的功能

      4. 异常通知 @AfterThrowing:目标方法执行出错要增强的功能

      5. ⭐环绕通知 @Around:可以实现其他通知的功能

      6. 后置通知 @After:最后执行的通知

    5. 切面:@Aspect:通知+切入点

    2.AOP底层原理

    1.动态代理

    1.JDK的动态代理

    要求被代理的类实现接口

    2.cglib的动态代理

    被代理的类可以不实现接口

    3.定义切入点的方式

    1.使用切入点表达式
    1. @Component
    2. @Aspect
    3. @Slf4j
    4. public class AopAspect1 {
    5.    @Before("execution(public * com.atguigu.gmall.item.service..*.*(..))")
    6.    public void before() {      // 前置通知
    7.        log.info("AopAspect1.....before....方法执行了");
    8.   }
    9.    @After("execution(public * com.atguigu.gmall.item.service..*.*(..))")
    10.    public void after() {       // 后置通知
    11.        log.info("AopAspect1.....after....方法执行了");
    12.   }
    13.    @AfterReturning("execution(public * com.atguigu.gmall.item.service..*.*(..))")
    14.    public void afterReturning() { // 返回后通知,只有方法正常返回了,那么此时才会执行该方法
    15.        log.info("AopAspect1.....afterReturning....方法执行了");
    16.   }
    17.    @AfterThrowing("execution(public * com.atguigu.gmall.item.service..*.*(..))")
    18.    public void afterThrowing() {   // 异常后通知,只有方法产生异常以后,才会执行该方法
    19.        log.info("AopAspect1.....afterThrowing....方法执行了");
    20.   }
    21.    /**
    22.     * 一个环绕通知可以实现其他的四种通知的全部功能
    23.     * @param proceedingJoinPoint
    24.     * @return
    25.     * @throws Throwable
    26.     */
    27.    @Around("execution(public * com.atguigu.gmall.item.service..*.*(..))")
    28.    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {      // 环绕通知
    29.        log.info("AopAspect1.....around..前..方法执行了");
    30.        Object proceed = null ;
    31.        try {
    32.            proceed = proceedingJoinPoint.proceed();
    33.            log.info("AopAspect1.....around..后..方法执行了");
    34.       }catch (Exception e) {
    35.            e.printStackTrace();  // 异常后通知
    36.       } finally {
    37.            // 最终通知
    38.       }
    39.        System.out.println(proceed);
    40.        return proceed ;
    41.   }
    42. }
    2.使用自定义注解
    1. // com.atguigu.gmall.item.anno,自定义注解
    2. @Target(value = ElementType.METHOD)
    3. @Retention(value = RetentionPolicy.RUNTIME)
    4. public @interface GmallCache {
    5.    
    6. }
    7. // 在AopService切入点方法上添加自定义注解
    8. @GmallCache
    9. @Override
    10. public SkuInfo findSkuById(long skuId) {
    11.    log.info("AopServiceImpl....findSkuById方法执行了.....");
    12.    SkuInfo skuInfo = new SkuInfo() ;
    13.    skuInfo.setSkuName("小米 CC9 PLUS 手机 美颜自拍 游戏手机 仙女渐变色(美图定制版) 4G全网通 6GB+128GB");
    14.    return skuInfo;
    15. }
    16. // 定义基于注解进行拦截器的环绕通知
    17. @Component
    18. @Aspect
    19. @Slf4j
    20. public class AopAspect2 {
    21.    @Around("@annotation(gmallCache)")
    22.    public Object around(ProceedingJoinPoint proceedingJoinPoint , GmallCache gmallCache) throws Throwable {      // 环绕通知
    23.        log.info("AopAspect2.....around..前..方法执行了");
    24.        Object proceed = null ;
    25.        try {
    26.            proceed = proceedingJoinPoint.proceed();
    27.            log.info("AopAspect2.....around..后..方法执行了");
    28.       }catch (Exception e) {
    29.            e.printStackTrace();  // 异常后通知
    30.       } finally {
    31.            // 最终通知
    32.       }
    33.        System.out.println(proceed);
    34.        return proceed ;
    35.   }
    36. }

    4.多切面相关

    🌟面试题(事务失效):

    在使用多切面的情况下,自定义切面类捕捉到了目标方法的异常,但是因为没有吧异常抛出,导致事务切面类获取不到异常信息,事务切面类认为业务方法正常执行了,事务就不会进行回滚,从而导致了事务失效

  • 相关阅读:
    电脑开机后一直显示正在准备自动修复怎么办?
    CSS高级的详细解析
    [Azkaban] No active executors found分析
    SecureCRT 9.4.2最新终端SSH工具
    React Suspense 尝鲜,处理前后端IO异步操作
    STM32 I2C详解
    驼峰式与下划线命名规则
    快速排序压缩算法2024年最新一种压缩算法
    详解设计模式:外观模式
    Python学习记录 类相关
  • 原文地址:https://blog.csdn.net/qq_45643467/article/details/133492006