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

Inhaltsverzeichnis
接口類" >接口類
Schnittstellenklasse" >Schnittstellenklasse
DefaultAopProxyFactory Wenn Sie interessiert sind , Sie k?nnen einen Blick darauf werfen. %%PRE_BLOCK_2%%Implementierungsklasse" >Die Logik von Dieses Stück ist in< 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);Schriftfamilie: ?Operator Mono“, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);“>DefaultAopProxyFactory Wenn Sie interessiert sind , Sie k?nnen einen Blick darauf werfen. %%PRE_BLOCK_2%%Implementierungsklasse
測(cè)試類" >測(cè)試類
執(zhí)行結(jié)論 " >執(zhí)行結(jié)論
多切面的情況" >多切面的情況
代理失效場(chǎng)景" >代理失效場(chǎng)景
Heim Java JavaInterview Fragen Interviewer: Allgemeine Anmerkungen und Ausführungssequenz von Spring Aop

Interviewer: Allgemeine Anmerkungen und Ausführungssequenz von Spring Aop

Aug 15, 2023 pm 04:32 PM
java Java -Interviewfragen

Vor kurzem, als ich Lebensl?ufe überarbeitete und Probeinterviews für viele Leute führte, gaben mir einige Freunde Feedback zu Fragen zu Spring AOP-Interviews, und ich werde sie heute stellen.

Das M?chtigste an Spring sind zu Beginn die beiden Kernfunktionen von IOC/AOP. Heute lernen wir die allgemeinen Anmerkungen und die Ausführungssequenz von Spring AOP.

Kernpunkte des Spring-Interviews:

IOC, AOP, Bean-Injektion, Bean-Lebenszyklus, Bean-Zirkelabh?ngigkeit

Lassen Sie uns zun?chst einige h?ufig verwendete Anmerkungen in Spring Aop überprüfen:

  • @Before Vorabbenachrichtigung: wird vor der Zielmethode ausgeführt @Before 前置通知:目標(biāo)方法之前執(zhí)行
  • @After 后置通知:目標(biāo)方法之后執(zhí)行(始終執(zhí)行)
  • @AfterReturning 返回之后通知:執(zhí)行方法結(jié)束之前執(zhí)行(異常不執(zhí)行)
  • @AfterThrowing 異常通知:出香異常后執(zhí)行
  • @Around
@AfterThrowing Ausnahmebenachrichtigung: Wird nach der Weihrauchausnahme ausgeführt

@Around Around-Benachrichtigung: Ausführung der Zielmethode umgeben

????????????FAQ?????? ??????1. Das müssen Sie Kennen Sie Spring, sprechen wir über die Reihenfolge aller Benachrichtigungen in Aop. Wie wirkt sich Spring Boot oder Spring Boot 2 auf die Ausführungsreihenfolge von Aop aus? ????2. Erz?hlen Sie mir von den Fallstricken, auf die Sie bei AOP gesto?en sind? ??

Beispielcode

Lassen Sie uns schnell ein Spring Aop-Demoprogramm erstellen, um einige Details von Spring Aop zu besprechen.

Konfigurationsdatei

Um mir die direkte Verwendung von Spring-Boot für die schnelle Projektkonstruktion zu erleichtern, k?nnen Sie die Spring-Boot-Projekt-Schnellerstellungsfunktion von idea verwenden oder zu start.spring.io</codestil></p> 上面去快速創(chuàng)建spring-boot 應(yīng)用。

因?yàn)楸救私?jīng)常手動(dòng)去網(wǎng)上貼一些依賴導(dǎo)致,依賴沖突服務(wù)啟動(dòng)失敗等一些問題。

plugins {
    id &#39;org.springframework.boot&#39; version &#39;2.6.3&#39;
    id &#39;io.spring.dependency-management&#39; version &#39;1.0.11.RELEASE&#39;
    id &#39;java&#39;
}

group &#39;io.zhengsh&#39;
version &#39;1.0-SNAPSHOT&#39;

