springboot源码2--ApplicationContext对象初始化过程

本文以AnnotationConfigEmbeddedWebApplicationContext为例来说明初始化过程。首先看下这个类的构造函数。

    public AnnotationConfigEmbeddedWebApplicationContext() {
        this.reader = new AnnotatedBeanDefinitionReader(this);
        this.scanner = new ClassPathBeanDefinitionScanner(this);
    }

(1)首先看下AnnotatedBeanDefinitionReader这个类的初始化过程,省略调用过程,主要是调用AnnotationConfigUtils这个类的registerAnnotationConfigProcessors方法。

    public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
            BeanDefinitionRegistry registry, Object source) {

        DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);

        Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<BeanDefinitionHolder>(4);

        if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
            RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
            def.setSource(source);
            beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
        }

        if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
            RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
            def.setSource(source);
            beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
        }

        if (!registry.containsBeanDefinition(REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
            RootBeanDefinition def = new RootBeanDefinition(RequiredAnnotationBeanPostProcessor.class);
            def.setSource(source);
            beanDefs.add(registerPostProcessor(registry, def, REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
        }

        // Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
        if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
            RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
            def.setSource(source);
            beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
        }
......
        return beanDefs;
    }

这个方法很长,主要是将spring内部的一些类放到DefaultListableBeanFactory中beanDefinitionMap这个map中,供后面解析bean时使用,这里给出一下注册的bean。

    ConfigurationClassPostProcessor.class
        AutowiredAnnotationBeanPostProcessor.class
        RequiredAnnotationBeanPostProcessor.class
        CommonAnnotationBeanPostProcessor.class
        PersistenceAnnotationBeanPostProcessor.class
        EventListenerMethodProcessor.class
        DefaultEventListenerFactory.class

(2)实例化ClassPathBeanDefinitionScanner类。

 public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters,
         Environment environment, ResourceLoader resourceLoader) {

     Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
     this.registry = registry;

     if (useDefaultFilters) {
         registerDefaultFilters();
     }
     setEnvironment(environment);
     setResourceLoader(resourceLoader);
 }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容