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

后端 未结 2 704
小鲜肉
小鲜肉 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;
        }
    }
    
    0 讨论(0)
  • 2020-12-15 23:17

    Spring 4.3.0 enables InjectionPoint and DependencyDescriptor parameters for bean producing methods:

    @Configuration
    public class LoggerProvider {
    
        @Bean
        @Scope("prototype")
        public Logger produceLogger(InjectionPoint injectionPoint) {
            Class<?> clazz = injectionPoint.getMember().getDeclaringClass();
    
            return LoggerFactory.getLogger(clazz);
        }
    }
    

    By the way, the issue for this feature SPR-14033 links to a comment on a blog post which links to this question.

    0 讨论(0)
提交回复
热议问题