始めに
こんにちは。
今回はSpringBootを一から勉強したので、学んだことをできるだけ噛み砕いて自分なりにまとめてみました。
この記事では具体的な実装方法は説明しないので、「まずはSpring Bootがどのようなものなのかなんとなく知りたい」と思っている方に活用していただけると幸いです。
この記事の対象者
・Spring Bootの学習を始めた方
・Spring Bootとはそもそも何か知りたい方
・Javaの概要を理解している方
この記事で伝えること
・Spring Bootとは何か
・Spring Bootの特徴(DI・AOP)
Spring Bootとは?
まずは、そもそもSpring BootとはどのようなものかSpring Frameworkと共に説明します。
Spring Frameworkとは?
Java開発において利用できるフレームワークの 集合体 のこと。
※「Spring」と縮めて呼ばれているものは、Spring Frameworkのことを指している。
Spring Frameworkは開発を効率化するための様々な機能を提供しており、それぞれの機能ごとにフレームワークが存在している。
そのため実現したいシステムに応じて使用するフレームワークを選ぶことができる。
フレームワーク | 提供する機能の概要 |
---|---|
Spring MVC | Webアプリケーションを簡単に作成する機能を提供 |
Spring Data | データアクセスに関する機能提供 |
Spring Batch | バッチ処理機能を提供 |
Spring Security | 認証認可の機能を提供 |
※「フレームワーク」とは
開発を簡単にするための「骨組み」のこと。
フレームワークを使うことで全てのプログラムを一から作る必要がないため、開発効率が上がる。
Spring Bootとは?
Spring Frameworkに含まれるフレームワークの一つで、 Spring Frameworkの機能を使いやすくするため のフレームワーク。
Spring Frameworkは各フレームワークを使用するにあたってXMLファイル等の用意が必要であり、様々なフレームワークを提供しているが故に、環境設定が複雑になってしまうという問題があった。
これを解消するために作られたのがSpring Bootで、Spring Bootでは使いたい機能を選ぶだけで自動で初期設定を行ってくれる。
SpringBootプロジェクトの立ち上げ方法
eclipse(Pleiades ALL in One)でのSpring Bootプロジェクトの作成方法を簡単に説明します。
①パッケージ・エクスプローラーで右クリックし、「新規」>「Spring スターター・プロジェクト」を選択
②「名前」「タイプ」「パッケージ」などを任意に設定して「次へ」
③Spring BootのバージョンとSpring Bootプロジェクトで使用する機能を選択し、「次へ」
※今回はビルドツールとしてMavenを選んだため、作成したプロジェクト配下にpom.xmlが自動で生成されている。
pom.xmlを見てみると、③で選択した機能がdependency(依存関係)として定義されていることがわかる。
SpringBootの特徴
ここからはSpringBoot(正しくはSpring Framework)のコア機能である 「DI」 と 「AOP」 について説明します。
結論、この二つの機能は 「システムの開発効率・保守性を高める」 ためのものです。
①DI
「Dependency Injection」の略で、「依存性の注入」と訳される。
この機能を「DIコンテナ」が担っている。
「依存性」とは?
「依存性」とは、 あるクラス(=使う側)が他のクラス(=使われる側)を利用している こと。
Javaには以下2種類の依存がある。
この2種類の依存では、「使われる側クラス」に変更があった場合、 「使う側クラス」の修正が必要 になる。
1. クラス依存
「使う側クラス」で「使われる側クラス」をインスタンス化し、メソッドを呼び出すこと。
【「使われる側クラス」に修正が入った場合】
①「使われる側クラス」のインスタンスを代入する変数の型の修正
②「使われる側クラス」のインスタンス化処理の修正
③「使われる側クラス」のメソッド呼び出し処理を修正
2. インターフェース依存
「使う側クラス」で「使われる側クラス」をインターフェース型でインスタンス化し、メソッドを呼び出すこと。
【「使われる側クラス」に修正が入った場合】
①「使われる側クラス」のインスタンス化処理の修正
このように、Javaには2種類の依存があるが、「インターフェース依存」は「クラス依存」よりも修正箇所が少なくなり、「低依存」な状態にできるというメリットがある。
しかし、「インターフェース依存」でも「使う側クラス」の修正は必要であり、
「使う側クラス」が複数ある場合、修正漏れが起こる可能性が出てしまう。
この問題を解消してくれるのがDIの機能。
DIコンテナの役割
DIコンテナは 「使われる側クラス」をインスタンス化し、そのインスタンスを「使う側クラス」に注入 する。
「クラス依存」と「インターフェース依存」に置いて、インスタンス生成はnewキーワードを用いて「使う側クラス」で行っているが、このインスタンス生成を代わりに行ってくれるのがDIコンテナ。
※生成されたインスタンスは「Bean」と呼ばれる
DIプログラムの実装
DIコンテナにインスタンス生成を行ってもらい、そのインスタンスを利用するために必要なのは、下記のように「アノテーションを付与する」ことである。
①使われる側クラスに 「@Component 」アノテーションを付与する
※「@Controller」「@Service」「@Repository」もインスタンス生成アノテーション。
②使う側クラスで、インスタンスの参照を受け取るためのフィールドを宣言し、フィールドに 「@Autowired」アノテーションを付与する
Spring Bootは起動時に、「@Component」など対象のアノテーションが付与されたクラスを探し、インスタンス化する。それらをDIコンテナに登録しておき、「@Autowired」が付与されている箇所に注入している。
DIのメリット
-
「使う側クラス」の修正が不要になる
DIコンテナにインスタンス化を行ってもらうことで、「使われる側クラス」に修正が入った場合でも、「使う側クラス」の修正は不要 になる。
「使われる側クラス」に付与しているアノテーションを修正するだけで、「使う側クラス」で使用したいインスタンスを変えることができる。
②AOP
「Aspect Oriented Programming」の略で、「アスペクト指向プログラミング」と訳される。
「アスペクト指向プログラミング」とは?
アスペクト指向プログラミングとは、簡単に説明すると「 共有する処理を抜き出してまとめて管理する仕組み 」のこと。
アスペクト指向では、プログラムは以下の二つの要素で構成されていると考える。
「横断的関心事」とは、実現したい機能の本質的な部分ではないが、
品質・保守の観点で必要になるもののことで、データベース接続後の例外処理や、ログ出力処理などを指す。
「中心的関心事」・「横断的関心事」をまとめて記述すると、以下のようなデメリットがある。
- 処理が増えることでソースが読みづらくなる
- 処理を入れ忘れる可能性がある
これを防ぐために、 「中心的関心事」と「横断的関心事」を分け、「横断的関心事」をまとめて管理する のがAOPの機能である。
AOPの実装
まずはAOPを理解するにあたり、知っておく必要がある用語を紹介する。
用語 | 意味 |
---|---|
Advice | 横断的関心事を実装したメソッド |
Aspect | Adviceをまとめたクラス |
JointPoint | Adviceを実行するタイミング ※メソッドの実行前・実行後などを指定できる |
PointCut | Adviceを実行する場所(クラスやメソッド) ※「メソッド名がgetで始まるもの」といった条件を指定できる |
横断的関心事を記述するAspectクラスには、 「@Aspect」「@Component」 アノテーションを付与する。
各Adviceでは、JointPointとPointCutを指定することで、処理がいつ・どこで実行されるかを決める。
@Before(“execution(* com.example.Controller.get*(..))”)
= com.example.Controllerクラス配下の名前が getから始まるメソッド の 前 に実行する
AOPのメリットとは?
-
共有処理を統一化できる
処理を1箇所にまとめることで、担当者によって実装が異なるといった状況を防ぐことができる。
また、共通処理に修正が入った場合も1箇所を修正すれば良いため、修正漏れを防ぐことができる。 -
コードの可読性が上がる
横断的関心事を共通処理として抜き出すことで、処理の長さを短くすることができる。 -
開発効率が上がる
作成したプログラムの動作確認をするために、全てのメソッドに確認用のログを入れる場合を考えてみる。
Aspectを実装しない場合は、全てのメソッドに処理を追加し、確認が終わったら削除しなければならない。
Aspectを実装することで、「全てのメソッドに処理を追加する」という手間を省くことができるのと、「処理を消し忘れる」可能性を無くすことができる。