AOPについて書いていきたいと思います。詳しい仕様が知りたい方は公式リファレンスを読んでください。5.0.5.RELEASE)です。Programmingの略で、「アスペクト指向プログラミング」と呼ばれています。AOPでは、クラスを横断した処理(例外処理やロギング、トランザクション処理など)をビジネスロジックから分離するようにコードを記述します。これによって、複数の処理をシンプルに記述できたり、同じ処理をおこなうコードが色々な場所で記述されていることを防ぐことができます。AOPの用語AspectJoinPointPointCutAdviceAspectAspectとは横断的な処理とそれを実行する場所を定義したモジュールを指します。Springでは、@Aspectをクラスにつけることで、そのクラスはAspectとして認識されます。AspectをBeanとして定義してあげる必要があるので、@ComponentをつけてBeanとして宣言することを忘れないようにしましょう。HogeAspect{}JoinPointJoinPointとは、横断的な処理を挿入する場所(メソッド)を指します。PointCutPointCutとは、JoinPointの集まりを表現したものです。下のコード例のようにAdvice(後述)のアノテーションのパラメータとしてPointCutを表現します。↓の例では、execution()でJoinPointを指定しています。*/execution()では以下のような文法でJoinPointが表現されます。パッケージ名で使う場合は、「任意の名前の1パッケージ」を表し、引数で使う場合は「任意の型1つ」を表す。パッケージ名で使う場合は、「0以上のパッケージ」を表し、引数で使う場合は「0以上の任意の型」を表す。最初にあげた例では、戻り値が任意の型で「com.example.fuga」パッケージ配下(サブパッケージ含む)にある「Fuga」というクラスのメソッド全てに対して@Afterが適用されることを表現しています。execution()以外にもwithin()やthis()などさまざまなものがありますが、execution()を使うことが多いです。参考AdviceAdviceとは、JoinPointで実行される横断的な処理そのものを表現します。@Aspectをつけたクラスのメソッドにアノテーションをつけることで、そのメソッドをAdviceとして実行させることができます。Adviceを表すアノテーションの種類は、以下の5つです。@Before対象のメソッドの処理前に実行されるAdviceです。*/}@After対象のメソッドの処理結果に関わらず、必ず実行されるAdviceです。*/}@AfterReturning対象のメソッドの処理が正しく終了した場合にのみ実行されるAdviceです。returningパラメータで文字列を指定すると、その文字列の変数にJoinPointで実行された処理の返り値が格納されます。これによって返り値をAdviceで利用することができます。System.out.println(r);}@AfterThrowing対象のメソッドの処理中に例外が発生した場合にのみ実行されるAdviceです。throwingパラメータで文字列を指定すると、その文字列の変数にJoinPointで実行された処理で起きた例外が格納されます。これによって例外をAdviceで利用することができます。System.out.println(e.getMessage());}@Around対象のメソッドの処理前や処理後など好きなタイミングで実行できるAdviceです。↓の例のように、前処理と後処理を自由に設定することができます。Bootを利用している場合、pom.xmlのdependenciesに「spring-boot-starter-aop」を追加します。「spring-boot-starter-parent」をparentに指定している場合は、すでにバージョン情報が定義されているので、spring-boot-starter-aopのversionを指定する必要はありません。Bootを使っていない場合は、「spring-aop」と「aspectjweaver」をpom.xmlに追加して@EnableAspectJAutoProxyをJavaConfigにつけてあげれば利用できると思います(動作未確認)。Aspectを作成するAspect用のクラスを作成して、クラスの先頭に@Aspectと@Componentをつけます。HogeAspect{}Adviceを作成し、PointCutを記述するAspectとして定義したクラスにメソッドを作成します。Adviceを実行するタイミングに応じて上で説明したAdviceのアノテーションを適宜つけてください。作成したAdviceをどのクラスやメソッドに適用するかをAdviceのアノテーションの中にexecution()を使って記述します。}}↑の例では、全てのメソッドで発生した例外に対する例外処理を定義しています。