おもろいことしかやらない

🗣: バイクに乗ったり、ものづくりしたり、ひたすら寝たり。

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 {
…
}