Я создаю в своей компании кучу стартеров весенней загрузки для всех наших микросервисов. Я начал с ведения журнала, создав следующий класс конфигурации. Мы используем 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 и чистого решения.
Есть совет? Заранее спасибо!