UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Spring Boot】AutoConfiguration おさらい

何気なく使っていた 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アノテーションを使う

https://docs.spring.io/spring-boot/docs/2.5.x/reference/htmlsingle/#features.developing-auto-configuration.condition-annotations

例えば、指定したクラスがクラスパス上に存在する場合に適用したい場合は@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;
    }

    // ...

}

参考

Spring BootのAutoConfigureの仕組みを理解する #Java - Qiita