【问题标题】:Spring Boot : BeanFactoryPostProcessor's postProcessBeanFactory not getting calledSpring Boot:BeanFactoryPostProcessor 的 postProcessBeanFactory 没有被调用
【发布时间】:2017-01-13 17:15:26
【问题描述】:

Spring constructor injection of SLF4J logger - how to get injection target class?

我想在 Spring boot 中实现类似的功能。

我尝试了针对这个问题给出的解决方案,但似乎 BeanFactoryPostProcessorpostProcessBeanFactory 方法从未在我的 Spring-Boot 应用程序中被调用

下面是方法的实现:

@SuppressWarnings("unused")
public class LoggerBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        String [] beanClasses = beanFactory.getBeanDefinitionNames();
        for(String beanName : beanClasses){
            Object beanObject = beanFactory.getBean(beanName);
            if(beanObject.getClass().isAnnotationPresent(Loggable.class)){
                try {
                    Field loggerField = beanObject.getClass().getDeclaredField("logger");
                    loggerField.setAccessible(true);
                    loggerField.set(beanObject, LoggerFactory.getLogger(beanObject.getClass()));
                }catch (NoSuchFieldException | IllegalAccessException e){
                    e.printStackTrace();
                }
            }
        }
    }

【问题讨论】:

  • 您是否将此类作为 bean 添加到配置中?
  • @KenBekov 我到底需要在 Spring Boot 项目中的什么地方添加它?
  • 将此作为public static @Bean 方法添加到您的配置中。只添加类不会有任何作用。

标签: java spring spring-boot dependency-injection autowired


【解决方案1】:

Spring 应该知道您已经添加了一个新的 BeanFactoryPostProcessor,因此您应该将其声明为配置中的 bean。 对于 xml 配置:

<bean class="your.package.LoggerBeanFactoryPostProcessor"  />

对于 JavaConfig:

@Bean
public static BeanFactoryPostProcessor loggerBeanFactoryPostProcessor() {
    return new LoggerBeanFactoryPostProcessor();
}

注意:请务必在您的 JavaConfig 中创建一个返回 BeanFactoryPostProcessor 静态的方法。没有它会正常工作,直到您想使用其他一些与弹簧相关的功能。例如使用属性@Value 将不起作用。

来自documentation

通过将此方法标记为静态,它可以被调用而不会导致 其声明 @Configuration 类的实例化,从而避免 上述生命周期冲突。但是请注意,静态 @Bean 方法不会针对范围和 AOP 语义进行增强,因为 上文提到的。这适用于 BFPP 案例,因为它们不是 通常由其他 @Bean 方法引用。

【讨论】:

  • 当我将XmlBeanDefinitionReader与DefaultListableBeanFactory一起使用时,没有调用XML方法BeanFactoryPostProcessor,我不知道为什么?
  • @YuJiaao 可能会发布一个单独的问题,其中包含代码示例和所有详细信息?
  • 我在githubstackoverflow.com/questions/48640952/…上发布了一个新问题和一个示例
猜你喜欢
  • 2019-01-02
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 2020-09-22
  • 1970-01-01
  • 2012-07-27
  • 2021-08-08
相关资源
最近更新 更多