Bean不会调用BeanPostprocessor,它们作为map列表自动装配

时间:2018-03-26 13:37:35

标签: spring

我面对BeanPostProcessors的非常奇怪(意外)的行为,让我们假设我们得到以下配置:

public class Test {

    public static void main(String[] args) {
        new AnnotationConfigApplicationContext(TestConfiguration.class);
    }

    @Configuration
    public static class TestConfiguration {

        @Bean
        public String bean1() {
            return "1";
        }

        @Bean
        public String bean2() {
            return "2";
        }

        @Bean
        public Integer bean3() {
            return 3;
        }

        @Bean
        public BeanPostProcessor postProcessor() {
            return new BeanPostProcessor() {
                @Override
                public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
                    return bean;
                }

                @Override
                public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                    System.out.println(beanName);
                    return bean;
                }
            };
        }
    }
}

因此,当我们运行此代码时,它会打印所有bean的名称:

  • bean1
  • bean2
  • bean3

使用指定的后处理器。

但是当我使用@Autowire注释时,为了拥有String类型的所有bean,这种类型的bean不是post-processed现有的后处理器,这似乎对我来说很奇怪。

此类配置的示例如下:

public class Test {

    public static void main(String[] args) {
        new AnnotationConfigApplicationContext(TestConfiguration.class);
    }

    @Configuration
    public static class TestConfiguration {

        @Autowired(required = false)
        private List<String> stringBeans = new ArrayList<>();

        @Bean
        public String bean1() {
            return "1";
        }

        @Bean
        public String bean2() {
            return "2";
        }

        @Bean
        public Integer bean3() {
            return 3;
        }

        @Bean
        public BeanPostProcessor postProcessor() {
            return new BeanPostProcessor() {
                @Override
                public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
                    return bean;
                }

                @Override
                public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                    System.out.println(beanName);
                    return bean;
                }
            };
        }
    }
}

spring core的版本是 4.3.8.RELEASE

Thx!

1 个答案:

答案 0 :(得分:3)

如果仔细查看日志,您会看到这些行

  

[主要] DEBUG   org.springframework.beans.factory.support.DefaultListableBeanFactory -   热切地缓存豆子豆#1;允许解决潜在的通告   参考文献

     

[主要] INFO    org.springframework.context.support.PostProcessorRegistrationDelegate $ BeanPostProcessorChecker    - Bean&#39; bean1&#39;类型[java.lang.String]不适合所有BeanPostProcessors处理(例如:不符合条件的   自动代理)

这是针对bean1的,你也会有类似的bean2日志。正如消息所说,bean1不符合Autoproxying的条件。

这有点鸡和蛋的问题。由于您的BeanPostProcessor代码位于同一个类中,因此无法完全创建bean,因此不会调用postProcessAfterInitialization

Here是一篇很好的文章,有关于此的更多信息。

一个简单的解决方法是将BeanPostProcessor代码移到单独的类中。