Pregunta

Me gustaría crear un método de productor de frijoles de primavera que sea consciente de quién lo invocó, así que empezó con el siguiente código:

@Configuration
public class LoggerProvider {

    @Bean
    @Scope("prototype")
    public Logger produceLogger() {
        // get known WHAT bean/component invoked this producer 
        Class<?> clazz = ...

        return LoggerFactory.getLogger(clazz);
    }
}

¿Cómo puedo obtener la información quienes quiere obtener el frijol inyectado?

Estoy buscando un equivoralente de >CDI GENACODICETAGODODE IN SPRING WORLD.

¿Fue útil?

Solución

Por lo que sé, la primavera no tiene tal concepto.

Entonces, lo único que es consciente del punto que se procesa es un BEANPOSTPROCESOR .


Ejemplo:

@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;
    }
}

Otros consejos

Spring 4.3.0 habilita Parámetros de inyección y dependencyDescriptor para los métodos de producción de frijoles:

@Configuration
public class LoggerProvider {

    @Bean
    @Scope("prototype")
    public Logger produceLogger(InjectionPoint injectionPoint) {
        Class<?> clazz = injectionPoint.getMember().getDeclaringClass();

        return LoggerFactory.getLogger(clazz);
    }
}

Por cierto, el problema para esta función SPR-14033 enlaces a A Comentario en una publicación de blog que enlaza a esta pregunta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top