やる気がストロングZERO

やる気のストロングスタイル

【SpringBoot】autoconfigureについて

SpringBootで何かライブラリを使う時、pom.xmlのdependenciesに記載すればもうDIコンテナから使えるオブジェクトが取得できてしまう。
これは自動構成:autoconfigureというSpringBootの機能で手がかからず良いように思うのだが、ずっと何かモヤモヤしていてそのあたりがようやくスッキリしたのでメモ。

ライブラリをSpringBootで使うために必要な作業とは

SpringBootで使いたいライブラリは、別にSpringBootの為に作られたわけではない場合がおおい。 そうでないと、SpringBoot以外では使えなくなってしまう。

そういったライブラリを使う場合、通常はインスタンス化するなどの作業が必要になる。 このときに色々と設定を引数で渡したりする。

以下のような感じ。

HogeLib hogeLib = new HogeLib(色々設定引数); // ライブラリをインスタンス化する。
hogeLib.someFunction(); // 便利機能が利用できる。

このライブラリをSpringBootのお作法で使うには、このインスタンス化の作業をDIコンテナに任せることになる。 つまり、Beanとして登録しておくことになる。

具体的には以下のようなConfigureクラスを用意することになるはず。

@Configuration
public class HogeConfiguration {

        @Bean
        public HogeLib hogeLib() {
                return new HogeLib(色々設定引数)
        }
}

でも実際は何もしなくてもDIコンテナからこのHogeLibは取得できてしまう。なぜ。

autoconfigureはBean登録をやってくれていた

上記の疑問の答えはautoconfigureだった。
org.springframework.boot:spring-boot-autoconfigure

これは
org.springframework.boot:spring-boot-starter
の依存に含まれていて特に意識しなくても使っていることになる。

この中で上記したBeanの登録作業を実際にやってくれている。

autoconfigureの内部を見てみると、たくさんのライブラリ用のConfigureクラスとPropertiesクラスがあり、これらを使ってBeanにライブラリのインスタンスを登録する処理が書かれている。 つまり、よく使われる代表的なライブラリは事前に初期設定を用意してくれていたのだった。

逆にいうとそれ以外のライブラリはもちろん自分でConfigureクラスを書いてbeanに登録する記述を書かなければならない。

スッキリした。

個人的に、こういった自動でいろいろやってくれる類のものは便利なのだが、何を自動でやってくれているのかを理解できるまで非常に落ち着かない。 なぜかうまく行かない時に手の打ち様がないという状態にさらされているのが怖い。