我遇到了 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

    谢谢 !

    最佳答案

    如果你更仔细地查看日志,你会看到这些行



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

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

    Here 是一篇不错的文章,提供了更多相关信息。

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

    关于spring - 不会为 bean 调用 BeanPostprocessor,这些 bean Autowiring 为 map 列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49492858/

    10-10 18:53