Qual è la primavera di equivalente del punto di iniezione di CDI?
-
13-12-2019 - |
Domanda
Vorrei creare un metodo produttore di fagioli di primavera che è consapevole chi lo ha invocato, quindi ho iniziato con il seguente codice:
@Configuration
public class LoggerProvider {
@Bean
@Scope("prototype")
public Logger produceLogger() {
// get known WHAT bean/component invoked this producer
Class<?> clazz = ...
return LoggerFactory.getLogger(clazz);
}
}
.
Come posso ottenere le informazioni Who vuole ottenere il fagiolo iniettato?
Sto cercando un equivalente di InjectionPoint
di CDI nel mondo di primavera.
Soluzione
Per quanto ne so, la primavera non ha un tale concetto.
Allora solo la cosa che è consapevole del punto elaborato è un beanpostprocessore .
.
Esempio:
@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;
}
}
. Altri suggerimenti
Spring 4.3.0 abilita Punto di iniezione e dipendenzaDescriptor Parametri per metodi di produzione di bean:
@Configuration
public class LoggerProvider {
@Bean
@Scope("prototype")
public Logger produceLogger(InjectionPoint injectionPoint) {
Class<?> clazz = injectionPoint.getMember().getDeclaringClass();
return LoggerFactory.getLogger(clazz);
}
}
.
A proposito, Il problema per questa funzione SPR-14033 links a Commento su un post del blog quali collegamenti a questa domanda.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow