SpringBoot源码解析之创建应用程序上下文

SpringApplication.createApplicationContext()

    /**判断是否是WEB环境,是的话实例化AnnotationConfigEmbeddedWebApplicationContext作为应用程序上下文
    反之取AnnotationConfigApplicationContext作为应用程序上下文
    */
    ——》contextClass = Class.forName(this.webEnvironment ? DEFAULT_WEB_CONTEXT_CLASS : DEFAULT_CONTEXT_CLASS);
    /**实例化上下文,也就是通过BeanUtils生成上下文对象。调用空参构造函数进行实例化
    */
    ——》return (ConfigurableApplicationContext) BeanUtils.instantiate(contextClass);
        ——》1、先判断是否是接口,是的话报错
            2、反之使用Class.newInstance()实例化bean对象
            ——》再调用Constructor.newInstance(Object... initargs)
 

AnnotationConfigApplicationContext空参构造函数实例化过程

AnnotationConfigApplicationContext空参构造函数实例化过程
——》this.reader = new AnnotatedBeanDefinitionReader(this);
    ——》this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
        ——》this.context = new ConditionContextImpl(registry, environment, resourceLoader);
            /**
            推断BeanFactory得到DefaultListableBeanFactory
        private ConfigurableListableBeanFactory deduceBeanFactory(BeanDefinitionRegistry source) {
            if (source instanceof ConfigurableListableBeanFactory) {
                return (ConfigurableListableBeanFactory) source;
            }
            if (source instanceof ConfigurableApplicationContext) {
                return (((ConfigurableApplicationContext) source).getBeanFactory());
            }
            return null;
        }
        由于都实现了ConfigurableApplicationContext接口所以走(((ConfigurableApplicationContext) source).getBeanFactory());
        实际就是调用GenericApplicationContext.getBeanFactory(),返回DefaultListableBeanFactory
            */
            ——》this.beanFactory = deduceBeanFactory(registry);
            ——》this.environment = (environment != null ? environment : deduceEnvironment(registry));
            ——》this.resourceLoader = (resourceLoader != null ? resourceLoader : deduceResourceLoader(registry));
    /**
    注册@Autowired注解解析器ContextAnnotationAutowireCandidateResolver到容器,
    注册相关的后置处理器ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcessor
    RequiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor(JPA才会注册)
    EventListenerMethodProcessor,还有注册一个DefaultEventListenerFactory
    通过registry.registerBeanDefinition(beanName, definition);实现bean的注册,其中registry就是应用程序上下文AnnotationConfigApplicationContext
    而registry.registerBeanDefinition会调用DefaultListableBeanFactory的this.beanFactory.registerBeanDefinition(beanName, beanDefinition);
    */
    ——》AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
        //设置依赖排序器是new AnnotationAwareOrderComparator();
        ——》beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
        /**设置Autowire注解的候选自动装配解析器new ContextAnnotationAutowireCandidateResolver()
        也就是说我们的@Autowired注解就是通过这个bean进行解析的
        */
        ——》beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
        /**
        通过RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
        添加ConfigurationClassPostProcessor后置处理器到容器中
        */
        ——》beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
        /**
        添加AutowiredAnnotationBeanPostProcessor后置处理器
        */
        ——》beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
        /**
        添加RequiredAnnotationBeanPostProcessor后置处理器
        */
        ——》beanDefs.add(registerPostProcessor(registry, def, REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
        /**
        添加CommonAnnotationBeanPostProcessor后置处理器
        */
        ——》beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
        /**
        如果支持JPA,添加PersistenceAnnotationBeanPostProcessor后置处理器
        */
        ——》beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
        /**
        添加EventListenerMethodProcessor后置处理器
        */
        ——》beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
        /**
        添加DefaultEventListenerFactory
        */
        ——》beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
        ——》
——》this.scanner = new ClassPathBeanDefinitionScanner(this);
    ——》ClassPathBeanDefinitionScanner.ClassPathBeanDefinitionScanner()
    ——》registerDefaultFilters();
    /**
    向过滤器中添加this.includeFilters.add(new AnnotationTypeFilter(Component.class));
    
    includeFilters.add(new AnnotationTypeFilter(((Class) ClassUtils.forName("javax.inject.Named", cl)), false));
    也就是让基于注解的解析器支持JSR-250的javax.inject.Named
    includeFilters.add(new AnnotationTypeFilter(((Class) ClassUtils.forName("javax.annotation.ManagedBean", cl)), false));
    也就是让基于注解的解析器支持JSR-330的javax.annotation.ManagedBean
    */
    ——》ClassPathScanningCandidateComponentProvider.registerDefaultFilters()
 

总结

至此,创建应用上下文走玩,主要做了三步,1、根据环境配置去实例化AnnotationConfigApplication或者AnnotationConfigEmbeddedWebApplicationContext

2、注册@Autowired注解解析器ContextAnnotationAutowireCandidateResolver到容器,
    注册相关的后置处理器ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcessor
    RequiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor(JPA才会注册)
    EventListenerMethodProcessor,还有注册一个DefaultEventListenerFactory

3、向过滤器中添加this.includeFilters.add(new AnnotationTypeFilter(Component.class)),添加基于注解的解析器支持JSR-250的javax.inject.Named,添加基于注解的解析器支持JSR-330的javax.annotation.ManagedBean

创建应用程序上下文所用到的设计模式

1、

你可能感兴趣的:(SpringCloud)