面试官:Spring Aop 常见注解和执行顺序

最近,我在给很多人做简历修改和模拟面试的时候,有部分朋友和我反馈Spring AOP的面试题,今天就和大家来问问。

Spring 一开始最强大的就是 IOC / AOP 两大核心功能,我们今天一起来学习一下 Spring AOP 常见注解和执行顺序。

Spring 面试 核心点:

IOC、AOP、Bean注入、Bean的生命周期、Bean的循环依赖

首先我们一起来回顾一下 Spring Aop 中常用的几个注解:

@Before 前置通知:目标方法之前执行
@After 后置通知:目标方法之后执行(始终执行)
@AfterReturning 返回之后通知:执行方法结束之前执行(异常不执行)
@AfterThrowing 异常通知:出香异常后执行
@Around 环绕通知:环绕目标方法执行

常见问题

1、你肯定知道 Spring  , 那说说 Aop 的去全部通知顺序, Spring Boot 或者 Spring Boot 2 对 aop 的执行顺序影响?

2、说说你在 AOP 中遇到的那些坑?

示例代码

下面我们先快速构建一个 spring aop 的 demo 程序来一起讨论 spring aop 中的一些细节。

配置文件

为了方便我直接使用 spring-boot 进行快速的项目搭建,大家可以使用 idea 的spring-boot 项目快速创建功能,或者去 start.spring.io 上面去快速创建spring-boot 应用。

因为本人经常手动去网上贴一些依赖导致,依赖冲突服务启动失败等一些问题。

