Ip2LocationAutoConfiguration.kt
package io.github.lishangbu.avalon.ip2location.autoconfigure
import com.ip2location.IP2Location
import io.github.lishangbu.avalon.ip2location.properties.IpToLocationProperties
import org.springframework.boot.autoconfigure.AutoConfiguration
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.core.io.ResourceLoader
import org.springframework.util.StreamUtils
/**
* IP2Location 自动配置
*
* 负责加载本地 BIN 数据库并注册官方 [IP2Location] Bean
*/
@AutoConfiguration
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(IP2Location::class)
@EnableConfigurationProperties(IpToLocationProperties::class)
class Ip2LocationAutoConfiguration {
/** 创建并预热官方 IP2Location 查询器 */
@Bean(destroyMethod = "close")
@ConditionalOnMissingBean(IP2Location::class)
fun ip2Location(
properties: IpToLocationProperties,
resourceLoader: ResourceLoader,
): IP2Location {
val resource = resourceLoader.getResource(properties.dbFileLocation)
return IP2Location().apply {
resource.inputStream.use { inputStream ->
open(StreamUtils.copyToByteArray(inputStream))
}
}
}
}