[KANMARS原创] - DEBUG分析SPRING IOC容器启动过程
以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
加载结束