executionの記述方法についてまとめました

spring

springのAOP「@Before」や「@After」で、実行対象を指定する「execution」ですが、少々記述方法が特殊で最初はとまどう場面があるかもしれません。

executionは正規表現ににていて、色々な指定方法が可能です。
色々な指定方法が可能であるがゆえに、慣れてきてもド忘れしたり、使い方を間違ってしまうものです。今回は「execution」のフォーマット(指定方法)について解説していきます。

[スポンサーリンク]

この章でやること

executionの記述方法の解説をおこないます。

目次

  1. executionについて
  2. executionの構成について
  3. executionでワイルドカードを使う
  4. executionのよく使うテンプレートを紹介
  5. 最後に

executionについて

executionとは、@Beforeや@Afterの属性で、springAOP(@Beforeや@After)を実行するルールを決めているものです。
例えば、@Beforeの処理をAクラスでは実行したいけど、Bクラスでは実行したくない。という場面で、executionを使って処理の有無を決めます。

executionの構成について

executionは以下のように記述します。

@Before("
execution(public String com.example.service.impl.ExampleServoceImpl.find(String)) throws Exception
")

executionは、AOPが動くルールを指定しています。以下はexecutionのフォーマットです。
execution(メソッド修飾子 メソッド戻り値 パッケージ名.クラス名.メソッド名(引数の型,引数の型) throws 例外)

メソッド修飾子(public等)は省略可能です。
「throws 例外」は省略可能です。

executionでワイルドカードを使う

どのクラス・どのパッケージかを明確にしたくない場合は、以下のような記述も可能です。
以下の記述では、メソッド修飾子(public等)と例外は省略しています。

@Before("
execution(* com.example..*.*(..))
")

上記の記述は、「パッケージcom.example配下全てのクラス・メソッドが処理の対象」となります。
1箇所のみを何でも一致させたい場合は、「*」を使います。
個数に関係なく全てを一致させたい場合は、「..」を使います。

上記を例にすると、引数部分が「..」となっています。これは引数の個数に関係なく「どんな型で引数が何個指定されていてもOK」なメソッドが対象となります。ほぼ全てのメソッドが対象になりますね。
これを「どんな型でもよいので引数を2つ指定してあるメソッドを対象」としたい場合は以下のような記述になります。

@Before("
execution(* com.example..*.*(*,*))
")

executionのよく使うテンプレートを紹介

特定のパッケージ配下(サブクラスを含)全てを指定したexecution
パッケージ「com.example.service.impl」配下の全クラスの全メソッドが対象となります。
パッケージ「com.example.service.impl」配下のサブクラスの全クラスの全メソッドが対象となります。

@Before("execution(* com.example..*.*(..))")

特定のクラスを指定したexecution
クラス「com.example.service.impl.ExampleServoceImpl」の全メソッドが対象となります。

@Before("execution(* com.example.service.impl.ExampleServoceImpl.*(..))")

特定のメソッドを指定したexecution
クラス「com.example.service.impl.ExampleServoceImpl」の「find」メソッドが対象となります。

@Before("execution(* com.example.service.impl.ExampleServoceImpl.find(..))")

特定の修飾子を指定したexecution
パッケージ「com.example.service.impl」配下の全クラスのpublicメソッドが対象となります。
パッケージ「com.example.service.impl」配下のサブクラスの全クラスのpublicメソッドが対象となります。

@Before("execution(public * com.example..*.*(..))")
}

最後に

executionは@Before、@Afterを動作させるためには必須といっていいほどよく使います。もしexecutionを使わなかったらjavaプロジェクトの全てのメソッド(サードパーティのメソッド含めて)で前後処理が実行されることになってしまいます。(もしexecution使わなかったら初期画面すら表示できないかもしれません)

executionは覚えるのに多少難があると思いますが、AOPを使いこなすためにも覚えておきましょう。