【发布时间】:2019-07-14 06:30:24
【问题描述】:
在我的 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 定义一个实现 Geocoder 和 TravelDistanceCalculator 接口的 bean (HereApiClient)。
@Configuration
@ConditionalOnProperty("app.geolocation.enable")
class GeolocationConfig {
@Bean
fun hereApiClient(
geolocationProperties: GeolocationProperties,
restTemplate: RestTemplate
): HereApiClient =
HereApiClient(restTemplate, geolocationProperties)
}
app.geolocation.enable 在 application.yml 中定义为 true。
这里发生的情况是,在启动时,CoreConfig 中定义的 geocoder 和 travelDistanceCalculator 默认 bean 会被初始化,即使启用了 GeolocationConfig 并且 HereApiClient 在它们之后不久也被初始化。
我在这里错过了什么?
【问题讨论】:
-
两个配置都在同一个jar里吗?
-
是的,在同一个罐子里
-
好的,也许你可以在
CoreConfig上使用@ConditionalOnProperty(name="app.geolocation.enable",havingValue="false")
标签: spring spring-boot kotlin