何気なく使っていた Spring Boot の AutoConfiguration をおさらいする
https://docs.spring.io/spring-boot/docs/2.5.x/reference/html/using.html#using.auto-configuration
AutoConfigurationとは自分でBean実装をしなくても、 jarの依存関係に基づいて Spring アプリケーションを自動的に構成する機能
AutoConfigure用のBean定義ファイル(コンフィギュレーションクラス)がインポートされ、インポートされたコンフィギュレーションクラスの定義に従ってBean定義が行われる
AutoConfigureの有効化
SpringApplication.run()
の第一引数に@SpringBootApplicationアノテーションがついたコンフィギュレーションクラスを渡すか、@EnableAutoConfigurationアノテーションがついたコンフィギュレーションクラスを渡す
コンフィギュレーションクラスとは@Configurationアノテーションがついたクラスのことだが、クラスに直接付与されていなくても付与したアノテーションの内部のどこかで付与されていればよい
こうすることでエントリポイントとして起動時にスキャンし、必要なBeanの設定が行われる
適用順序
他のコンフィギュレーションクラスと設定順序に依存がある場合は
- @AutoConfigureAfter
- @AutoConfigureBefore
- @AutoConfigureOrder
を使用する
ある条件の時だけ有効化する
Bean設定しておいたものを、ある条件の時だけ有効化したい
その時は@Conditionalaアノテーションを使う
例えば、指定したクラスがクラスパス上に存在する場合に適用したい場合は@ConditionalOnClass
を使うなど
種類が多いのでこれは別の機会にまとめる
Spring Conditional Annotations | Baeldung
無効化
AutoConfigureを有効化すると、Spring Bootが用意していたAutoConfigure用のコンフィギュレーションクラスがインポートされる
その中でもし無効化したものがあれば以下のようにすることで無効化される
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) public class MyApplication { }
これは以下のように application.propertiesファイルに記述するでも良い
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
依存注入
Bean設定されたコンフィギュレーションクラスは、コンストラクターインジェクションにより依存関係が解決された状態でコンストラクターで呼び出すことが可能になる
例えば、RiskAssessorがBean登録されている場合、以下のようなサービスクラスで RiskAssessor がコンストラクタで呼び出すことができる
@Service public class MyAccountService implements AccountService { private final RiskAssessor riskAssessor; public MyAccountService(RiskAssessor riskAssessor) { this.riskAssessor = riskAssessor; } // ... }