UGA Boxxx

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

【Spring Boot】AutoConfigureで特定のライブラリがクラスパス上に存在する場合に適用するようにしたい

Spring BootのAutoConfigureでライブラリを作る際に、特定のライブラリがクラスパス上に存在する場合にBean定義した設定を適用するようにしたい

AutoConfigureとは
3rdパーティライブラリなどに対して、ある設定をした上でSpring上で利用したい場合に、それをあらかじめAutoConfigure用のBean定義をして用意しておくことで、Spring Bootが自動でそれらをインポートする仕組み

ライブラリに対する共通的な設定をコンテキストをまたがって行いたい場合に有用

このとき例えば、AutoConfigureでライブラリをBean設定していたにもかかわらず、3rdパーティライブラリをクラスパスにないままそのライブラリの利用者を利用しようとすると実行時にエラーになる可能性がある

なので、特定のライブラリがクラスパス上に存在する場合に適用するようにしたい

@ConditionalOnClassを使う

Spring Bootは、AutoConfigureに設定条件を指定できるようにアノテーションを提供している

クラスがクラスパス上に存在する場合に適用するようにする条件をつけるには@ConditionalOnClassがあり、これを利用するのがよさそう

spring.pleiades.io

例えば、ObjectMapperに対する設定をAutoConfigureでしたい場合、当然ObjectMapper.classがある場合に設定をしたいので、以下のようにアノテーションをつける

@Configuration(proxyBeanMethods = false
@ConditionalOnClass({ObjectMapper.class})
public class MyJacksonAutoConfiguration {

  @Bean
  @Order(Ordered.LOWEST_PRECEDENCE)
  @ConditionalOnClass(Jackson2ObjectMapperBuilder.class)
  Jackson2ObjectMapperBuilderCustomizer myStandardObjectMapperBuilderCustomizer() {
    return new MyStandardObjectMapperBuilderCustomizer();
  }
}