plugins {    id 'org.springframework.boot' version '2.6.3'    id 'io.spring.dependency-management' version '1.0.11.RELEASE'    id 'java'}group 'io.zhengsh'version '1.0-SNAPSHOT'repositories {    mavenCentral()    maven { url 'https://repo.spring.io/milestone' }    maven { url 'https://repo.spring.io/snapshot' }}dependencies {    # 其实这里也可以不增加 web 配置,为了试验简单,大家请忽略     implementation 'org.springframework.boot:spring-boot-starter-web'    implementation 'org.springframework.boot:spring-boot-starter-actuator'    implementation 'org.springframework.boot:spring-boot-starter-aop'        testImplementation 'org.springframework.boot:spring-boot-starter-test'}tasks.named('test') {    useJUnitPlatform()}

登录后复制

接口类

首先我们需要定义一个接口。我们这里可以再来回顾一下 JDK 的默认代理实现的选择:

如果目标对象实现了接口,则默认采用JDK动态代理
如果目标对象没有实现接口,则采用进行动态代理
如果目标对象实现了接口,且强制Cglib,则使用cglib代理

这块的逻辑在 DefaultAopProxyFactory 大家有兴趣可以去看看。

public interface CalcService {    public int div(int x, int y);}

登录后复制

实现类

这里我门就简单一点做一个除法操作,可以模拟正常也可以很容易的模拟错误。

@Servicepublic class CalcServiceImpl implements CalcService {    @Override    public int div(int x, int y) {        int result = x / y;        System.out.println("====> CalcServiceImpl 被调用了,我们的计算结果是:" + result);        return result;    }}

登录后复制

aop 拦截器

申明一个拦截器我们要为当前对象增加 @Aspect 和 @Component ,笔者之前也是才踩过这样的坑,只加了一个。

其实这块我刚开始也不是很理解,但是我看了 Aspect 注解的定义我就清楚了

面试官:Spring Aop 常见注解和执行顺序

这里面根本就没有 Bean 的定义。所以我们还是乖乖的加上两个注解。

还有就是如果当测试的时候需要开启Aop 的支持为配置类上增加@EnableAspectJAutoProxy 注解。

其实 Aop 使用就三个步骤:

定义 Aspect 定义切面
定义 Pointcut 就是定义我们切入点
定义具体的通知,比如: @After, @Before 等。
@Aspect@Componentpublic class MyAspect {    @Pointcut("execution(* io.zhengsh.spring.service.impl..*.*(..))")    public void divPointCut() {    }    @Before("divPointCut()")    public void beforeNotify() {        System.out.println("----===>> @Before 我是前置通知");    }    @After("divPointCut")    public void afterNotify() {        System.out.println("----===>> @After  我是后置通知");    }    @AfterReturning("divPointCut")    public void afterReturningNotify() {        System.out.println("----===>> @AfterReturning 我是前置通知");    }    @AfterThrowing("divPointCut")    public void afterThrowingNotify() {        System.out.println("----===>> @AfterThrowing 我是异常通知");    }    @Around("divPointCut")    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {        Object retVal;        System.out.println("----===>> @Around 环绕通知之前 AAA");        retVal = proceedingJoinPoint.proceed();        System.out.println("----===>> @Around 环绕通知之后 BBB");        return retVal;    }}

登录后复制

测试类

其实我这个测试类,虽然用了 @Test 注解,但是我这个类更加像一个 main 方法把:如下所示:

面试官:Spring Aop 常见注解和执行顺序

执行结论

结果记录:spring 4.x, spring-boot 1.5.9

无法现在依赖,所以无法试验

我直接说一下结论:Spring 4 中环绕通知是在最里面执行的

结果记录:spring 版本5.3.15 springboot 版本2.6.3

面试官:Spring Aop 常见注解和执行顺序
img

多切面的情况

多个切面的情况下,可以通过@Order指定先后顺序,数字越小,优先级越高。如下图所示:

面试官:Spring Aop 常见注解和执行顺序

代理失效场景

下面一种场景会导致 aop 代理失效,因为我们在执行 a 方法的时候其实本质是执行 AServer#a 的方法拦截器(MethodInterceptor)链, 当我们在 a 方法内直接执行b(), 其实本质就相当于 this.b() , 这个时候由执行 a方法是调用到 a 的原始对象相当于是 this 调用,那么会导致 b() 方法的代理失效。这个问题也是我们开发者在开发过程中最常遇到的一个问题。

@Servicepublic class AService {        public void a() {        System.out.println("...... a");        b();    }        public void b() {        System.out.println("...... b");    }}

登录后复制

以上就是面试官:Spring Aop 常见注解和执行顺序的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2624549.html

(0)
上一篇 2025年3月7日 00:21:04
下一篇 2025年2月27日 20:15:18

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 分布式锁:5个案例,从入门到入土

    今天给大家分享的是分布式锁,本文使用五个案例、图、源码分析等来分析。 常见的synchronized、Lock等这些锁都是基于单个JVM的实现的,如果分布式场景下怎么办呢?这时候分布式锁就出现了。 关于分布式的实现方案,在业界流行的有三种:…

    2025年3月7日 编程技术
    200
  • 上周,XX保险面试,凉了!!!

    上周,一位群里的朋友去平安保险面试了,结果有些遗憾,蛮可惜的,但希望你不要气馁,正如你所说的,面试中遇到的问题,基本上都是可以通过背面试题解决的,所以请加油! 另外,有问题欢迎随时找我探讨,共同进步。 不扯远了,咱们进入主题,下面是这位同学…

    2025年3月7日
    200
  • 如何使用Java编写CMS系统的评论模块

    如何使用Java编写CMS系统的评论模块 引言:随着社交媒体的兴起,评论系统在内容管理系统(CMS)中变得越来越重要。评论模块不仅可以增加访问者的交互性,还可以提供用户对内容的反馈和讨论的平台。在本文中,我们将介绍如何使用Java编写CMS…

    2025年3月7日
    200
  • 构建高可靠和可扩展的分布式系统的Java技术栈

    构建高可靠和可扩展的分布式系统的Java技术栈 随着互联网的迅猛发展,分布式系统在当今软件开发中扮演着至关重要的角色。分布式系统的核心目标是提供高可靠性和可扩展性,以应对海量数据和高并发访问的挑战。在这篇文章中,我们将介绍一些在Java技术…

    2025年3月7日
    200
  • Java技术栈中的Web开发:从前端到后端的全方位指南

    Java技术栈中的Web开发:从前端到后端的全方位指南 随着互联网的快速发展,Web开发成为了当下最热门和重要的技术领域之一。而在Java技术栈中,有许多强大的框架和工具,可以帮助开发人员快速构建高效、可靠的Web应用程序。本文将带您深入了…

    2025年3月7日
    200
  • 使用 Spring Cloud 释放微服务的力量

    微服务架构的兴起改变了开发人员构建和部署应用程序的方式。Spring Cloud是 Spring 生态系统的一部分,旨在简化开发和管理微服务的复杂性。在本综合指南中,我们将探索 Spring Cloud 及其功能,并通过构建简单的微服务应用…

    编程技术 2025年3月7日
    200
  • 走入微服务架构的Java功能开发世界

    走入微服务架构的Java功能开发世界,需要具体代码示例 随着互联网的快速发展,越来越多的企业开始采用微服务架构来构建他们的应用程序。微服务架构将一个应用程序拆分成多个小的、独立的、可独立部署的服务,每个服务只关注自己的核心业务逻辑。这样的架…

    2025年3月7日
    200
  • Java功能开发领域的变革:微服务架构的兴起

    Java在功能开发领域一直以来都扮演着重要的角色,它的灵活性和强大的生态系统使得开发人员能够快速构建各种应用程序。然而,随着互联网和移动领域的快速发展,传统的单体应用架构面临着越来越多的挑战。这就催生了一个新的概念:微服务架构。 微服务架构…

    2025年3月7日
    200
  • 构建可扩展的Java功能:微服务架构的最佳实践

    构建可扩展的Java功能:微服务架构的最佳实践 引言:随着云计算和大数据的快速发展,企业对于可扩展性和灵活性的需求也越来越高。而微服务架构作为一种更加分布式的架构风格,已经成为构建高度可扩展和可伸缩性的应用程序的首选。本文将介绍使用Java…

    2025年3月7日
    200
  • 提升Java功能开发质量的关键:微服务架构揭秘

    提升Java功能开发质量的关键:微服务架构揭秘 引言:随着互联网的迅猛发展,企业面临着日益增长的用户需求和竞争压力,高质量的功能开发成为企业保持竞争力的关键。而在Java开发领域,微服务架构已经成为提升功能开发质量的有效方式。本文将从微服务…

    2025年3月7日
    200

发表回复

登录后才能评论