spring源码之AbstractApplicationContext#postProcessBeanFactory

AbstractApplicationContext#postProcessBeanFactory

这里设置允许在context上下文子类进行BeanFactoryPost后处理.


    // AnnotationConfigServletWebServerApplicationContext
    @Override
    protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        // 首先第一句代码就说明了这个方法的作用, 调用父类的postProcessBeanFactory()
        // 作者基于springboot 2.1.X内嵌web服务器进行的debug调试.
        // 这里是调用父类ServletWebServerApplicationContext#postProcessBeanFactory
        // 会在SWSACTX里面注册bean后处理器和一些web上下文环境特有的工作, 设置request或者respones的自动注入
        super.postProcessBeanFactory(beanFactory);
        if (this.basePackages != null && this.basePackages.length > 0) {
            this.scanner.scan(this.basePackages);
        }
        if (!this.annotatedClasses.isEmpty()) {
            this.reader.register(ClassUtils.toClassArray(this.annotatedClasses));
        }
    }

总结(这个方法不细讲):
 

  • 如果debug进去会调用到ServletWebServerApplicationContext#registerWebApplicationScopes
    这里面调用会涉及到两个方法ConfigurableListableBeanFactory#registerResolvableDependencyignoreDependencyInterface方法, 前者设计到@autowired注解, 可以通过此方法指定通过接口类型自动注入的类实例, 在实际使用这个方法提供了除了@Primary注解以外的另外一种方式指定当容器中一个接口有多个实现类的时候, 按照接口类型自动注入时, 注入的类. 可以通过实现BeanFactoryPostProcessor接口的方法在内部调用registerResolvableDependency进行指定.
  • 另外一个ignoreDependencyInterface方法与上面那个方法相反, 这个是忽略指定接口类型的自动注入, springboot默认会忽略BeanFactoryAware接口的自动注入.
    public class TestRegisterResolvableDependency implements BeanFactoryPostProcessor {
        @Override
       public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
           beanFactory.registerResolvableDependency(, new ComponentAImple());
       }    
    }

你可能感兴趣的:(spring,java,spring,spring,boot)