repositories {
    mavenCentral()
    maven { url &#39;https://repo.spring.io/milestone&#39; }
    maven { url &#39;https://repo.spring.io/snapshot&#39; }
}

dependencies {
    # 其實(shí)這里也可以不增加 web 配置,為了試驗(yàn)簡(jiǎn)單,大家請(qǐng)忽略 
    implementation &#39;org.springframework.boot:spring-boot-starter-web&#39;
    implementation &#39;org.springframework.boot:spring-boot-starter-actuator&#39;
    implementation &#39;org.springframework.boot:spring-boot-starter-aop&#39;
    
    testImplementation &#39;org.springframework.boot:spring-boot-starter-test&#39;
}

tasks.named(&#39;test&#39;) {
    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

Da ich einige Abh?ngigkeiten h?ufig manuell online poste, treten Abh?ngigkeitskonflikte auf einige Probleme, wie z. B. ein Dienststartfehler.

public interface CalcService {

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

Schnittstellenklasse

Zuerst müssen wir eine Schnittstelle definieren. Hier k?nnen wir die Auswahl der Standard-Proxy-Implementierung von JDK überprüfen:

  • Wenn das Zielobjekt Wenn die Schnittstelle implementiert ist, wird standardm??ig der dynamische JDK-Proxy verwendet
  • Wenn das Zielobjekt die Schnittstelle nicht implementiert, verwenden Sie einen dynamischen Proxy
  • Wenn das Zielobjekt die Schnittstelle implementiert und Cglib erzwingt, verwenden Sie den Cglib-Proxy

Die Logik von Dieses Stück ist in< 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);Schriftfamilie: ?Operator Mono“, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);“>DefaultAopProxyFactory Wenn Sie interessiert sind , Sie k?nnen einen Blick darauf werfen.
@Service
public class CalcServiceImpl implements CalcService {

    @Override
    public int div(int x, int y) {
        int result = x / y;
        System.out.println("====> CalcServiceImpl 被調(diào)用了,我們的計(jì)算結(jié)果是:" + result);
        return result;
    }
}
Implementierungsklasse

??Hier führen wir einfach eine Divisionsoperation durch, die den normalen Betrieb simulieren und auch leicht Fehler simulieren kann. ??
@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????????Deklarieren Sie einen Interceptor und wir müssen @Aspect und @Component zum aktuellen Objekt hinzufügen. Der Autor ist bisher nur auf eine solche Grube getreten und hat nur eines hinzugefügt. ??

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

Interviewer: Allgemeine Anmerkungen und Ausführungssequenz von Spring Aop

這里面根本就沒有 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 方法把:如下所示:

Interviewer: Allgemeine Anmerkungen und Ausführungssequenz von Spring Aop

執(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

Interviewer: Allgemeine Anmerkungen und Ausführungssequenz von Spring Aop
img

多切面的情況

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

Interviewer: Allgemeine Anmerkungen und Ausführungssequenz von Spring Aop

代理失效場(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");
    }

}

Das obige ist der detaillierte Inhalt vonInterviewer: Allgemeine Anmerkungen und Ausführungssequenz von Spring Aop. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erkl?rung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Hei?e KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?e Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Hei?e Themen

PHP-Tutorial
1502
276
Wie gehe ich mit Transaktionen in Java mit JDBC um? Wie gehe ich mit Transaktionen in Java mit JDBC um? Aug 02, 2025 pm 12:29 PM

Um JDBC -Transaktionen korrekt zu verarbeiten, müssen Sie zun?chst den automatischen Komiti -Modus ausschalten und dann mehrere Vorg?nge ausführen und schlie?lich entsprechend den Ergebnissen festlegen oder rollen. 1. Nennen Sie Conn.SetAutoCommit (False), um die Transaktion zu starten. 2. Führen Sie mehrere SQL -Operationen aus, z. B. einfügen und aktualisieren. 3. Rufen Sie Conn.Commit () an, wenn alle Vorg?nge erfolgreich sind, und rufen Sie Conn.Rollback () auf, wenn eine Ausnahme auftritt, um die Datenkonsistenz zu gew?hrleisten. Gleichzeitig sollten Try-with-Ressourcen verwendet werden, um Ressourcen zu verwalten, Ausnahmen ordnungsgem?? zu behandeln und Verbindungen zu schlie?en, um Verbindungsleckage zu vermeiden. Darüber hinaus wird empfohlen, Verbindungspools zu verwenden und Save -Punkte zu setzen, um teilweise Rollback zu erreichen und Transaktionen so kurz wie m?glich zu halten, um die Leistung zu verbessern.

Wie arbeite man mit Kalender in Java? Wie arbeite man mit Kalender in Java? Aug 02, 2025 am 02:38 AM

Verwenden Sie Klassen im Java.Time -Paket, um das alte Datum und die Kalenderklassen zu ersetzen. 2. Erhalten Sie das aktuelle Datum und die aktuelle Uhrzeit durch LocalDate, LocalDatetime und Local Time; 3. Erstellen Sie ein bestimmtes Datum und eine bestimmte Uhrzeit mit der von () Methode; 4.. Verwenden Sie die Plus/Minus -Methode, um die Zeit nicht zu erh?hen und zu verkürzen. 5. Verwenden Sie ZonedDatetime und zoneId, um die Zeitzone zu verarbeiten. 6. Format und analysieren Sie Datumszeichenfolgen über DateTimeFormatter; 7. Verwenden Sie sofortige, um bei Bedarf mit den alten Datumstypen kompatibel zu sein. Die Verarbeitung der Datum in der modernen Java sollte der Verwendung von Java.Timeapi vorrangig machen, was klare, unver?nderliche und linear ist

Vergleich von Java Frameworks: Spring Boot vs Quarkus gegen Micronaut Vergleich von Java Frameworks: Spring Boot vs Quarkus gegen Micronaut Aug 04, 2025 pm 12:48 PM

Pre-Formancetartuptimemoryusage, QuarkusandmicronautleadduToCompile-Time-foringandgraalvSupport, WithQuarkusofttenperformLightBetterin serverloser Szenarien.2. Thyvelopecosystem,

Verst?ndnis von Netzwerkports und Firewalls Verst?ndnis von Netzwerkports und Firewalls Aug 01, 2025 am 06:40 AM

Networkportsandfirewallsworktogethertoenablecommunicationwhileensuringsecurity.1.Networkportsarevirtualendpointsnumbered0–65535,withwell-knownportslike80(HTTP),443(HTTPS),22(SSH),and25(SMTP)identifyingspecificservices.2.PortsoperateoverTCP(reliable,c

Wie funktioniert die Müllsammlung in Java? Wie funktioniert die Müllsammlung in Java? Aug 02, 2025 pm 01:55 PM

Die Müllsammlung von Java (GC) ist ein Mechanismus, der automatisch den Speicher verwaltet, der das Risiko eines Speicherlecks verringert, indem unerreichbare Objekte zurückgeführt werden. 1.GC beurteilt die Zug?nglichkeit des Objekts aus dem Stammobjekt (z. B. Stapelvariablen, aktive Threads, statische Felder usw.) und nicht erreichbare Objekte als Müll markiert. 2. Basierend auf dem markierten Algorithmus markieren Sie alle erreichbaren Objekte und l?schen Sie nicht markierte Objekte. 3.. Verfolgen Sie eine Generationskollektionsstrategie: Die neue Generation (Eden, S0, S1) führt h?ufig MollGC aus; Die ?lteren Menschen erzielen weniger, dauert jedoch l?nger, um MajorGC durchzuführen. MetaPace speichert Klassenmetadaten. 4. JVM bietet eine Vielzahl von GC -Ger?ten: SerialGC ist für kleine Anwendungen geeignet; ParallelgC verbessert den Durchsatz; CMS reduziert sich

Verwenden von HTML `Input` -Typen für Benutzerdaten Verwenden von HTML `Input` -Typen für Benutzerdaten Aug 03, 2025 am 11:07 AM

Durch die Auswahl des richtigen HTMlinput -Typs kann die Datengenauigkeit verbessert, die Benutzererfahrung verbessert und die Benutzerfreundlichkeit verbessert werden. 1. W?hlen Sie die entsprechenden Eingabetypen gem?? dem Datentyp aus, z. B. Text, E -Mail, Tel, Nummer und Datum, die automatisch überprüft und an die Tastatur anpassen k?nnen. 2. Verwenden Sie HTML5, um neue Typen wie URL, Farbe, Reichweite und Suche hinzuzufügen, die eine intuitivere Interaktionsmethode bieten k?nnen. 3.. Verwenden Sie Platzhalter und erforderliche Attribute, um die Effizienz und Genauigkeit der Formulierung zu verbessern. Es sollte jedoch beachtet werden, dass der Platzhalter das Etikett nicht ersetzen kann.

Vergleich von Java -Build -Werkzeugen: Maven vs. Gradle Vergleich von Java -Build -Werkzeugen: Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

GradleStheBetterChoiceFormostnewProjectsDuetoitSuperiorFlexibilit?t, Leistung und ModerntoolingSupport.1.GRADLE'SGROOVY/KOTLINDSLISMORECONCISEANDEIPRESSIVETHANMANMANBOSEXML.2.GRAGRECONCISEANDEPRPRESSIVETHANMAVENSVOSEXML.2.

Gehen Sie mit einer Beispielverschiebung erkl?rt Gehen Sie mit einer Beispielverschiebung erkl?rt Aug 02, 2025 am 06:26 AM

Auf Defer wird verwendet, um bestimmte Vorg?nge auszuführen, bevor die Funktion zurückgibt, z. B. die Reinigungsressourcen. Die Parameter werden sofort bewertet, wenn sie aufgeschoben werden, und die Funktionen werden in der Reihenfolge von Last-In-First-Out (LIFO) ausgeführt. 1. Mehrere Defers werden in umgekehrter Reihenfolge der Erkl?rungen ausgeführt. 2. h?ufig für die sichere Reinigung wie das Schlie?en von Dateien verwendet; 3. Der benannte Rückgabewert kann ge?ndert werden; V. 5. Vermeiden Sie den Missbrauch von Verschiebungen in Schleifen, um Ressourcenleckage zu verhindern. Die korrekte Verwendung kann die Sicherheit und die Lesbarkeit der Code verbessern.

See all articles