以ClassPathXmlApplicationContext为例,分析Spring启动步骤



Spring启动步骤



    1、ClassPathXmlApplicationContext



        1.1    ClassPathXmlApplicationContext.setConfigLocations()    设置配置文件



        1.2    ClassPathXmlApplicationContext.refresh()                    根据配置文件进行刷新



        1.3    AbstractApplicationContext.refresh()



        1.4    AbstractApplicationContext.obtainFreshBeanFactory()    初始化BeanFactory



        1.4.1    AbstractRefreshableApplicationContext.refreshBeanFactory()        刷新BeanFactory



        1.4.2    AbstractRefreshableApplicationContext.createBeanFactory()        创建DefaultListableBeanFactory



        1.4.3    AbstractXmlApplicationContext.loadBeanDefinitions(DefaultListableBeanFactory beanFactory)     给beanFacroty加载BeanDefinition



        1.4.3.1    创建XmlBeanDefinitionReader,    给XmlBeanDefinitionReader设置beanFactory



        1.4.4    AbstractXmlApplicationContext.loadBeanDefinitions(XmlBeanDefinitionReader reader)                通过XmlBeanDefinition加载BeanDefinition



        1.4.4.1    AbstractXmlApplicationContext.getConfigResources()                获取资源配置信息



        1.4.4.2    AbstractXmlApplicationContext.getConfigLocations()                获取资源配置字符串



        1.4.4.2.1    XmlBeanDefinitionReader.loadBeanDefinitions(configLocations)    加载资源配置



        1.4.4.2.2    AbstractBeanDefinitionReader.loadBeanDefinitions(String… locations)    根据资源配置字符串加载beanDefinition



        1.4.4.2.3    AbstractBeanDefinitionReader.loadBeanDefinitions(String location, Set<Resource> actualResources)    根据资源配置字符串加载beanDefinition



        1.4.4.2.4    AbstractBeanDefinitionReader.getResourceLoader()                    获取resourceLoader,即ClassPathXmlApplicationContext



        1.4.4.2.5    AbstractApplicationContext.getResources(String locationPattern)    获取Resources    



        1.4.4.2.6    AbstractApplicationContext.resourcePatternResolver.getResources(String locationPattern)     获取Resources



        1.4.4.2.7    PathMatchingResourcePatternResolver.getResources(String locationPattern)        获取Resources



        1.4.4.2.8    getResourceLoader().getResource(locationPattern)                即ClassPathXmlApplicationContext.getResource(locationPattern)



        1.4.4.2.9    DefaultResourceLoader.getResource(locationPattern)



        1.4.4.2.10    DefaultResourceLoader.getResourceByPath(location)            



        1.4.4.2.11    return new ClassPathContextResource(path, getClassLoader());



        1.4.4.2.12    返回1.4.4.2.3



        1.4.4.2.13    AbstractBeanDefinitionReader.loadBeanDefinitions(Resource… resources)    根据加载出的ClassPathContextResource读取配置



        1.4.4.2.14    XmlBeanDefinitionReader.loadBeanDefinitions(EncodedResource encodedResource)



        1.4.4.2.15    XmlBeanDefinitionReader.doLoadBeanDefinitions(encodedResource.getResource().getInputStream())    从resource中获取输入流,交给下一步执行



        1.4.4.2.16    XmlBeanDefinitionReader.doLoadBeanDefinitions(InputSource inputSource, Resource resource)



        1.4.4.2.17    Document doc = this.documentLoader.loadDocument(

                    inputSource, getEntityResolver(), this.errorHandler, validationMode, isNamespaceAware());



                            加载Document配置



        1.4.4.2.18    XmlBeanDefinitionReader.registerBeanDefinitions(Document doc, Resource resource)    根据Document 来加载配置



        1.4.4.2.19    XmlBeanDefinitionReader.createBeanDefinitionDocumentReader()        即创建DefaultBeanDefinitionDocumentReader



        1.4.4.2.20    documentReader.registerBeanDefinitions(doc, createReaderContext(resource))    注册doc,并且用resource创建上下文



        1.4.4.2.21    DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(doc.getDocumentElement())    执行解析并注册



        1.4.4.2.22    BeanDefinitionParserDelegate delegate = DefaultBeanDefinitionDocumentReader.createDelegate()    创建BeanDefinitionDelegate代理



        1.4.4.2.23    DefaultBeanDefinitionDocumentReader.preProcessXml(root)    空操作



        1.4.4.2.24    DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(root,this.delegate)    用DeanDefinitionParseDelegate代理解析root



        1.4.4.2.25    DefaultBeanDefinitionDocumentReader.processBeanDefinition     用DeanDefinitionParseDelegate代理解析root



        1.4.4.2.26    DefaultBeanDefinitionDocumentReader.processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate)



        1.4.4.2.27    BeanDefinitionHolder bdHolder=delegate.parseBeanDefinitionElement(ele)     解析bdHolder



        1.4.4.2.27.1        AbstractBeanDefinition beanDefinition = BeanDefinitionParserDelegate.parseBeanDefinitionElement(ele, beanName, containingBean)



        1.4.4.2.27.2        BeanDefinitionParserDelegate.createBeanDefinition(className,parent)



        1.4.4.2.27.3        BeanDefinitionReaderUtils.createBeanDefinition()



        1.4.4.2.27.4        BeanDefinitionReaderUtils.createBeanDefinition()            生成BeanDefinition,即:GenericBeanDefinition



        1.4.4.2.28    return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray);    返回步骤1.4.4.2.27



        1.4.4.2.29    BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());    



                            第一个参数为1.4.4.2.28生成的holder,第二个参数为DefaultListableBeanFactory



        1.4.4.2.30    registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());



        1.4.4.2.30.1    registry.beanDefinitionNames.add(beanName);



        1.4.4.2.30.2    registry.beanDefinitionMap.put(beanName, beanDefinition);



        1.4.4.2.30.3    registry.resetBeanDefinition(String beanName)    



        1.4.4.2.30.3.1    clearMergedBeanDefinition(beanName);



        1.4.4.2.30.3.2    destroySingleton(beanName);



        1.4.4.2.30.3.3    clearByTypeCache();



        1.4.4.2.30.3.4    if (beanName.equals(bd.getParentName())) {resetBeanDefinition(bdName);}    清除父类的BeanDefinition



        1.4.4.2.30.3    registry.registerAlias(beanName, aliase);



        1.4.4.2.31    DefaultBeanDefinitionDocumentReader.processBeanDefinition()



                            getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));



        1.4.4.2.32    返回步骤1.4.4.2.26



        1.4.4.2.33    DefaultBeanDefinitionDocumentReader.postProcessXml(root)    空操作



        1.4.4.2.34    返回步骤1.4.4.2.20



        1.4.4.2.35    返回步骤1.4.4.2.16



        1.4.4.2.36    返回步骤1.4.4.2.15



        1.4.4.2.37    返回步骤1.4.4.2.14



        1.4.4.2.38    返回步骤1.4.4.2.13



        1.4.4.2.39    返回步骤1.4.4.2.2



        1.4.4.2.40    返回步骤1.4.4



        1.4.5        返回步骤1.4.3



        1.4.6        步骤1.4.3继续    AbstractApplicationContext.obtainFreshBeanFactory()



                        ConfigurableListableBeanFactory beanFactory = getBeanFactory();



                        执行步骤1.4AbstractApplicationContext.obtainFreshBeanFactory()完毕



        1.5        AbstractApplicationContext.prepareBeanFactory()            设置一些初始配置,设置默认bean和BeanPostProcessor    LoadTimeWeaverAwareProcessor



        1.6        AbstractApplicationContext.postProcessBeanFactory()        // Allows post-processing of the bean factory in context subclasses.    空方法



        1.7        AbstractApplicationContext.invokeBeanFactoryPostProcessors()             Instantiate and invoke all registered BeanFactoryPostProcessor beans,



        1.8        AbstractApplicationContext.initMessageSource()                加载国际化信息



        1.9        AbstractApplicationContext.initApplicationEventMulticaster()        加载Spring容器事件体系



        1.10        AbstractApplicationContext.onRefresh()                刷新一些特殊的bean    



        1.11        AbstractApplicationContext.finishBeanFactoryInitialization(beanFactory)    初始化非延时加载的单例bean



        1.11.1        beanFactory.preInstantiateSingletons();        初始化实例



        1.11.2        DefaultListableBeanFactory.preInstantiateSingletons()



        1.11.2.1        RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);    获取到BeanDefinition



        1.11.2.2               DefaultListableBeanFactory.getBean(beanName)        获取bean



        1.11.2.3        AbstractBeanFactory.doGetBean(final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)



        1.11.2.4        Object sharedInstance = getSingleton(beanName);



        1.11.2.5        this.singletonObjects.get(beanName);

        1.11.2.6        mbd.isSingleton()    



                            getSingleton()->createBean()



        1.11.2.6.1        AbstractAutowireCapableBeanFactory.doCreateBean(beanName,mbd, args)



        1.11.2.6.2        AbstractAutowireCapableBeanFactory.resolveBeanClass()



        1.11.2.6.3        Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);



        1.11.2.6.4        BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd)



                                .getInstantiationStrategy().instantiate(mbd, beanName, parent);



        1.11.2.6.5        SimpleInstantiationStrategy.BeanUtils.instantiateClass(constructorToUse);



        1.11.2.6.6        返回1.11.2.6



        1.11.2.7        bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);



        1.11.2.8        返回1.11.2.2



        1.11.2.9        返回1.11.1



        1.11.3        返回1.11



        1.12        beanFactory.preInstantiateSingletons(); 结束



        1.13        AbstractApplicationContext.finishRefresh()



        1.13.1     AbstractApplicationContext.initLifecycleProcessor()                初始化DefaultLifecycleProcessor



        1.13.2    AbstractApplicationContext.getLifecycleProcessor().onRefresh();       运行DefaultLifecycleProcessor



        1.13.3    publishEvent(new ContextRefreshedEvent(this));            getApplicationEventMulticaster().multicastEvent(event);



        1.13.4    LiveBeansView.registerApplicationContext(this);        在LiveBeansView中注册当前的applicationContext



        1.13.5    返回ClassPathXmlApplicationContext



    加载结束