Spring InjectPoint и классы @Configuration в kotlin - PullRequest
0 голосов
/ 05 августа 2020

Я создаю в своей компании кучу стартеров весенней загрузки для всех наших микросервисов. Я начал с ведения журнала, создав следующий класс конфигурации. Мы используем Log4j, завернутый в наш пользовательский регистратор CustomLogger.

@Configuration
class LoggerAutoConfiguration {

    @Bean
    @Scope(BeanDefinition.SCOPE_PROTOTYPE)
    fun logger(injectionPoint: InjectionPoint): Logger {
        val clazz = injectionPoint.methodParameter?.containingClass ?: injectionPoint.field?.declaringClass
        return CustomLogger(LogManager.getLogger(clazz))
    }

}

Мне очень нравится, как работает InjectionPoint, потому что он позволяет вводить и тестировать регистратор.

Проблема возникает когда я пытаюсь ввести регистратор в beans, который я определяю в других классах @Configuration.

@Configuration
@AutoConfigureAfter(LoggerAutoConfiguration::class)
class EventProducerAutoConfiguration {

    @Bean
    fun eventBus(injectionPoint: InjectionPoint, notificationMessagingTemplate: NotificationMessagingTemplate, objectMapper: ObjectMapper): EventProducer {
        val clazz = injectionPoint.methodParameter?.containingClass ?: injectionPoint.field?.declaringClass
        return AmazonEventProducer(notificationMessagingTemplate, objectMapper, CustomLogger(LogManager.getLogger(clazz)))
    }

}

Есть ли способ повторно использовать метод logger класса LoggerAutoConfiguration в других @Configuration classes?

Еще хуже, когда bean-компонент внедряется в @Configuration класс библиотеки. Что, если меня не интересует, куда вводится bean-компонент, и мне нужен регистратор для создаваемого bean-компонента?

@Bean
fun httpLogWriter(objectMapper: ObjectMapper): HttpLogWriter {
      return CustomHttpLogWriter(CustomLogger(LogManager.getLogger(CustomHttpLogWriter::class.java)), objectMapper)
}

Я не вижу более DRY и чистого решения.

Есть совет? Заранее спасибо!

...