Spring-IOC
2023-07-22 12:18:04 0 举报
绝对做的非常nice
作者其他创作
大纲/内容
parseCustomElement
Y
开始解析配置文件名称
parentBeanFactory.getBean
读取Node
ApplicationListenerDetector
停止使用临时类加载器setTempClassLoader(null)
processBeanDefinition
是否为set元素
obtainFreshBeanFactory()
beanDefinitionNames
prepareRefresh()
afterPropertiesSet
将null包装给TypedStringValue并返回
doGetBean
ignoredDependencyInterfaces
!isAbstractisSingleton!isLazyInit
是否为value元素?
准备监听器集合和事件集合
N
将创建好的完整bean放入一级缓存
return mbd
是否有Profiles标签
执行实现各种Aware接口的方法
获取beanFactory
Class<?> javaxInjectProviderClass=ClassUtils.forName(\"jakarta.inject.Provider\
parseQualifierElements
return dependsOn
ClassPathXmlApplicationContext
创建beanDefinition
解析replaced-method
applyBeanPostProcessorsBeforeInstantiation
解析value以及type元素包装给TypedStringValue并返回
解析scopefont color=\"#323232\
从 Document 的根元素开始解析,对于Spring的配置文件来说,理论上应该都是
把信息注册为bean定义信息
isSingleton
setConfigLocations
验证
EnvironmentAwareEmbeddedValueResolverAwareResourceLoaderAwareApplicationEventPublisherAwareMessageSourceAwareApplicationContextAwareApplicationStartupAware
注册applicationEventMulticaster
onRefresh
isSmartFactoryBean&&SmartFactoryBean.isEagerInit
registerBeanDefinitions
BeanFactoryPostProcessors
populateDefaults
invokeAwareMethods
getSystemEnvironment()
初始化系统属性,解析配置文件名称
存在application-${dev}.xml这种类型文件
是否是单例?mbd.isSingleton()
InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法
详细对元素中配置的 Bean 定义进行解析的地方
return sharedInstance
i18
invokeCustomInitMethod
设置allowBeanDefinitionOverridingallowCircularReferences
自定义属性资源
getBean创建对象并add进去
doRegisterBeanDefinitions
addSingleton
initBeanDefinitionReader
执行初始化方法
读取加载配置文件
registerListeners
finishRefresh
isDefaultNamespace是否默认命名空间
检查<Bean>元素所配置的 id、name 或者别名是否重复checkNameUniqueness
1
preInstantiateSingletons
doLoadDocument
ignoreDependencyInterface
postProcessAfterInstantiation
解析name和alias
用于子类实现,比如springboot就用这个实现了tomcat
在依赖检查和自动装配时忽略的依赖接口,作为类对象的集合。默认情况下,只有 BeanFactory 接口被忽略BeanNameAware.classBeanFactoryAware.classBeanClassLoaderAware.class
将refName包装给RuntimeBeanReference并返回
addBPP
初始化设置一些配置文件的属性environment = new StandardEnvironment()propertySources = new MutablePropertySources()propertyResolver = new PropertySourcesPropertyResolver()
将所有的GenericBeanDefinition包装成RootBeanDefinition返回,功能更多而已
解析resource
如果之前没有注册任何 BeanFactoryPostProcessor(例如 PropertySourcesPlaceholderConfigurer bean),则注册一个默认的嵌入值解析器:此时,主要用于注解属性值的解析。embeddedValueResolvers
parseMetaElements
createBean
终止结束
setDescription
解析bean=refName将refName包装给RuntimeBeanReference并返回
createBeanInstance
解析命名空间NamespaceHandler
BeanPostProcessorChecker
是否为null元素?
在解析 Bean 定义之后,进行自定义的解析,增强解析过程的可扩展性,留给子类实现
font color=\"#323232\
该方法主要是对beanFactory做了一些基础设置的配置,比如BeanClassLoader、BeanExpressionResolver、ApplicationContextAwareProcessor、ApplicationListenerDetector监听器检测器以及默认的环境信息bean。并设置了哪些不需要自动注入以及哪些已经解析过可以直接使用。
BeanPostProcessor
getId()
这里可以自定义创建完整的bean
存在ref?
getParentBeanFactory
<beans>
校验循环依赖
getObjectForBeanInstance
registerBeanPostProcessors
postProcessBeanFactory
单例bean创建完回调方法
2
主要是校验环境区分参数是否有效
refresh
使用场景,比如读取@value值
设置bean类加载器
定制化ioc容器,设置启动参数,开启注解自动装配
用于启动应用程序上下文的刷新过程。1.设置容器的启动时间2.设置关闭状态为false3.设置活跃状态为false4.获取getEnvironment()对象,并加载系统的属性值到environment到对象中5.准备监听器和事件的集合对象,默认为空的对象。
addBeanPostProcessor
当InstantiationAwareBeanPostProcessor的实现类不为空,则执行applyBeanPostProcessorsBeforeInstantiation和applyBeanPostProcessorsAfterInitialization
提前把实例化好的bean但未初始化好的bean放入三级缓存中,以便于解决循环依赖问题
是否为props元素?
获取系统环境
触发import bean定义解析完毕
requiresDestruction
customizePropertySources(propertySources)
parseReplacedMethodSubElements
addIndexedArgumentValue
解析constructor-arg
如果存在?
new DefaultListableBeanFactory
bean的销毁registerDisposableBeanIfNecessary
获取环境属性
初始化类型转换器ConversionService
parseBeanDefinitionElementreturn nestedBd
解析所有的spring配置文件并生成一个beanFactory
return parentBeanFactory
new GenericBeanDefinitionfont color=\"#323232\
自定义的Scope
dependsOn != null
解析lookup-method
解析beanDefinition属性
初始化上下文的事件广播器
parentBeanFactory != null && !containsBeanDefinition(beanName)
initPropertySources()
getResources加载多个指定位置的资源
valueHolder
populateBean
ResourceEditorRegistrar
将value解析的值包装给TypedStringValue并返回
new XmlBeanDefinitionReader
目前只用了校验afterSingletonCreation
所有BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor的实例并且执行postProcessBeanFactory与postProcessBeanDefinitionRegistry方法。
doCreateBean
空实现,可以用来自定义资源属性
propertyResolver.resolveRequiredPlaceholders(text)
isFactoryBean
返回beanFactory
postProcessBeanDefinitionRegistry
invokeInitMethods
parseLookupOverrideSubElements
setSerializationId
instanceof Element
解析description
createBeanDefinition
给BeanPostProcessor一个机会返回当前bean的代理对象
getEnvironment()
是否提前初始化好
是否为list元素?
获取Scope
N其他
存在value?
加载bean定义信息BeanDefinitions
来源于上面String id = ObjectUtils.identityToString(this)
原型创建后的回调。默认实现将原型标记为不再创建afterPrototypeCreation
importBeanDefinitionResource
如果创建了bean则执行后置处理器
initMessageSource
如果是原型bean在创建中则抛出异常isPrototypeCurrentlyInCreation
解析文档中根级别的元素:\"import\"\"alias\"\"bean\"
postProcessBeforeInitialization
beans解析
Document 的根节点没有使用 Spring 默认的命名空间,
则使用用户自定义的解析规则解析 Document 根节
prepareMethodOverrides
默认命名空间
parseConstructorArgElement
refreshBeanFactory()
自定义初始化方法
读取META-INF/spring.handlers
postProcessMergedBeanDefinition
发布早期的应用程序事件earlyApplicationEvents
如果实现了InitializingBean
customizeBeanFactory
初始化一些参数boolean validating = trueboolean setIdCalled = falseString MESSAGE_SOURCE_BEAN_NAME = \"messageSource\"String LIFECYCLE_PROCESSOR_BEAN_NAME = \"lifecycleProcessor\"String APPLICATION_EVENT_MULTICASTER_BEAN_NAME = \"applicationEventMulticaster\"boolean shouldIgnoreSpel = SpringProperties.getFlag(\"spring.spel.ignore\")String id = ObjectUtils.identityToString(this)String displayName = ObjectUtils.identityToString(this)AtomicBoolean active = new AtomicBoolean()AtomicBoolean closed = new AtomicBoolean()Object startupShutdownMonitor = new Object()ApplicationStartup applicationStartup = ApplicationStartup.DEFAULTresourcePatternResolver = new PathMatchingResourcePatternResolver(this)
原型创建前的回调。默认实现将原型注册为当前正在创建beforePrototypeCreation
执行实现类MergedBeanDefinitionPostProcessor的子类方法postProcessMergedBeanDefinition
loadBeanDefinitions
parseBeanDefinitionElement
beforePrototypeCreation
执行BPP的postProcessAfterInitialization
fireImportProcessed
扩展点:DestructionAwareBeanPostProcessor
bean定义信息读取器真正加载loadBeanDefinitions
单例实例化结束后立即调用smartSingleton.afterSingletonsInstantiated()
把实现了BeanPostProcessor接口的类实例化,并且加入到BeanFactory中
初始化bean实例
getBean
获取系统属性
为 bean 定义值中的表达式指定解析策略
parse
environmentsystemPropertiessystemEnvironmentapplicationStartup
postProcessBeforeInstantiation
XmlBeanDefinitionReader
冻结更改beanDefinitionfreezeConfiguration
get
添加属性编辑注册器
invokeBeanFactoryPostProcessors
详见bean定义的init方法
执行BPP的postProcessBeforeInitialization
prepareBeanFactory
index为空?
将自己add的监听器注册到多播器
new StandardReflectionParameterNameDiscoverer()
preProcessXml(root)
parseDefaultElement
StandardBeanExpressionResolver
获取BPP
实例化所有剩余的非懒加载的单例bean
new BeanDefinitionParserDelegate
在解析 Bean 定义之前,进行自定义的解析,增强解析过程的可扩展性,留给子类实现
resolvableDependencies
初始化基本参数super
parsePropertyElement解析name包装给PropertyValue
createDelegate
setEnvironment
doLoadBeanDefinitions
setResourceLoader
bean解析
applyBeanPostProcessorsAfterInitialization
校验监听器并注册它们
标记bean在创建中markBeanAsCreated
applyMergedBeanDefinitionPostProcessors
loadBeanDefinitions(resource)
开始刷新,也就是核心流程
getMergedLocalBeanDefinition
finishBeanFactoryInitialization
ApplicationContextAwareProcessor
containingBean == null
reader.loadBeanDefinitions(configLocations)
具体的解析过程由 BeanDefinitionParserDelegate 实现,BeanDefinitionParserDelegate 中定义了 Spring Bean 定义 XML 文件的各种元素
解析嵌套自定义元素parseNestedCustomElement
<Alias>
解析
parsePropertyElements
getResourceLoader()获取上面配置的资源加载器
注册依赖bean->registerDependentBeandependentBeanMapdependenciesForBeanMap
允许后置处理器修改合并的bean定义信息
填充属性
开始初始化bean实例
afterPrototypeCreation
postProcessXml(root)
是否为array元素?
postProcessAfterInitialization
1. 一级缓存singletonObjects获取2.一级缓存没有则从二级缓存earlySingletonObjects获取3.二级缓存没有则从三级缓存singletonFactories获取4.如果三级缓存singletonFactories存在数据则放入二级缓存并移除三级缓存数据
getSystemProperties()
实例化剩下的非懒加载的bean
disposableBeans包装的DisposableBean的destroy方法
validateRequiredProperties()
1.放入一级缓存singletonObjects2.移除三级缓存singletonFactories3.移除二级缓存earlySingletonObjects4.注册bean名称到registeredSingletons
parameterNameDiscoverer
isSmartInitializingSingleton
初始化属性
是否为map元素?
这里也可以自定义创建bean,这样就不用走下一步流程了resolveBeforeInstantiation
解析子元素parsePropertySubElement
创建bean实例并用BeanWrapper包装起来
注册默认环境bean
设置进propertySources
此方法的实现是空的。因为此方法的参数是BeanFactory,所以我们可以重写此方法,然后针对beanFactory进行一些修改。此方法其实类似于BeanFactory的后置处理器,可以获取到BeanFactory对象,基于BeanFactory对象,就可以通过调用BeanFactory做一些事情。
getSingleton
设置读取xml里的bean定义信息读取器
reader.loadBeanDefinitions(configResources)
getBean:&
initDefaults设置初始默认方法
getChildNodes
将@Bean注入的监听器注册到多播器
getDependsOn
parseConstructorArgElements
default-lazy-initdefault-mergedefault-autowiredefault-autowire-candidatesdefault-init-methoddefault-destroy-method
mo.setOverloaded(false)
setBeanClassLoader
是否为idref元素?
本类是空方法,让子类实现,根据类结构图发现是AbstractRefreshableApplicationContext实现的
setEntityResolver
<Bean>
registerDestructionCallback
获取BFPP
读取子NodeList
destroyBeans()closeBeanFactory()
把xml加载到Document
判断环境里是否注册了profile
isPrototype
sharedInstance != null && args == null
createBeanFactory
initializeBean
是否为bean元素?
校验mbd,如果是抽象类则抛异常checkMergedBeanDefinition
initApplicationEventMulticaster
是否为ref元素?
parseBeanDefinitionAttributes
解析meta
BeanNameAwareBeanClassLoaderAwareBeanFactoryAware
parsePropertyValue
<Import>
loadBeanDefinitions(resources)
导入解析
addGenericArgumentValue
processAliasRegistration
别名解析
收藏
0 条评论
下一页