Spring DebugInterceptor: Înregistrarea trasării AOP pentru dezvoltare


Data publicării:

Actualizat:


Articole tehnice > Spring DebugInterceptor: Înregistrarea trasării AOP pentru dezvoltare

Contextul din 2026 și utilizarea în siguranță

Concluzie: Spring DebugInterceptor este un interceptor bazat pe proxy AOP care înregistrează detaliile apelurilor de metode la nivelul TRACE. Este destinat depanării, nu unei strategii generale de observabilitate în producție.

Ce vei învăța

  • Cum selectează un advisor metodele și atașează interceptorul beanurilor Spring potrivite.
  • De ce auto-invocarea și obiectele create în afara containerului Spring pot ocoli advice-ul bazat pe proxy.
  • Cum evitați expunerea argumentelor, datelor personale, credențialelor sau unui volum excesiv de loguri.

Cui se adresează: Dezvoltatorilor Spring care întrețin aplicații configurate prin XML sau studiază mecanismul clasic de proxy AOP.

Contextul din 2026: Clasa există în continuare în Spring Framework, însă exemplul XML bazat pe Spring 5.1.4 este vechi. Folosiți o versiune Spring acceptată, limitați logarea TRACE la sesiuni de diagnostic și preferați metrici, tracing și logare structurată pentru producție.

Notă de siguranță: comenzile și exemplele de configurare din articolul original nu au fost reluate într-un mediu de producție actual. Verificați versiunile acceptate, copiile de rezervă, controalele de acces și pașii de retragere într-un mediu de testare separat înainte de a le aplica.

Surse oficiale principale

Prezentare generală

Articolul arată cum se atașează Spring DebugInterceptor unui bean printr-o configurație AOP în XML, cum se activează nivelul TRACE și cum se verifică outputul. Documentația Spring de mai jos este referința pentru concepte și API.

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop-api

Cuprins

  1. Ce este un DebugInterceptor?
  2. Implementare
  3. Rezumat

1. Ce este un DebugInterceptor?

DebugInterceptor este o clasă din modulul Spring AOP care înregistrează intrarea și ieșirea din apelurile metodelor la nivelul TRACE. Exemplul folosește artifactul și versiunea următoare.

https://mvnrepository.com/artifact/org.springframework/spring-aop/5.1.4.RELEASE

Numele complet al clasei este "org.springframework.aop.interceptor.DebugInterceptor".

Programarea orientată pe aspecte (AOP) aplică procesări suplimentare beanurilor administrate de containerul Spring. În acest exemplu, proxy-ul Spring execută DebugInterceptor la apelarea metodei țintă.

Ținta este beanul creat prin @Component și selectat de expresia pointcut.

1-1. Mediul exemplului

Configurația poate diferi între versiuni. Exemplul original folosește următoarele JAR-uri.

Versiunea Spring AOPspring-aop-5.1.4.RELEASE.jar
Versiunea Spring Beansspring-beans-5.1.4.RELEASE.jar
Versiunea bibliotecilor de logareslf4j-api-1.7.25.jar
logback-core-1.2.3.jar

1-2. Pașii necesari

Configurația are trei pași:

  • crearea beanului cu @Component;
  • Definiți AOP în applicationContext.xml
  • activarea nivelului TRACE pentru loggerul necesar.

2. Implementare

Secțiunea următoare aplică cei trei pași în configurația de exemplu.

2-1. Crearea beanului cu @Component

Definiți o clasă cu adnotarea "@Component" ca mai jos. Metoda nu execută altă logică, astfel încât outputul AOP să fie ușor de observat.

TestAop.java


@Component
public class TestAop{
    public void testMethod() {

        return;

    }

}

2-2. Definiți AOP în applicationContext.xml

Adăugați definiția AOP care atașează interceptorul metodei țintă. Zonele roșii indică elementele relevante pentru AOP.

