Что такое Spring DI, эквивалентный InjectionPoint CDI?
-
13-12-2019 - |
Вопрос
Я хотел бы создать метод производителя bean-компонентов Spring, который знает, кто его вызвал, поэтому я начал со следующего кода:
@Configuration
public class LoggerProvider {
@Bean
@Scope("prototype")
public Logger produceLogger() {
// get known WHAT bean/component invoked this producer
Class<?> clazz = ...
return LoggerFactory.getLogger(clazz);
}
}
Как я могу получить информацию ВОЗ хочет сделать инъекцию боба?
Я ищу какой-то эквивалент CDI InjectionPoint
в весеннем мире.
Решение
Насколько я знаю, в Spring нет такой концепции.
Тогда единственное, что знает о точке, которая обрабатывается, — это БинПостпроцессор.
Пример:
@Target(PARAMETER)
@Retention(RUNTIME)
@Documented
public @interface Logger {}
public class LoggerInjectBeanPostProcessor implements BeanPostProcessor {
public Logger produceLogger() {
// get known WHAT bean/component invoked this producer
Class<?> clazz = ...
return LoggerFactory.getLogger(clazz);
}
@Override
public Object postProcessBeforeInitialization(final Object bean,
final String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(final Object bean,
final String beanName) throws BeansException {
ReflectionUtils.doWithFields(bean.getClass(),
new FieldCallback() {
@Override
public void doWith(final Field field) throws IllegalArgumentException, IllegalAccessException {
field.set(bean, produceLogger());
}
},
new ReflectionUtils.FieldFilter() {
@Override
public boolean matches(final Field field) {
return field.getAnnotation(Logger.class) != null;
}
});
return bean;
}
}
Другие советы
Spring 4.3.0 позволяет Точка инъекции и параметры DependencyDescriptor для методов создания bean-компонентов:
@Configuration
public class LoggerProvider {
@Bean
@Scope("prototype")
public Logger produceLogger(InjectionPoint injectionPoint) {
Class<?> clazz = injectionPoint.getMember().getDeclaringClass();
return LoggerFactory.getLogger(clazz);
}
}
Кстати, проблема с этой функцией SPR-14033 ссылки на комментарий к сообщению в блоге что связано с этим вопросом.
Не связан с StackOverflow