В моем приложении Spring Boot я хочу, чтобы bean-компоненты создавались, только если модуль не включен.
В CoreConfig я определил два bean-компонента (geocoder и travelDistanceCalculator), аннотированных @ConditionalOnMissingBean
, ссылающихся на интерфейсыbean-компоненты должны инициализироваться.
@Configuration
class CoreConfig {
private val logger = loggerFor<CoreConfig>()
@Bean
@ConditionalOnMissingBean(Geocoder::class)
fun geocoder(): Geocoder {
logger.warn("no Geocoder bean instance has been provided. Instantiating default.")
return object : Geocoder {
override fun getGeocode(address: String) = Coordinates.Unavailable
}
}
@Bean
@ConditionalOnMissingBean(TravelDistanceCalculator::class)
fun travelDistanceCalculator(): TravelDistanceCalculator {
logger.warn("no TravelDistanceCalculator bean instance has been provided. Instantiating default.")
return object : TravelDistanceCalculator {
override fun getTravelDistanceInKm(origin: Coordinates, destination: Coordinates) = Double.NaN
}
}
// other beans definitions...
}
Затем GeolocationConfig определяет bean-компонент (HereApiClient), реализующий интерфейсы Geocoder и TravelDistanceCalculator.
@Configuration
@ConditionalOnProperty("app.geolocation.enable")
class GeolocationConfig {
@Bean
fun hereApiClient(
geolocationProperties: GeolocationProperties,
restTemplate: RestTemplate
): HereApiClient =
HereApiClient(restTemplate, geolocationProperties)
}
app.geolocation.enable
определяется как true
в application.yml.
В данном случае происходит то, что при запуске bean-компоненты по умолчанию для геокодера и travelDistanceCalculator, определенные в CoreConfig, инициализируются, даже если включен GeolocationConfig, а вскоре после них инициализируется HereApiClient.
Чего мне здесь не хватает