「AOP」とは、アスペクト指向プログラミングのことです。有名なWebフレームワークであるSpringでも使うことができるため、「実際にどのような手法なのかあらためてチェックしておきたい」という方も多いのではないでしょうか?今回は、AOPの基本概要やメリット、Springフレームワークを使用した実例について解説します。
INDEX
AOP:Aspect Oriented Programming(アスペクト指向プログラミング)とは?
「AOP」とは、Aspect Oriented Programmingの略称で、直訳するとアスペクト指向プログラミングのことです。プログラミングに用いられる手法の概念を意味します。
具体的には、あらゆるオブジェクトに散在する共通処理を抜き出し、それを一つにまとめて管理できるようにする手法及び概念のことです。オブジェクト指向プログラミングを拡張した概念になります。
共通処理の例として挙げられるのが、ログ出力です。AOPではない場合、ロギング処理のコードがあらゆるところに横断して存在します。基本的に、ログ出力は頻繁に行うものであり、ロギングを行うことで、プログラムの処理の流れを正確に捉えられるため、非常に重要です。
しかし、ログ出力したいところにその都度メソッドを置いて実行する必要があるため、同じコードが散見されます。この問題を解決するのが、AOPです。AOPは、ログ出力のような共通の処理を抽出して必要な箇所に注入してくれるため、その都度メソッドの処理を書く必要がなくなります。
アスペクト指向とオブジェクト指向の違いは、処理を実行するタイミングで、インスタンスの生成やメソッドの呼び出しが必要かどうかという点です。オブジェクト指向プログラミングにおいても、共通処理をクラスで管理することができます。しかし、そのクラスで定義したメソッドを実行するためには、クラスのインスタンス化、メソッドの呼び出しをしなければなりません。
例えば、ログ出力をする場合、ログクラスをインスタンス化し、ログ出力メソッドを呼び出す必要があります。
一方、アスペクト指向は、メソッドが実行される前や実行後の共通処理を、事前に記述しておくことが可能です。クラスのインスタンス化は必要なく、事前にハンドラーで設定をしておけば実行されます。クラスやメソッドに関係なく、共通処理を実行できるので、非常に便利というわけです。
\文字より動画で学びたいあなたへ/
Udemyで講座を探す >AOPの具体例をご紹介!
AOPの具体例は、プログラミング言語とフレームワークから見ることができます。どのような言語で実装することができるのか、どのようなフレームワークに採用されているのかチェックしていきましょう。
AOPが実装できるプログラミング言語の具体例
AOPが実装できるプログラミング言語としては、下記のようなものが挙げられます。
- Java
- Ruby
- Smaltalk
- C++
オブジェクト指向を拡張した手法になるため、本来ある言語でAOPを実装できるように、拡張版として使われるケースが多いです。例えば、Javaを拡張したものとしてAspectJやAspectWerkz、dynaop、C++はAspectC++、RubyはAspectRが有名です。
なお、これらの言語の中で、もっともAOPの実装に用いられているのがJavaです。
AOPを採用しているフレームワーク
AOPは、フレームワークにも採用されています。AOPのフレームワークとして有名なのが、Spring FrameworkやSeasar2です。
Spring Frameworkは、Javaを使用したWeb開発ができるフレームワークになります。Webフレームワークの中でも非常に有名です。
一方、Seasar2は、日本で開発・提供されているフレームワークとして知られています。オープンソースとなっており、無料で利用することが可能です。
AOPを使うメリットとは?
AOPを使用することは、開発や保守において大きなメリットをもたらします。具体的なメリットについて詳しくチェックしていきましょう。
共通処理に統一性を持たせられる
1つ目のメリットは、統一した共通処理を実現できることです。プログラムに対して後から統一した処理を加えることができます。チーム開発をする際、異なる処理を記述してしまうケースは珍しくありません。AOPを利用すれば、そのような自体を避けることができるため、トラブルを回避できるでしょう。
また、統一されることで、可読性が向上することもメリットといえます。共通処理を省くことができるため、コードがスッキリとした印象になります。これにより、コードが見やすくなるため、チーム開発時の作業効率が大幅に向上するでしょう。また、保守・管理がしやすいため、メンテナンス性に優れている点も大きなメリットです。
既存概念のメリットは維持される
2つ目のメリットは、既存概念のメリットは維持されることです。AOPは、オブジェクト指向プログラミングの概念における、共通処理の問題を解決した形になります。つまり、本来持つオブジェクト指向のメリットは受け継がれるのです。問題点を修正しつつ、カスタマイズ性や再利用性の向上、分業化、独立性などの本来持つメリットは維持されるので、非常に便利です。
コードの記述量が少なくなる
3つ目のメリットは、コードの記述量が少なくなることです。共通処理は、アスペクトに任せられるため、さまざまなメソッド等で使用する処理の大部分を省くことができます。これにより、エンジニアは共通処理以外の実装に集中することができるため、開発効率を大幅に向上させられるでしょう。
AOPを使う前に知っておきたい用語を解説!
AOPを実装する上で大切な用語の意味をご紹介します。関連用語の知識を身につけることで、AOPのさらなる理解に役立てられるため、この機会に覚えておくのがおすすめです。
ジョインポイント
ジョインポイントとは、共通処理を注入する部分のことです。メソッドのコール時、アプリケーション実行中の特定地点を意味します。前処理から後処理の間までの範囲を指し示し、どこに注入するのかが決められた場所(ポイント)がジョインポイントです。
アドバイス
アドバイスとは、共通処理を意味します。例えば、ログの出力や例外処理などの共通処理がアドバイスです。
ポイントカット
ポイントカットとは、アドバイスをどのような条件で入れるのかという、“注入する条件のこと”を意味します。例えば、前処理や後処理、前後の両方などが挙げられるでしょう。
アドバイサー
アドバイザーとは、アスペクトのモジュール化のことです。アドバイスとポイントカットを兼ね備えたクラスを意味します。
インターセプタ
インターセプタとは、メソッドの前後で任意の処理を実行させることができる機能のことです。通常は、インターセプタクラスを継承して使用し、インターセプタを実装します。
プロキシ
プロキシとは、それぞれの処理の関連付けを行うために、動的クラスを拡張する仕組みのことです。AOPを実現するために必要なものとなります。
ターゲット
ターゲットとは、ジョインポイントが持つインスタンスのことです。ターゲットが1つ以上のインターフェースを実装しているときにプロキシが使用されます。
SpringフレームワークでAOPを使ってみよう
Springフレームワークを使用して、AOP実装のチュートリアルをご紹介します。特定のURLにアクセスしたときに、Webページにログを出力するようにAOPで実装します。
pom.xmlの設定
AOPを使用するためには、pom.xmlにライブラリを使用することを宣言しなければなりません。そのため、projectタグ内に下記を追加してください。
1 2 3 4 5 6 7 8 |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> |
AOPの実装
次に、AOPを実装します。Tutorial.Javaを作成し、処理後にログ出力されるようにコードを追加してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.tutorial.aop; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Aspect @Component public class Tutorial { @After("execution(String *..*MainController.logtest*(..))") public void logoutput() { System.out.println("処理後に出力されたログ"); } } |
コントローラーファイルの実装
最後に、コントローラーファイルを作成します。作成後に、localhost:8080/aoptestにアクセスするとwebページにログが出力されるでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.tutorial.aop; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MainController { @GetMapping("/aoptest") public String logtest() { return " aoptest"; } } |
この機会にAOPについてマスターしよう!
今回は、AOPの概要やメリット、Springフレームワークを使用した実装方法について解説しました。AOPは、いわばオブジェクト指向プログラミングのよいところを残し、問題点を解決した万能なプログラミング手法及び概念です。特に、Javaを使用したWebアプリケーション開発を行う際に取り入られることが多いので、Javaを使用したWeb開発をすることが多い方は、この機会に習得してみてはいかがでしょうか。
Springフレームワークについてもっと学習を進めたい方には、下記の講座がおすすめです。
【Javaプログラマー必須】最強のフレームワーク、Spring。環境構築、Thymeleaf画面作成、依存性の注入まで。
チーム作業を効率化するのに最適なフレームワークSpring。Thymeleaf画面と連携し、MVCによるWebアプリケーション開発を行います。さらに、依存性注入のあるアプリ、ないアプリを比べて、テスト効率化を実感する。
\無料でプレビューをチェック!/
講座を見てみるレビューの一部をご紹介
評価:★★★★★
コメント:ゆっくり説明をして頂いているので、作業しながらでも説明においつき理解力がより高まったかなと感じております。
評価:★★★★
コメント:短い時間のため、基礎学習となるが、Springを使用した開発について、テスト方法も含めて学習できるので、初めてSpringを触れる人には丁度良いと思います。
Springフレームワークを学んでAOPについての理解を深めましょう!
最新情報・キャンペーン情報発信中