@ConditionalOnMissingBean 알아보기
개요
Spring Bean 충돌을 해소하기 위해 @ConditionalOnMissingBean을 사용해 보다가 조금 더 자세하게 알아보고 싶어 정리해보고자 합니다.
@ConditionalOnMissingBean이란?
이름으로도 유추해 볼 수 있듯이 BeanFactory에 Class의 Type 혹은 동일한 이름의 Bean이 존재하지 않는 조건인 경우에만 Bean을 등록합니다.
Spring 환경에서 동일한 이름의 Bean이 존재하는 경우에는 해당 Bean을 등록하지 않으며 이미 등록된 Bean을 사용하게끔 할 수 있습니다.
Spring Boot와 같이 자동구성을 지원하기 위한 클래스에 사용이 추천됩니다.
JacksonAutoConfiguration 예제
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(Jackson2ObjectMapperBuilder.class)
static class JacksonObjectMapperConfiguration {
@Bean
@Primary
@ConditionalOnMissingBean
ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
return builder.createXmlMapper(false).build();
}
}
SpringBoot에서 지원하는 JacksonAutoConfiguration 클래스의 예시를 보면 @ConditionalOnMissingBean이 선언되어 있습니다.
Spring의 빈 등록과정은 다음과 같습니다.
1. 사용자가 @Component등으로 등록한 빈들이 등록됨
2. AutoConfiguration에 의한 빈들이 등록됨
즉, 사용자가 ObjectMapper 클래스를 Bean으로 등록하면 SpringBoot는 @ConditionalOnMissingBean에 의해 자동설정을 지원하지 않습니다.
실제로 디버깅포인트를 찍어보면 AutoConfiguration에 의한 ObjectMapper가 등록됩니다.
JacksonCustomConfig 클래스 등록
@Configuration
class JacksonCustomConfig {
@Bean
fun customObjectMapper(): ObjectMapper{
return ObjectMapper()
}
}
사용자에 의해 ObjectMapper클래스가 빈으로 등록된 이후에는 디버깅포인트에 JacksonAutoConfiguration의 설정이 잡히지 않습니다.
참고자료
https://zion830.tistory.com/112