January 4, 2018

Tanya 〜 Spring Boot勉強メモ Part1

新年を祝って、Spring Bootの勉強プロジェクトを始める。そのメモ。続かない可能性が高い。

今回、学ぶのは……

  • Spring Bootプロジェクト生成
  • DIとは何か
  • SpringにおけるDIの方法
  • 豆知識
    • 起動時に実行したい処理の書き方
    • ログのレベル
    • バナーを無効化
    • プロファイルのアクティブ化
    • Eclipse Tips

Spring Framework

  • Javaフレームワーク
  • いろんなモジュールの集合体
    • Spring Core
    • Spring MVC
    • Spring Data
    • Spring Security
    • Spring Batch
    • etc

Spring Boot

  • Spring Frameworkのモジュールや定番の外部ライブラリを組み合わせてアプリを作る
  • プロジェクトを始めやすいように、ビルド環境や各モジュール/ライブラリのコンフィグを(勝手に)準備してくれる

Spring Core

  • DIコンテナ(IoCコンテナ) ...今回のテーマは、ここ
  • AOPコンテナ

Eclipse

  • Oxygen(4.7)を使用
  • プラグインSpring IDE Coreを追加
    • http://dist.springsource.com/release/TOOLS/update/e4.7/
    • Run asにSpring Boot Appが無い場合は、Spring IDE Boot Supportも入れる

空っぽのプロジェクトを作る

  • Spring Starter Project
  • TanyaApplication.java ...メインクラス
  • application.properties ...プロパティファイル
  • pom.xml ...使用するSpringモジュールや外部ライブラリを管理

DI(Dependency Injection)、あるいはIoC(Inversion of Control)

Dependency(依存性)とは

class App {
  private Agent agent;
  ...
  void run() {
    agent.doThis();
    agent.doThat();
    agent.help();
  }
  ...
};
  • Appは、Agentに依存している。
  • Appにとってのagentが、「依存性」
  • Spring的にはbeanと呼ぶ(のかな?)

DI(依存性注入)とは

  • 誰かが、beanを生成して、agentフィールドへセットする(注入する、Injectする)必要がある
  • 従来はAppの仕事だったが、外注に出したい
    • 自分でやらずに、誰かにやってもらうので(Inversion of Control、制御の反転)
  • Appの代わりにそれをやってくれるのが、DIコンテナ(=Spring Core)

3つの側面に着目したい。

  • beanの定義(コンフィグ)
    • 「こんなbeanがありますよ」と、Springに伝える
  • beanの生成
    • newしたり、初期化したり、beanを使うための準備作業
  • beanの注入
    • 「ここに注入してね」と、Springに伝える
    • 注入先は、クラスのフィールドやメソッドの引数

beanの定義(コンフィグ)

beanを提供する側。方法は2種類。

  • annotation-base
    • beanのクラスに@Componentを付ける
  • java-base
    • 適当なクラスに、beanを返してくれるメソッドを実装
      • XxxConfig#getHogeBean()とか
    • そのクラスには、@Configurationを付ける
    • そのメソッドには、@Beanを付ける

@Beanと一緒に@Profileも付ければ、特定のプロファイルがアクティブなときだけbeanを定義できる。

beanの生成

  • 普通に、コンストラクタや、beanの初期化メソッドを実装しておく
  • Springに呼んでもらう
  • あるいは、@Beanなメソッドの中で呼ぶ

beanの注入

beanを使う側。方法は3種類。

  • field-base
    • 注入先のフィールドに@Autowiredを付ける
  • setter-base
    • そのフィールド用のsetterメソッドに、@Autowiredを付ける
  • constructor-base
    • コンストラクタに@Autowiredを付け、その中でフィールドにセット
    • そのクラスにコンストラクタが1つしか無いなら、@Autowired不要

豆知識

起動時に実行したい処理

@Bean
public CommandLineRunner runner() {
  return args -> {
    // ここに書く
  };
}

つまり、CommandLineRunner型のbeanを定義しておけば、Springが、起動時に呼んでくれる。

ログのレベル

application.properties
logging.level.root=WARN
logging.level.jp.dip.gpsoft=DEBUG

バナーを無効化

application.properties
spring.main.banner-mode=off

プロファイルのアクティブ化

application.properties
spring.profiles.active=hoge,fuga,piyo

Eclipse Tips

  • Ctrl+Shift+Oで、import文を整理
  • Ctrl+Shift+Fで、フォーマット
  • Ctrl+1で、コンパイルエラーのクイックフィックス
  • 最初だけRun Asから実行して、2度目以降はツールバーから実行
  • 実行方法(起動オプションとか)を変えたいなら、Run Configurations
Tags: tanya java spring