Spring BootのAutoConfigureでライブラリを作る際に、特定のライブラリがクラスパス上に存在する場合にBean定義した設定を適用するようにしたい
AutoConfigureとは
3rdパーティライブラリなどに対して、ある設定をした上でSpring上で利用したい場合に、それをあらかじめAutoConfigure用のBean定義をして用意しておくことで、Spring Bootが自動でそれらをインポートする仕組みライブラリに対する共通的な設定をコンテキストをまたがって行いたい場合に有用
このとき例えば、AutoConfigureでライブラリをBean設定していたにもかかわらず、3rdパーティライブラリをクラスパスにないままそのライブラリの利用者を利用しようとすると実行時にエラーになる可能性がある
なので、特定のライブラリがクラスパス上に存在する場合に適用するようにしたい
@ConditionalOnClassを使う
Spring Bootは、AutoConfigureに設定条件を指定できるようにアノテーションを提供している
クラスがクラスパス上に存在する場合に適用するようにする条件をつけるには@ConditionalOnClass
があり、これを利用するのがよさそう
例えば、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(); } }