国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
接口類" >接口類
DefaultAopProxyFactory 大家有興趣可以去看看。%%PRE_BLOCK_2%%實現(xiàn)類" >這塊的邏輯在 DefaultAopProxyFactory 大家有興趣可以去看看。%%PRE_BLOCK_2%%實現(xiàn)類
測試類" >測試類
執(zhí)行結論 " >執(zhí)行結論
多切面的情況" >多切面的情況
代理失效場景" >代理失效場景
首頁 Java Java面試題 面試官:Spring Aop 常見注解和執(zhí)行順序

面試官:Spring Aop 常見注解和執(zhí)行順序

Aug 15, 2023 pm 04:32 PM
java java面試題

最近,我在給很多人做簡歷修改和模擬面試的時候,有部分朋友和我反饋Spring AOP的面試題,今天就和大家來問問。

Spring 一開始最強大的就是 IOC / AOP 兩大核心功能,我們今天一起來學習一下 Spring AOP 常見注解和執(zhí)行順序。

Spring 面試 核心點:

IOC、AOP、Bean注入、Bean的生命周期、Bean的循環(huán)依賴

首先我們一起來回顧一下 Spring Aop 中常用的幾個注解:

  • @Before 前置通知:目標方法之前執(zhí)行@Before 前置通知:目標方法之前執(zhí)行
  • @After 后置通知:目標方法之后執(zhí)行(始終執(zhí)行)
  • @AfterReturning 返回之后通知:執(zhí)行方法結束之前執(zhí)行(異常不執(zhí)行)
  • @AfterThrowing 異常通知:出香異常后執(zhí)行
  • @Around
@After 后置通知:目標方法之后執(zhí)行(始終執(zhí)行)

@AfterReturning 返回之后通知:執(zhí)行方法結束之前執(zhí)行(異常不執(zhí)行)@AfterThrowing 異常通知:出香異常后執(zhí)行

@Around 環(huán)繞通知:環(huán)繞目標方法執(zhí)行

????????????常見問題?????? ??????1、你肯定知道 Spring ?, 那說說 Aop 的去全部通知順序, Spring Boot 或者 Spring Boot 2 對 aop 的執(zhí)行順序影響?????2、說說你在 AOP 中遇到的那些坑???

示例代碼

下面我們先快速構建一個 spring aop 的 demo 程序來一起討論 spring aop 中的一些細節(jié)。

配置文件

為了方便我直接使用 spring-boot 進行快速的項目搭建,大家可以使用 idea 的spring-boot 項目快速創(chuàng)建功能,或者去 start.spring.io 上面去快速創(chuàng)建spring-boot 應用。start.spring.io 上面去快速創(chuàng)建spring-boot 應用。

因為本人經(jīng)常手動去網(wǎng)上貼一些依賴導致,依賴沖突服務啟動失敗等一些問題。

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 的默認代理實現(xiàn)的選擇:

  • 如果目標對象實現(xiàn)了接口,則默認采用JDK動態(tài)代理
  • 如果目標對象沒有實現(xiàn)接口,則采用進行動態(tài)代理
  • 如果目標對象實現(xiàn)了接口,且強制Cglib,則使用cglib代理

這塊的邏輯在 DefaultAopProxyFactory

因為本人經(jīng)常手動去網(wǎng)上貼一些依賴導致,依賴沖突服務啟動失敗等一些問題。

public interface CalcService {

    public int div(int x, int y);
}

接口類

首先我們需要定義一個接口。我們這里可以再來回顧一下 JDK 的默認代理實現(xiàn)的選擇:

  • 如果目標對象實現(xiàn)了接口,則默認采用JDK動態(tài)代理
  • 如果目標對象沒有實現(xiàn)接口,則采用進行動態(tài)代理
  • 如果目標對象實現(xiàn)了接口,且強制Cglib,則使用cglib代理

這塊的邏輯在 DefaultAopProxyFactory 大家有興趣可以去看看。
@Service
public class CalcServiceImpl implements CalcService {

    @Override
    public int div(int x, int y) {
        int result = x / y;
        System.out.println("====> CalcServiceImpl 被調用了,我們的計算結果是:" + result);
        return result;
    }
}
實現(xiàn)類

??這里我門就簡單一點做一個除法操作,可以模擬正常也可以很容易的模擬錯誤。??
@Aspect
@Component
public 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 環(huán)繞通知之前 AAA");
        retVal = proceedingJoinPoint.proceed();
        System.out.println("----===>> @Around 環(huán)繞通知之后 BBB");
        return retVal;
    }
}
??????aop 攔截器????????申明一個攔截器我們要為當前對象增加 @Aspect 和 @Component ,筆者之前也是才踩過這樣的坑,只加了一個。??

其實這塊我剛開始也不是很理解,但是我看了 Aspect 注解的定義我就清楚了

面試官:Spring Aop 常見注解和執(zhí)行順序

這里面根本就沒有 Bean 的定義。所以我們還是乖乖的加上兩個注解。

