?? ?? ??? ???? ??? ?? ? ????? ?? ? ?? ???? Spring AOP ?? ??? ?? ???? ???, ?? ???????.
??? Spring? ?? ??? ?? IOC/AOP? ? ?? ?? ?????. ??? Spring AOP? ?? ??? ?? ??? ?? ?? ?????.
Spring ??? ?? ???:
IOC, AOP, Bean ??, Bean ?? ??, Bean ?? ???
?? Spring Aop?? ????? ???? ? ?? ??? ??? ?????.
@Before ?? ??: ?? ??? ?? ??? @Before
前置通知:目標(biāo)方法之前執(zhí)行@After
后置通知:目標(biāo)方法之后執(zhí)行(始終執(zhí)行)@AfterReturning
返回之后通知:執(zhí)行方法結(jié)束之前執(zhí)行(異常不執(zhí)行)@AfterThrowing
異常通知:出香異常后執(zhí)行@Around
@After
??? ?? : ??? ?? ??? ??(?? ???)
@ AfterReturning
?? ? ??: ?? ???? ??? ?? ???(??? ???? ??) @AfterThrowing
?? ??: ? ?? ?? ??
@Around
Around ??: Surround ?? ??? ??????????????FAQ?????? ??????1. ? ????? ? ? Spring, Aop? ?? ?? ??? ?? ???? ?????. Spring Boot ?? Spring Boot 2? Aop? ?? ??? ?? ??? ???? ????2. AOP?? ?? ??? ?? ?????. ???? ??
Spring AOP? ?? ? ?? ?? ??? ???? ?? Spring AOP ?? ????? ??? ??? ?????.
?? ??
?? ???? ??? ?? spring-boot? ?? ???? ??? ????? spring-boot ???? ?? ?? ??? ????? ? ????? ???. ="?? ??: 14px; ??: 2px 4px; ??? ??: 4px; ?? ???: 2px; ?? ??: 2px; ?? ??: rgba(27, 31, 35, 0.05); ?? ??: "Operator Mono" , Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">start.spring.io ?? ???- ?? ?? ????. start.spring.io
上面去快速創(chuàng)建spring-boot 應(yīng)用。
因?yàn)楸救私?jīng)常手動(dòng)去網(wǎng)上貼一些依賴導(dǎo)致,依賴沖突服務(wù)啟動(dò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 { # 其實(shí)這里也可以不增加 web 配置,為了試驗(yàn)簡(jiǎn)單,大家請(qǐng)忽略 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() }
接口類
首先我們需要定義一個(gè)接口。我們這里可以再來回顧一下 JDK 的默認(rèn)代理實(shí)現(xiàn)的選擇:
如果目標(biāo)對(duì)象實(shí)現(xiàn)了接口,則默認(rèn)采用JDK動(dòng)態(tài)代理 如果目標(biāo)對(duì)象沒有實(shí)現(xiàn)接口,則采用進(jìn)行動(dòng)態(tài)代理 如果目標(biāo)對(duì)象實(shí)現(xiàn)了接口,且強(qiáng)制Cglib,則使用cglib代理
這塊的邏輯在 DefaultAopProxyFactory
? ?? ???? ???? ???? ???? ??? ?? ??? ??? ??? ?????. ??? ?? ??? ?? ?? ??.
public interface CalcService { public int div(int x, int y); }
Interface class
?? ?????? ???? ???. ???? JDK? ?? ??? ?? ??? ??? ? ????.
?? ??? ?? ?????? ???? JDK ?? ???? ????? ?????. ?? ??? ?????? ???? ?? ?? ?? ???? ????? ?? ??? ?????? ???? Cglib? ???? ?? cglib ???? ?????
?? ? ??? < code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px; background-color: rgba(27, 31, 35, 0.05);font- family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">DefaultAopProxyFactory ??? ???? , ??? ? ????.
?????? ??? ??? ??? ??? ?????. ?? ???? ??? ?????? ? ?? ??? ?? ?????? ? ????. ?? ?? ???@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 Interceptor????????????? ???? ?? ??? @Aspect? @Component? ???? ???. ???? ??? ?? ???? ??? ??? ??? ??????. ??
其實(shí)這塊我剛開始也不是很理解,但是我看了 Aspect 注解的定義我就清楚了

這里面根本就沒有 Bean 的定義。所以我們還是乖乖的加上兩個(gè)注解。
還有就是如果當(dāng)測(cè)試的時(shí)候需要開啟Aop 的支持為配置類上增加@EnableAspectJAutoProxy
注解。
其實(shí) Aop 使用就三個(gè)步驟:
定義 Aspect 定義切面 定義 Pointcut 就是定義我們切入點(diǎn) 定義具體的通知,比如: @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; } }
測(cè)試類
其實(shí)我這個(gè)測(cè)試類,雖然用了 @Test 注解,但是我這個(gè)類更加像一個(gè) main 方法把:如下所示:

執(zhí)行結(jié)論
結(jié)果記錄:spring 4.x, spring-boot 1.5.9
無法現(xiàn)在依賴,所以無法試驗(yàn)
我直接說一下結(jié)論:Spring 4 中環(huán)繞通知是在最里面執(zhí)行的
結(jié)果記錄:spring 版本5.3.15 springboot 版本2.6.3

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