applicationContext.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
~abrevierea~
    <!-- Testarea Spring AOP. -->
    <bean id="debugInterceptor" class="org.springframework.aop.interceptor.DebugInterceptor" />
    <aop:config>
        <aop:advisor advice-ref="debugInterceptor"
            pointcut="execution(* com.example.TestAop.testMethod(..))"  />
    </aop:config>
</beans>

Expresia pointcut are forma următoare.

pointcut="execution(* numele pachetului.numele clasei.nume-metodă(..))"

În exemplu, pachetul este com.example, clasa este TestAop, iar metoda este testMethod.

Pentru a selecta toate metodele clasei, utilizați expresia următoare.

pointcut="execution(* com.example.TestAop.*(..))"

2-3. Configurarea nivelului de logare

DebugInterceptor scrie mesaje la nivelul TRACE. Activați acest nivel numai pentru loggerul necesar, astfel încât restul aplicației să nu genereze un volum inutil de loguri. Zonele roșii indică setările relevante.

logback.xml


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern><![CDATA[date:%d{yyyy-MM-dd HH:mm:ss}\tthread:%thread\tX-Track:%X{X-Track}\tlevel:%-5level\tlogger:%-48logger{48}\tmessage:%msg%n]]></pattern>
        </encoder>
    </appender>

    <appender name="APPLICATION_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${app.log.dir:-log}/todo-application.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${app.log.dir:-log}/todo-application-%d{yyyyMMdd}.log</fileNamePattern>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <encoder>
            <charset>UTF-8</charset>
            <pattern><![CDATA[date:%d{yyyy-MM-dd HH:mm:ss}\tthread:%thread\tX-Track:%X{X-Track}\tlevel:%-5level\tlogger:%-48logger{48}\tmessage:%msg%n]]></pattern>
        </encoder>
    </appender>

    <logger name="org.springframework.aop.interceptor" level="trace">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="APPLICATION_LOG_FILE" />
    </logger>

    <root level="warn">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="APPLICATION_LOG_FILE" />
    </root>

</configuration>

În spring-aop-5.1.4.RELEASE.jar, DebugInterceptor scrie la nivelul TRACE, nu DEBUG.

Dacă proxy-ul este configurat corect, dar mesajele nu apar, verificați dacă loggerul corespunzător permite TRACE. Nu activați acest nivel la scară largă în producție: volumul poate fi mare, iar mesajele pot conține date sensibile.

2-4. Verificarea rezultatului

După aplicarea configurației, apelarea metodei testMethod din TestAop.java produce un log asemănător celui de mai jos. Exemplul a fost scurtat și conține două mesaje Entering și două mesaje Exiting.

date:2021-01-18 15:26:35	thread:http-nio-8081-exec-3	X-Track:84b8ab0aa6504352a815ce85167a1981	level:TRACE	logger:o.s.aop.interceptor.DebugInterceptor	message:Entering ReflectiveMethodInvocation 
date:2021-01-18 15:26:35	thread:http-nio-8081-exec-3	X-Track:84b8ab0aa6504352a815ce85167a1981	level:TRACE	logger:o.s.aop.interceptor.DebugInterceptor	message:Entering ReflectiveMethodInvocation 
date:2021-01-18 15:26:40	thread:http-nio-8081-exec-3	X-Track:84b8ab0aa6504352a815ce85167a1981	level:TRACE	logger:o.s.aop.interceptor.DebugInterceptor	message:Exiting ReflectiveMethodInvocation 
date:2021-01-18 15:26:40	thread:http-nio-8081-exec-3	X-Track:84b8ab0aa6504352a815ce85167a1981	level:TRACE	logger:o.s.aop.interceptor.DebugInterceptor	message:Exiting ReflectiveMethodInvocation 

3. Rezumat

DebugInterceptor ajută la observarea limitelor apelurilor de metodă pentru beanurile proxiate de Spring. Definiți un pointcut restrâns, activați TRACE numai în timpul diagnosticului și folosiți instrumente de observabilitate mai controlate în producție.