Como utilizar o DebugInterceptor da Primavera.


Data de Publicação:19 de Janeiro de 2021.



INFOMARTION > Como utilizar o DebugInterceptor da Primavera.

Visão geral.

Trata-se de como utilizar o DebugInterceptor da Primavera. O website da Primavera seguinte ajudou-me a compreender o conceito, mas foi difícil compreender o que fazer exactamente a partir do website sozinho, pelo que verifiquei os resultados.

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

Tabela de Conteúdos

  1. O que é um DebugInterceptor?
  2. montagem
  3. resumo

1. O que é um DebugInterceptor?

O DebugInterceptor é uma biblioteca que produz registos por AOP. Especificamente, as seguintes bibliotecas (ficheiros de frascos). Versão 5.1.4.

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

O ficheiro específico Java é "org.springframework.aop.interceptor.DebugInterceptor".

Em resumo, o AOP é uma técnica para injectar processamento em instâncias geridas no contentor DI da Primavera. O nome oficial para AOP é Aspect Oriented Programming.

Neste caso, queremos injectar um DebugInterceptor na instância que está a ser gerada por @Component.

1-1. ambiente de implementação

Gostaria de descrever o Jarro e a versão utilizada, uma vez que pode haver ligeiras diferenças dependendo do ambiente.

Versão do aop da Primaveraspring-aop-5.1.4.RELEASE.jar
Versão de feijão verdespring-beans-5.1.4.RELEASE.jar
Versão da biblioteca de saída de registoslf4j-api-1.7.25.jar
logback-core-1.2.3.jar

1-2. Trabalho necessário.

O trabalho necessário é o seguinte.

  • Criar uma instância com @Component.
  • Definir AOP na aplicaçãoContext.xml
  • Alteração das definições de saída de registo

2. montagem

Agora gostaria de o implementar na prática.

2-1. Criar uma instância com @Component.

Preparar uma aula com "@Component" declarado como se segue. Executar apenas 'regresso', pois só se quer ver o PON.

TestAop.java


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

        return;

    }

}

2-2. Definir AOP na aplicaçãoContext.xml

Preparar o AOP para injectar o processo. As áreas vermelhas são as relevantes para o POA.

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">
~abridgement~
    <!-- Teste AOP da Primavera. -->
    <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>

O "ponto" está escrito como se segue.

pointcut="execution(* nome do pacote.nome da classe.método-nome(..))"

No exemplo acima, seria o seguinte.

・nome do pacote:com.example

・nome da classe:TestAop

・método-nome:testMethod

Se desejar aplicá-lo a todos os métodos, aplica-se o seguinte.

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

2-3. Alteração das definições de saída de registo

Alterar o nível de registo apenas para o DebugInterceptor, uma vez que o nível de saída de registo descrito no DebugInterceptor é "TRACE". As áreas a vermelho são aquelas que precisam de ser definidas. O resto das configurações pode ser introduzido arbitrariamente.

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>

Olhei para alguns blogs de outras pessoas quando o criei, e alguns afirmaram que a saída deveria ser saída ao nível de log DEBUG, mas no caso de 'spring-aop-5.1.4.RELEASE.jar' parece que a saída não é saída a menos que seja ao nível de log TRACE.

Se a configuração deveria estar a funcionar, mas por alguma razão os toros não estão a ser produzidos, tente alterar o nível dos toros para TRACE.

2-4. Resultado.

Se chamar testMethod em TestAop.java com as configurações acima completas, deve ser emitido o seguinte registo. O registo é longo, pelo que apaguei algumas linhas, mas deve produzir duas linhas cada uma para Entrada e Saída, para um total de quatro linhas.

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. resumo

Se não estiver familiarizado com a utilização do DebugInterceptor, por favor consulte-o.

Obrigado por ter observado até ao fim.