代理失效場(chǎng)景
下面一種場(chǎng)景會(huì)導(dǎo)致 aop 代理失效,因?yàn)槲覀冊(cè)趫?zhí)行 a 方法的時(shí)候其實(shí)本質(zhì)是執(zhí)行 AServer#a
的方法攔截器(MethodInterceptor
)鏈, 當(dāng)我們?cè)?a 方法內(nèi)直接執(zhí)行b(), 其實(shí)本質(zhì)就相當(dāng)于 this.b() , 這個(gè)時(shí)候由執(zhí)行 a方法是調(diào)用到 a 的原始對(duì)象相當(dāng)于是 this 調(diào)用,那么會(huì)導(dǎo)致 b() 方法的代理失效。這個(gè)問題也是我們開發(fā)者在開發(fā)過程中最常遇到的一個(gè)問題。
@Service public class AService { public void a() { System.out.println("...... a"); b(); } public void b() { System.out.println("...... b"); } }
? ??? ????: Spring Aop ?? ?? ? ?? ??? ?? ?????. ??? ??? PHP ??? ????? ?? ?? ??? ?????!

? AI ??

Undress AI Tool
??? ???? ??

Undresser.AI Undress
???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover
???? ?? ???? ??? AI ?????.

Clothoff.io
AI ? ???

Video Face Swap
??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

?? ??

??? ??

???++7.3.1
???? ?? ?? ?? ???

SublimeText3 ??? ??
??? ??, ???? ?? ????.

???? 13.0.1 ???
??? PHP ?? ?? ??

???? CS6
??? ? ?? ??

SublimeText3 Mac ??
? ??? ?? ?? ?????(SublimeText3)

JDBC ????? ???? ????? ?? ?? ?? ??? ?? ?? ??? ?? ? ?? ??? ?? ?? ?? ??? ???????. 1. ????? ????? Conn.SetAutoCommit (False)?? ??????. 2. ??? ? ????? ?? ?? SQL ??? ?????. 3. ?? ??? ??? ?? Conn.commit ()?? ???? ??? ???? ???? ?? ??? ???? Conn.Rollback ()?? ??????. ???, ? ??? ???? ????, ??? ???? ????, ?? ??? ??? ?? ??? ??? ???? ? ???????. ?? ?? ?? ???? ????? ??? ???? ?? ?? ???? ???? ??? ????? ?? ??? ??? ? ?? ???? ?? ????.

?? ?? ? ?? ???? ???? ?? Java.Time ???? ???? ??????. 2. LocalDate, LocalDateTime ? LocalTime? ?? ?? ??? ??? ?????. 3. () ???? ???? ?? ??? ??? ????. 4. ???/???? ??? ???? ??? ????? ??? ??????. 5. ZonedDateTime ? Zoneid? ???? ???? ??????. 6. DateTimeFormatter? ?? ?? ? ?? ?? ?? ???; 7. ??? ?? ?? ?? ??? ????? ?? ??????. ?? Java? ?? ??? ???? ??? ??? ???? Java.Timeapi ??? ?? ??? ???????.

Pre-FormancetArtUptimeMoryUsage, Quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless sinarios.2.thyvelopecosyste,

Java 's Garbage Collection (GC)? ???? ???? ???? ??????, ?? ? ??? ??? ? ??? ??? ??? ??? ????. 1.GC? ?? ?? (? : ?? ??, ?? ???, ?? ?? ?)?? ??? ???? ????, ?? ? ??? ??? ???? ?????. 2. ?? ???? ????? ????, ?? ?? ??? ??? ???? ?? ??? ??????. 3. ?? ?? ?? ?? : ??? ?? (Eden, S0, S1)? ?? ????? ?????. ??? ??? ?? ? MajorGC? ???? ? ??? ? ????. Metaspace? ??? ?? ???? ?????. 4. JVM? ??? GC ??? ?????. SerialGC? ??? ?? ????? ?????. ParallelGC? ???? ??????. CMS? ?? ???

GO? HTTP ?? ????? ?? ??, ??, ????? IP ? ?? ??? ?? ? ? ????. 1. http.handlerfunc? ???? ????? ????, 2. ??? ???? ?? ?? ??? ?? ??? ??????. ?? ?? ??? ???? ??? ?????? ??? ????? ???? ? ?????. ?? ???? ?? ?? ??, JSON ?? ?? ? ?? ID ??? ?????.

??? htmlinput ??? ???? ??? ???? ????? ??? ??? ?? ??? ???? ???? ? ????. 1. ???, ???, ??, ?? ? ??? ?? ??? ??? ?? ?? ?? ??? ???? ???? ??? ? ???? ??? ? ????. 2. HTML5? ?????? ??? ? ?? ?? ??? ?? ? ??? URL, ??, ?? ? ??? ?? ??? ??? ??????. 3. ?? ?? ? ? ??? ??? ???? ?? ??? ???? ???? ?? ???? ?? ???? ???? ?? ? ? ??? ?? ???????.

GradleisBetTerChoiceFormostNewProjectSduetoitssuperiorflexible, Performance, and ModernToolingsupport.1.Gradle'Sgroovy/kotlindslismoreConcisENDEXPRESSIVETHANMAVEN'SVOSEXML.2.GradleOutsMaveninbuildweedweedweedweedweedweedweedweedweedweedweedweedweedweede

DEFER? ??? ???? ?? ??? ??? ???? ? ?????. ?? ??? ?? ? ? ?? ????, ??? ??? ? ?? ?? (LIFO)? ??? ?????. 1. ?? ??? ??? ? ??? ?????. 2. ?? ??? ?? ??? ??? ????? ?????. 3. ?? ? ?? ?? ??? ? ????. 4. ??? ?????? ??? ??? ???? ?????. 5. ?? ??? ???? ?? ??? ?? ??? ?????. ??? ??? ?? ?? ? ???? ???? ? ????.
