
springのAOP「@Before」や「@After」で、実行対象を指定する「execution」ですが、少々記述方法が特殊で最初はとまどう場面があるかもしれません。
executionは正規表現ににていて、色々な指定方法が可能です。
色々な指定方法が可能であるがゆえに、慣れてきてもド忘れしたり、使い方を間違ってしまうものです。今回は「execution」のフォーマット(指定方法)について解説していきます。
この章でやること
executionの記述方法の解説をおこないます。
目次
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を使いこなすためにも覚えておきましょう。
この記事はお役に立てましたか?
お役に立てたことがあればシェアしていただけると嬉しいです!