What is the Spring DI equivalent of CDI's InjectionPoint?

后端 未结 2 713
小鲜肉
小鲜肉 2020-12-15 22:43

I would like to create a Spring\'s bean producer method which is aware who invoked it, so I\'ve started with the following code:

@Configuration
public class          


        
2条回答
  •  失恋的感觉
    2020-12-15 23:10

    As far as I know, Spring does not have such a concept.

    Then only thing that is aware of the point that is processed is a BeanPostProcessor.


    Example:

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

提交回复
热议问题