一文拿捏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.使用切入点表达式
java 复制代码
@Component
@Aspect
@Slf4j
public class AopAspect1 {
​
    @Before("execution(public * com.atguigu.gmall.item.service..*.*(..))")
    public void before() {      // 前置通知
        log.info("AopAspect1.....before....方法执行了");
    }
​
    @After("execution(public * com.atguigu.gmall.item.service..*.*(..))")
    public void after() {       // 后置通知
        log.info("AopAspect1.....after....方法执行了");
    }
​
    @AfterReturning("execution(public * com.atguigu.gmall.item.service..*.*(..))")
    public void afterReturning() { // 返回后通知,只有方法正常返回了,那么此时才会执行该方法
        log.info("AopAspect1.....afterReturning....方法执行了");
    }
​
    @AfterThrowing("execution(public * com.atguigu.gmall.item.service..*.*(..))")
    public void afterThrowing() {   // 异常后通知,只有方法产生异常以后,才会执行该方法
        log.info("AopAspect1.....afterThrowing....方法执行了");
    }
​
    /**
     * 一个环绕通知可以实现其他的四种通知的全部功能
     * @param proceedingJoinPoint
     * @return
     * @throws Throwable
     */
    @Around("execution(public * com.atguigu.gmall.item.service..*.*(..))")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {      // 环绕通知
        log.info("AopAspect1.....around..前..方法执行了");
        Object proceed = null ;
        try {
            proceed = proceedingJoinPoint.proceed();
            log.info("AopAspect1.....around..后..方法执行了");
        }catch (Exception e) {
            e.printStackTrace();  // 异常后通知
        } finally {
            // 最终通知
        }
        System.out.println(proceed);
        return proceed ;
    }
}
2.使用自定义注解
java 复制代码
// com.atguigu.gmall.item.anno,自定义注解
@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface GmallCache {
    
}
​
// 在AopService切入点方法上添加自定义注解
@GmallCache
@Override
public SkuInfo findSkuById(long skuId) {
    log.info("AopServiceImpl....findSkuById方法执行了.....");
    SkuInfo skuInfo = new SkuInfo() ;
    skuInfo.setSkuName("小米 CC9 PLUS 手机 美颜自拍 游戏手机 仙女渐变色(美图定制版) 4G全网通 6GB+128GB");
    return skuInfo;
}
​
// 定义基于注解进行拦截器的环绕通知
@Component
@Aspect
@Slf4j
public class AopAspect2 {
​
    @Around("@annotation(gmallCache)")
    public Object around(ProceedingJoinPoint proceedingJoinPoint , GmallCache gmallCache) throws Throwable {      // 环绕通知
        log.info("AopAspect2.....around..前..方法执行了");
        Object proceed = null ;
        try {
            proceed = proceedingJoinPoint.proceed();
            log.info("AopAspect2.....around..后..方法执行了");
        }catch (Exception e) {
            e.printStackTrace();  // 异常后通知
        } finally {
            // 最终通知
        }
        System.out.println(proceed);
        return proceed ;
    }
}

4.多切面相关

🌟面试题(事务失效):

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

相关推荐
程序员清风11 分钟前
快手二面:乐观锁是怎么用它来处理多线程问题的?
java·后端·面试
一匹电信狗14 分钟前
【LeetCode_160】相交链表
c语言·开发语言·数据结构·c++·算法·leetcode·stl
曦樂~26 分钟前
【Qt】信号与槽(Signal and Slot)- 简易计算器
开发语言·数据库·qt
一线大码26 分钟前
SpringBoot 优雅实现接口的多实现类方式
java·spring boot·后端
花伤情犹在31 分钟前
Java Stream 高级应用:优雅地扁平化(FlatMap)递归树形结构数据
java·stream·function·flatmap
歪歪10035 分钟前
React Native开发Android&IOS流程完整指南
android·开发语言·前端·react native·ios·前端框架
yaoxin52112344 分钟前
212. Java 函数式编程风格 - Java 编程风格转换:命令式 vs 函数式(以循环为例)
java·开发语言
wangqiaowq1 小时前
ImmutableList.of() 是 Google Guava 库 提供的一个静态工厂方法,用于创建一个不可变的(immutable)列表。
开发语言·windows·python
摇滚侠1 小时前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 属性优先级 行内写法 变量选择 笔记42
java·spring boot·笔记
滑水滑成滑头1 小时前
**发散创新:多智能体系统的探索与实践**随着人工智能技术的飞速发展,多智能体系统作为当今研究的热点领域,正受到越来越多关注
java·网络·人工智能·python