Spring源码分析

528 阅读1分钟

源码环境搭建

blog.kimzing.com/spring/1.Sp…

学习链接

github.com/shiyujun/sp…

事件机制:
juejin.cn/post/684490…

FactoryBean:
juejin.cn/post/684490…

spring 执行流程(xml配置):

lby-test
com.lby.helloworld.HelloApplication#main()

资源定位

spring-context -> spring-beans org.springframework.context.support.ClassPathXmlApplicationContext#ClassPathXmlApplicationContext() org.springframework.context.support.AbstractXmlApplicationContext#AbstractXmlApplicationContext() org.springframework.context.support.AbstractRefreshableConfigApplicationContext#AbstractRefreshableConfigApplicationContext() org.springframework.context.support.AbstractRefreshableApplicationContext#AbstractRefreshableApplicationContext() org.springframework.context.support.AbstractApplicationContext#AbstractApplicationContext() org.springframework.context.support.AbstractApplicationContext#getResourcePatternResolver() org.springframework.core.io.support.PathMatchingResourcePatternResolver#PathMatchingResourcePatternResolver() org.springframework.context.support.AbstractRefreshableConfigApplicationContext#setConfigLocations() org.springframework.context.support.AbstractApplicationContext#refresh() org.springframework.context.support.AbstractApplicationContext#prepareRefresh() org.springframework.context.support.AbstractApplicationContext#obtainFreshBeanFactory()

资源准备

org.springframework.context.support.AbstractXmlApplicationContext#loadBeanDefinitions() org.springframework.beans.factory.support.AbstractBeanDefinitionReader#loadBeanDefinitions() org.springframework.beans.factory.xml.XmlBeanDefinitionReader#loadBeanDefinitions()

资源加载

org.springframework.beans.factory.xml.XmlBeanDefinitionReader#doLoadBeanDefinitions() org.springframework.beans.factory.xml.XmlBeanDefinitionReader#doLoadDocument() org.springframework.beans.factory.xml.XmlBeanDefinitionReader#registerBeanDefinitions() org.springframework.beans.factory.xml.XmlBeanDefinitionReader#createBeanDefinitionDocumentReader() org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#registerBeanDefinitions() org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#doRegisterBeanDefinitions() org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#createDelegate() org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#parseBeanDefinitions() org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#parseDefaultElement() org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#processBeanDefinition() org.springframework.beans.factory.xml.BeanDefinitionParserDelegate#parseBeanDefinitionElement() org.springframework.beans.factory.xml.BeanDefinitionParserDelegate#createBeanDefinition() org.springframework.beans.factory.xml.BeanDefinitionParserDelegate#parseBeanDefinitionAttributes() org.springframework.beans.factory.support.BeanDefinitionReaderUtils#registerBeanDefinition() org.springframework.beans.factory.support.DefaultListableBeanFactory#registerBeanDefinition()

spring 执行流程(java config配置):

spring bean的加载

转换对应beanName

org.springframework.context.support.AbstractApplicationContext#getBean() org.springframework.beans.factory.support.AbstractBeanFactory#getBean() org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean() org.springframework.beans.factory.support.AbstractBeanFactory#transformedBeanName()

尝试从缓存中加载单例

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton()

bean的实例化

缓存中存在:
org.springframework.beans.factory.support.AbstractBeanFactory#getObjectForBeanInstance() org.springframework.beans.factory.support.FactoryBeanRegistrySupport#getObjectFromFactoryBean() org.springframework.beans.factory.support.FactoryBeanRegistrySupport#doGetObjectFromFactoryBean() org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#postProcessObjectFromFactoryBean() org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization()
缓存中不存在:
org.springframework.beans.factory.support.AbstractBeanFactory#getParentBeanFactory() org.springframework.beans.factory.support.AbstractBeanFactory#markBeanAsCreated() org.springframework.beans.factory.support.AbstractBeanFactory#getMergedLocalBeanDefinition() org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton() org.springframework.beans.factory.ObjectFactory#getObject() org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean() org.springframework.beans.factory.support.AbstractBeanFactory#resolveBeanClass() org.springframework.beans.factory.support.AbstractBeanFactory#doResolveBeanClass() org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean() org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance() org.springframework.beans.factory.support.AbstractBeanFactory#resolveBeanClass() org.springframework.beans.factory.support.AbstractBeanFactory#doResolveBeanClass() org.springframework.beans.factory.support.AbstractBeanDefinition#resolveBeanClass() org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#instantiateBean() org.springframework.beans.factory.support.SimpleInstantiationStrategy#instantiate() org.springframework.beans.BeanUtils#instantiateClass()

循环依赖:
org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java:539 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#addSingletonFactory() org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getEarlyBeanReference() 属性注入:
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean() 初始化:
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean() org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeAwareMethods()

原型模式的依赖检查

检测 parentBeanFactory

将GernericBeanDefinition 转换为 RootBeanDefinition

寻找依赖

针对不同的scope进行bean的创建

类型转换