自動設定を体験する
ここでは、Spring Bootの自動設定機能(AutoConfiguration)を体験するために、筆者がよく利用するGsonというライブラリを使います。例えば、リスト1のコードを記述してみます。
@SpringBootApplication public class SampleApplication { private static final Logger log = LoggerFactory.getLogger(SampleApplication.class); @Autowired Gson gson; // (1) 自動でGsonオブジェクトを設定する public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(SampleApplication.class,args); SampleApplication app = context.getBean(SampleApplication.class); app.start(context); } public void start(ApplicationContext context){ log.info("gson : {} ",gson); // (2) 作成されたオブジェクトがあるか確認する : (省略) } }
(1)でGsonオブジェクトを@Autowired機能を使って自動でオブジェクトを設定します。そして(2)で作成されたオブジェクトがあるか確認します。
実際に実行した結果がリスト2です。
2019-11-20 17:27:16.313 INFO 63974 --- [ main] c.c.springboot.main.SampleApplication : Starting SampleApplication on masak.local with PID 63974 (/Users/musvia/vmshare/codezine/springboot-starter-samle/build/classes/java/main started by musvia in /Users/musvia/vmshare/codezine/springboot-starter-samle) 2019-11-20 17:27:16.315 INFO 63974 --- [ main] c.c.springboot.main.SampleApplication : No active profile set, falling back to default profiles: default 2019-11-20 17:27:16.664 INFO 63974 --- [ main] c.c.springboot.main.SampleApplication : Started SampleApplication in 0.652 seconds (JVM running for 0.987) 2019-11-20 17:27:16.665 INFO 63974 --- [ main] c.c.springboot.main.SampleApplication : gson : class com.google.gson.Gson
しかし、サンプルコードではGsonオブジェクトをどのように作成するかわかるコードは1行も記述していません。
そこで、以下の疑問が生じるはずです。
- Gsonオブジェクトの作成方法はどこで指定されているのか
- Gsonオブジェクトの作成方法をカスタマイズしたい場合にはどうすればよいのか
- 設定ファイルでどこまで指定ができるのか
- Gsonを使わないプログラムの場合にはどうなるのか
- どのライブラリがSpring Bootで対応しているのか
- 独自の自動設定クラスを作るにはどうすればよいのか
これらの疑問はSpring Bootの自動設定(Autoconfigure)を理解すれば解消できます。
自動設定機能(Autoconfigure)の概要
Spring Bootのアプリケーションを起動する場合には、SpringApplicationクラスを通じて実行しています。
このクラス内ではさまざまな処理を行っていますが、自動設定に関連する処理に着目し関連するクラスの関係を示したものが図1です。
- (1)SpringApplicationは@EnableAutoConfiguraionアノテーションで自動設定を有効にします。
- (2)@EnableAutoConfigurationの@Importアノテーションで、自動設定を行うクラスであるAutoConfigurationImportSelectorクラスを指定しています。
- (3)AutoConfigurationImportSelectorクラス内で、SpringFactoriesLoaderクラスを利用してMETA-INF/spring.factoriesファイルを参照します。
- (4)META-INF/spring.factoriesに記述してあるorg.springframework.boot.autoconfigure.EnableAutoConfigurationの値に各種ライブラリの設定クラスを読みます。
また、実際のspring.factoriesのファイルの内容がリスト3です。
# Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\ org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\ // (省略) org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\ org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\ // (省略)
このファイルを見るとさまざまなライブラリ向けの設定ファイルクラスを指定していることがわかります。つまり、これらのクラスが初期状態でSpring Bootが対応しているライブラリやフレームワークということになります。
そして、その記述の中にGsonAutoConfigurationというクラスの指定があり、そのコードを参照するとGsonオブジェクトを作成していることがわかります。
また、これらのクラスでどのような@Beanが作成されているかはSpring Reference Documentなどを参照することでもわかります。