SpringのDebugInterceptorの使い方


掲載日:2021年1月19日



INFOMARTION > SpringのDebugInterceptorの使い方

概要

SpringのDebugInterceptorの使い方についてです。以下のSpringのサイトを見て、概念は理解できましたが、具体的にどうするかがサイトだけだと分かり辛かったので、実際に検証してみた結果となります。

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

目次

  1. DebugInterceptorとは
  2. 実装
  3. まとめ

1. DebugInterceptorとは

DebugInterceptorとはAOPによりログを出力するライブラリです。具体的には以下のライブラリ(jarファイル)となります。バージョン5.1.4となります。

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

具体的なJavaファイルは「org.springframework.aop.interceptor.DebugInterceptor」となります。

AOPについて簡単に説明すると、SpringのDIコンテナ上で管理されているインスタンス(applicationContext.xmlで定義されていたり、@Componentで生成されていたりするインスタンス)に対して、処理をインジェクションする技術のことをAOPと言います。AOPの正式名称は「Aspect Oriented Programming」と言います。

今回は、@Componentで生成されているインスタンスに対して、DebugInterceptorをインジェクションしたいと思います。

1-1. 実装環境

環境により少し差分が発生するかもしれないので、使っているJarやバージョンについて記載したいと思います。

spring aopのバージョンspring-aop-5.1.4.RELEASE.jar
spring beansのバージョンspring-beans-5.1.4.RELEASE.jar
ログ出力ライブラリのバージョンslf4j-api-1.7.25.jar
logback-core-1.2.3.jar

1-2. 必要な作業

必要な作業は以下となります。

  • @Componentでインスタンスを生成する
  • applicationContext.xmlでAOPを定義する
  • ログ出力の設定を変更する

2. 実装

では、実際に実装していきたいと思います。

2-1. @Componentでインスタンスを生成する

以下の様な「@Component」が宣言されたクラスを準備します。AOPが見たいだけなので、「return」のみ実行します。

TestAop.java


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

        return;

    }

}

2-2. applicationContext.xmlでAOPを定義する

AOPで処理をインジェクションする設定をいれます。赤字が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">
~省略~
    <!-- 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>

「pointcut」は「pointcut="execution(* パッケージ名.クラス名.メソッド名(..))"」の様に書きます。上記の例だと「パッケージ名:com.example」「クラス名:TestAop」「メソッド名:testMethod」となります。

正規表現も利用可能なので全てのメソッドに適用したい場合は「pointcut="execution(* com.example.TestAop.*(..))"」の様にすることも可能です。クラス名も同様に対応することができ、パッケージ単位での指定も可能です。

2-3. ログ出力の設定を変更する

DebugInterceptorで記載されているログ出力のレベルが「TRACE」となっているので、DebugInterceptorだけログレベルを変更します。赤字が設定が必要な個所です。他は任意の設定を入れてください。

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>

作成にあたっていくつか他の人のブログも見てみましたが、「ログレベルDEBUGで出力されるようにする」と記載されているものもありましたが、「spring-aop-5.1.4.RELEASE.jar」の場合はログレベルTRACEじゃないと出力されない様です。

設定が上手くいっているはずだけど、なぜかログが出力されない人はログレベルTRACEに変えてみてください。

2-4. 結果

以上の設定が完了した状態でTestAop.javaのtestMethodを呼び出すと以下の様なログが出力されるはずです。ログが長いので少し削除しましたが、「Entering(処理の開始)」「Exiting(処理の終了)」で2行ずつ、合計4行出力されるはずです。

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. まとめ

DebugInterceptorの使い方が良く分からない人は参考にしてみてください。

最後までご覧いただきありがとうございました。



■INFORMATION

INFORMATIONのトップページはこちらよりお願いいたします。


■PROFILE

プロフィールはこちらよりお願いいたします。


■お問い合わせ先

記事に関するお問い合わせはこちらよりお願いいたします。