還有就是如果當測試的時候需要開啟Aop 的支持為配置類上增加@EnableAspectJAutoProxy 注解。

其實 Aop 使用就三個步驟:

  • 定義 Aspect 定義切面
  • 定義 Pointcut 就是定義我們切入點
  • 定義具體的通知,比如: @After, @Before 等。
@Aspect
@Component
public 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 環(huán)繞通知之前 AAA");
        retVal = proceedingJoinPoint.proceed();
        System.out.println("----===>> @Around 環(huán)繞通知之后 BBB");
        return retVal;
    }
}

測試類

其實我這個測試類,雖然用了 @Test 注解,但是我這個類更加像一個 main 方法把:如下所示:

面試官:Spring Aop 常見注解和執(zhí)行順序

執(zhí)行結論

結果記錄:spring 4.x, spring-boot 1.5.9

無法現(xiàn)在依賴,所以無法試驗

我直接說一下結論:Spring 4 中環(huán)繞通知是在最里面執(zhí)行的

結果記錄:spring 版本5.3.15 springboot 版本2.6.3

面試官:Spring Aop 常見注解和執(zhí)行順序
img

多切面的情況

多個切面的情況下,可以通過@Order指定先后順序,數(shù)字越小,優(yōu)先級越高。如下圖所示:

面試官:Spring Aop 常見注解和執(zhí)行順序

代理失效場景

下面一種場景會導致 aop 代理失效,因為我們在執(zhí)行 a 方法的時候其實本質是執(zhí)行 AServer#a 的方法攔截器(MethodInterceptor)鏈, 當我們在 a 方法內直接執(zhí)行b(), 其實本質就相當于 this.b() , 這個時候由執(zhí)行 a方法是調用到 a 的原始對象相當于是 this 調用,那么會導致 b() 方法的代理失效。這個問題也是我們開發(fā)者在開發(fā)過程中最常遇到的一個問題。

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

}

以上是面試官:Spring Aop 常見注解和執(zhí)行順序的詳細內容。更多信息請關注PHP中文網(wǎng)其他相關文章!

本站聲明
本文內容由網(wǎng)友自發(fā)貢獻,版權歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權的內容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務,必須先關閉自動提交模式,再執(zhí)行多個操作,最后根據(jù)結果提交或回滾;1.調用conn.setAutoCommit(false)以開始事務;2.執(zhí)行多個SQL操作,如INSERT和UPDATE;3.若所有操作成功則調用conn.commit(),若發(fā)生異常則調用conn.rollback()確保數(shù)據(jù)一致性;同時應使用try-with-resources管理資源,妥善處理異常并關閉連接,避免連接泄漏;此外建議使用連接池、設置保存點實現(xiàn)部分回滾,并保持事務盡可能短以提升性能。

了解Java虛擬機(JVM)內部 了解Java虛擬機(JVM)內部 Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

如何使用Java的日歷? 如何使用Java的日歷? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當前日期時間;3.使用of()方法創(chuàng)建特定日期時間;4.利用plus/minus方法不可變地增減時間;5.使用ZonedDateTime和ZoneId處理時區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

了解網(wǎng)絡端口和防火墻 了解網(wǎng)絡端口和防火墻 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

垃圾收集如何在Java工作? 垃圾收集如何在Java工作? Aug 02, 2025 pm 01:55 PM

Java的垃圾回收(GC)是自動管理內存的機制,通過回收不可達對象釋放堆內存,減少內存泄漏風險。1.GC從根對象(如棧變量、活動線程、靜態(tài)字段等)出發(fā)判斷對象可達性,無法到達的對象被標記為垃圾。2.基于標記-清除算法,標記所有可達對象,清除未標記對象。3.采用分代收集策略:新生代(Eden、S0、S1)頻繁執(zhí)行MinorGC;老年代執(zhí)行較少但耗時較長的MajorGC;Metaspace存儲類元數(shù)據(jù)。4.JVM提供多種GC器:SerialGC適用于小型應用;ParallelGC提升吞吐量;CMS降

比較Java構建工具:Maven vs. Gradle 比較Java構建工具:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

Gradleisthebetterchoiceformostnewprojectsduetoitssuperiorflexibility,performance,andmoderntoolingsupport.1.Gradle’sGroovy/KotlinDSLismoreconciseandexpressivethanMaven’sverboseXML.2.GradleoutperformsMaveninbuildspeedwithincrementalcompilation,buildcac

以身作則,解釋說明 以身作則,解釋說明 Aug 02, 2025 am 06:26 AM

defer用于在函數(shù)返回前執(zhí)行指定操作,如清理資源;參數(shù)在defer時立即求值,函數(shù)按后進先出(LIFO)順序執(zhí)行;1.多個defer按聲明逆序執(zhí)行;2.常用于文件關閉等安全清理;3.可修改命名返回值;4.即使發(fā)生panic也會執(zhí)行,適合用于recover;5.避免在循環(huán)中濫用defer,防止資源泄漏;正確使用可提升代碼安全性和可讀性。

See all articles