Spring Boot事始め
仕事でJavaを扱うようになったので、SpringBootと仲良くなる方向性になりました🐕
エンジニアなりたての頃にEclipse(pleadis)の重さに悩まされ、Javaのわからなさ・書けなさに悩んだ記憶から早3年…
今回はフレームワークの根幹であるSpringBootについて先輩からご教示いただいたので、メモっていきます。
SpringBootとは
Javaプラットフォーム向けのオープンソースライブラリ。 アスペクト指向プログラミングを根幹にしたフレームワークで、webやsecurity、batch処理などの機能を備えている。 DI機能を使うことができ、環境ごとに使う関数を切り替える事が出来るなどの旨味がある。
DIとは
依存性の注入のこと。 クラス内で使用するメンバにアノテーションを付与することで、宣言と初期化が同時に出来る。
そのインスタンスは外から参照されるものの、その状態を気にせず使用できるところがポイント。 イミュータブルなオブジェクトの作成が推奨される設計の場合非常に便利。ただし、意図的に初期化ができてしまう機能も存在する為、プロジェクトの設計方針に応じて使用する。
依存性の登録方法
①自動(コンパイル時によしなに依存性の注入を行う)
@Component ∟@Service ∟@Controller
②手動(作成者が意図的に依存性の注入を行う)
- XML - JavaConfig
@Component
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Indexed
などのinterface群により定義されている。 ルートのクラスで@ComponentScanを付与することによって、このアノテーションが付いた下位クラスを探す。 後述するBeanをDIコンテナに登録する為のアノテーション。
JavaConfig
DIコンテナを登録する為のクラスファイル。定義ファイルなどではない。 @Beanアノテーションを付与することによって、メソッド名と同名のBeanが作成される。 インスタンスはSingletonに扱われ、DIコンテナ1つにつき1つ作成される。
Bean
ライフサイクルの衝突を避けてインスタンスを静的に生成する。 あるクラスのメンバをBean(豆)のように内包した形で上記を実現する。
依存性の種類
①フィールドインジェクション
②コンストラクタインジェクション
③セッターインジェクション
①フィールドインジェクション
独自に依存性の注入を行うや方法。
public class ImageThumbnail { @Autowired private ImageRepository imageRepository; public ImageThumbnail() { } }
②コンストラクタインジェクション
springに依存せず、独自に依存性の注入を行う方法。
public class ImageThumbnail { private ImageRepository imageRepository; public ImageThumbnail(ImageRepository imageRepository) { this.imageRepository = imageRepository; } }
③セッターインジェクション
lombokを使用してgetter, setterを出力する方法。 イミュータブルではなくなってしまう為、扱いに注意が必要。
public class ImageController { private ImageRepository imageRepository; public void setImageRepository(ImageRepository imageRepository) { this.imageRepository = imageRepository; } }
Springに捧げるとよしなにセットしてくれる
@Service public class ImageService { … }