10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SpringのDIとAOPについてまとめる。

Last updated at Posted at 2019-05-09

Spring DIとAOPに関してまとめ

だいぶ前に書いて公開を忘れてたやつを公開。

この記事は

Javaのアプリケーションフレームワークである、Springを用いて開発をする機会が公私ともにありました。
Springを開発をやっていくうえで、DIやAOPなどの概念はなんとなく把握していましたが、いざ説明を求められるとしどろもどろになってしまうこと多々があり、
今後、このフレームワークをきちんと使っていくためにも、ここで上記2つの概要やメリットを記事としてまとめることで理解を深めようと思って記事を書きました。

書くこと

  • Spring Frameworkとは
  • DIとは
  • AOPとは

###書かないこと
ここでは、あくまでDIとAOPの考え方やメリットをまとめるものであり、実装方法等を詳細に記述しません。

想定読者

  • Spring Framework(Bootを含む)を用いて簡単なWebアプリを作ったことがある人
  • DI、AOPについてなんとなく知っているが説明を求められると「あばばばば」ってなる人

Spring Frameworkとは

概要

そもそもSpring Frameworkとは何でしょうか。
公式HPではSpring Frameworkについて、以下のようなことが書かれています。

The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform.

雑に訳すと

Spring FrameworkはモダンなJavaベースのエンタープライズアプリケーションに対して包括的プログラミングや構造化されたモデルを提供します。また、どのようなプラットフォームでも動作します。

Springはエンタープライズ向けのJavaアプリケーション開発Frameworkです。
Spring Frameworkの開発当初は軽量フレームワークとして普及していました。しかし、Springは古いインフラ環境を切り捨てることなく開発を進めていきます。そうして、10年以上の長い月日の中で重厚なFrameworkとなっていったようです。

代表的なプロジェクト

Springには複数のプロジェクトが存在します。代表的なものには以下のようなものがあります。

  • Spring MVC
    • Webアプリケーションを開発するためのFrameworkであり、MVCアーキテクチャを採用している。
  • Spring Security
    • Springベースのアプリケーションに対して、認証、認可の仕組みを容易に実現するFrameworkです。Basic認証やLDAP認証、Open ID等の様々な認証に対応している。また、独自の認証方式の実装も可能です。
  • Spring Data
    • Spring RDBやNoSQLなど様々なデータストアへのアクセスを容易にするFrameworkです。Spring Data CommonsSpring Data JPA複数のサブプロジェクトで構成されます。
  • Spring Batch
    • バッチアプリケーション向けのFramework、大量のデータ処理に必要な共通機能を提供しています。
  • Spring Boot
    • Spring Frameworkのconfigfile群をあらかじめ用意しておき、Spring アプリケーション開発を容易にすることを目的としたSpringプロジェクトです。

###DIとAOP
Springでコアとなる設計思想にDIとAOPと呼ばれるものがあります。Springではこれらの設計思想に基づいたプログラミングを行うことになります。
事項からそれらについてまとめます。

DI(Dependancy Injection)

DI(Dのependency Injection)は日本語で依存性の注入と約されます。一般的なアプリケーションでは、1つの処理を行うために複数のモジュールを組み合わせて実現することが多くあります。そのモジュールには以下のようなものが挙げられます。

* データベースアクセスを担当するモジュール
* 共通的な機能を切り出したモジュール

DIはこれらような複数のモジュールを組み合わせて、1つの処理を行う場合に力を発揮します。
DIそのものはSpring Framework特有の考え方ではなく ソフトウェアデザインパターンの一つで、「Inversion of Control Principle(制御の反転の原則)」を実現します。制御の反転とは伝統的な手続き型の言語に比べて制御の方向が反転していることからそう呼ばれます。

s_手続型.png

上の図で手続き型はクラスAがインスタンスする際に、クラスBがインスタンス化されます。そのため制御の方向はA→Bとなります。
ここで、何らかの方法を用いて、クラスA依存するクラスBのインスタンスを注入するように処理を変更します。

s_DI.png

この場合では、クラスBクラスAに注入するため、制御の方向がB→Aとなります。
このように制御の方向を反転させ、クラスAではクラスBインターフェースBで受け取るような実装にしてあげることによって、クラスAクラスBの実態として何が注入されるかを気にせずにすみ、疎結合となります。インターフェースBを継承しているオブジェクトであれば注入が可能となるからです。
SpringではIoCコンテナと呼ばれるコンテナを利用し、この制御の反転を実現しています。

IoCコンテナではインスタンスはBeanと呼ばれます。
IoCコンテナを用いることで、今まで直接インスタンスを生成していたのに対して、インスタンスの注入をIocコンテナに任せることができます。

s_DIコンテナ.png

###DIコンテナのメリット
SpringのようにインスタンスをDIコンテナから注入する事により、以下のようなメリットがあります。

* インスタンスのスコープやライフライクルを制御することができる。
* 共通の機能を組み込むことが可能となる。
* コンポーネント間が疎結合になることによってモックの差し込みなどが容易にでき、単体テストを行いやすくなる。

## AOP(Aspect Oriented Programing)

横断的な関心事とAOP

アプリケーションを実装する際に、ロギング処理キャッシュ処理などアプリケーションの本質的な処理である業務ロジックとは関係のない処理があります。これらの処理をアプリケーションに直接記述すると、ログのフォーマットが変更されたなどの際にすべてをコードを手作業で変更するようにしなくてはなりません。変更に弱い、不整合を起こしやすいシステムとなってしまします。
上記のような複数のモジュールに点在する同一処理のことを「横断的な関心事」と呼びます。この横断的関心事を一箇所にまとめることを「横断的な関心事を分離」と呼び、これを中心に考えて設計、実装を行うことをAOP(アスペクト指向プログラミング)といいます。

ここで、AOPを行う上での用語を以下にまとめます。

用語 説明
Aspect 横断的な関事心。「ロギング処理」や「キャッシュ処理」等のモジュールの関心事がAspectにあたる。
Join Point 横断的な関心事のモジュールを実行することが可能なポイント。AOPライブラリーによってポイントの場所が違う。
Advice Aspectのコードのこと。SpringではAroundBefore
After等複数の種類が存在する。
Pointcut AdviceJoin pointの関係性を表す式の集合体。
Weaving アプリケーションの該当ポイントにAspectを入れ込む処理のこと。Spring AOPでは実行時に行なう。
Target Waving処理によって、フローが変更されるオブジェクトのことを言います。単に、Advicedオブジェクトとも呼ばれる。

#####Adviceの種類
AdviceJoin Pointに対して、どのタイミングでその処理が実行されるかによって複数の種類があります。

Advice 説明
Before Join Pointの前に実行される。
After Returning join Pointにおける処理が正常終了した後に実行される。
After Throwing Join Pointで例外がスローされた後に実行される。
After Join Pointの後に例外をスローした場合でも、正常終了した場合でも実行される。
Around Join Pointの前後で実行される。

###SpringのAOP
Springでは、AspectJと呼ばれるフレームワークを用いてAOPを実現しています。
また、DIコンテナ内のBeanTargetとしAdviceを差し込むことができます。

DIコンテナからBeanを取り出す際にJava Proxyを使い、TargetのBeanをラップすることで、Weavingを行います。

## 終わりに
まとめてみると、やはりというか理解していないことがたくさんありました。

## 参考文献
- Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発

10
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?