spring流程图
2022-09-04 01:57:34 13 举报
spring流程图
作者其他创作
大纲/内容
将解析完成的BeanDefinition注册到容器
其他
ReaderEventListener#importProcessed/aliasRegistered
getObjectFromFactoryBean
refresh
初始化信息源和国际化相关
初始化后所有的后置操作
N
BeanPostProcessor后置处理器
2
调用所有注册过的BeanFactoryPostProcessor
Proxy.newProxyInstance
AspectJExpressionPointcut
XML的IOC容器初始化
没有执行且实现Order接口
或者独立解析
遍历currentRegistryProcessors执行postProcessBeanDefinitionRegistry
initApplicationEventMulticaster
回调同时缓存单例Bean
AbstractRefreshableApplicationContext#loadBeanDefinitions
经过路径的判断最终还是调用XmlBeanDefinitionReader的registerBeanDefinitions方法解析,解析完成再发送“容器导入”/“别名”其他资源处理完成事务
设置类加载器,设置EL表达式解析器(Bean创建完成填充属性时使用)和属性注册解析器
接口
Y
RuntimeBeanReference,不可变占位符,属性值属于工厂的另一个baen时
applyPropertyValues给定的属性深度赋值
invokeAwareMethods
链条的调用通知的拦截器,最终在反射执行被拦截Joinpoint的invoke
registryProcessors调用postProcessBeanFactoryregularPostProcessors调用postProcessBeanFactory
shouldSkip
advisor实例化过程包含了N个对象迭代创建
obtainFreshBeanFactory
重新获取容器内的BeanDefinitionRegistryPostProcessor,因为上一步可能会增加新的BeanDefinitionRegistryPostProcessor
finishRefresh
autowireByType根据名称对属性进行缓存,保存到不同的集合
resolveBeforeInstantiation
AspectJPointcutAdvisor
加载配置文件
是否实现 PriorityOrdered
autowireByName根据名称对属性进行缓存,保存到不同的集合
注册各种可用组件(environment,systemProperties,systemEnvironment)
判断BeanDefinitionRegistryPostProcessor类型
初始化判断prepareMethodOverrideslookup-method replace-method
ReaderContext#fireImportProcessed/fireAliasRegistered
DLBF#registerBeanDefinition此处只是缓存bean的定义,在getBean的时候真正初始化并缓存到IOC
MethodLocatingFactoryBean
postProcessBeforeInstantiation()
常见的BeanFactoryPostProcessor1. ConfigurationClassPostProcess2. PropertySourcesPlaceholderConfigurer
调用priorityOrderedPostProcessorspost的ProcessBeanFactory
注册AspectJAwareAdvisorAutoProxyCreator用于支持AspectJ方式的自动代理
注入
prepareRefresh
遍历
创建容器对象DLBF
AdvisedSupport#getInterceptorsAndDynamicInterceptionAdvice
RootBeanDefinition
registerDisposableBeanIfNecessary
XmlBeanDefinitionReader#registerBeanDefinitions
1. 解析并生成Bean定义
applyBeanPostProcessorsAfterInitialization
常见的BeanPostProcessor1.ApplicationContextAwareProcessor2.AbstractAutoProxyCreator3.AutowiredAnnotationBeanPostProcessor4.CommonAnnotationBeanPostProcessor
初始化所有剩下来的单例beanlazy-init=false
registerListeners
返回自定义动态代理的生成对象
初始化容器生命周期事件处理器,并发布容器的生命周期处理事件
doRegisterBeanDefinitions解析并注册
1
排序
检查依赖bean的信息,并递归调用getBean
找出bean定义的所有非简单属性,在IOC中找到对应的Bean包装成PropertyValues,并缓存bean和他依赖bean之前的对应关系用这个方法registerDependentBean
是
处理aop相关
先判断是否存在父容器如有而且父容器存在,beanName则委派父级容器
DefaultAopProxyFactory#createAopProxy
属性装配
初始化容器事件传播器(观察者模式)
单例工厂
原型
为事件传播器注册事件监听器
postProcessBeanFactory
子类指定特殊的BeanPostProcessor事件处理器
放入currentRegistryProcessors
getProxy
否
parseBeanDefinitionElement把<bean>信息封装成AbstractBeanDefinition并包装成BeanDefinitionHolder返回
策略模式不同实现
检查是否继承Aware接口的BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
判断创建的方法
注解驱动的IOC容器初始化
放入orderedPostProcessorNames
createBean
ConstructorResolver#instantiateUsingFactoryMethod
创建环境对象ConfigurableEnvironment,包含了JVM的profile的配置信息,环境变量和Java的进程变量
放入priorityOrderedPostProcessors
MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
ApplicationContextAwareProcessor
1.Supplier2.工厂方法3.自动转配4. 默认无参构造
initMessageSource
子类某些特殊的bean初始化方法,区别MVC
最终通过factoryMethod.invoke创建
BeanPostProcessor#postProcessAfterInitialization
AbstractNestablePropertyAccessor#setPropertyValue()
instantiateBean
findEligibleAdvisors找到当前bean适用的advisors
设置容器内属性
解析配置文件
AbstractPropertyAccessor#setPropertyValues()开启属性赋值
这里以aop解析为例
调用父类AbstractApplicationContext的构造方法获取资源加载器,用于资源载入的ResourcePatternResolver
注册BeanPostProcessor后置处理器
回调方法来创建bean
populateBean
jdk实现
processKeyedProperty集合属性直接赋值processLocalPropertyJdk反射调setting方法
Spring的Bean的加载流程
InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
放入nonOrderedPostProcessorNames
放入regularPostProcessors
从BeanFactory获取BeanDefinitionRegistryPostProcessor循环遍历
wrapIfNecessary过滤代理本身相关的类
类
getSingleton
import listalias map
invokeBeanFactoryPostProcessors
单例
AbstractBeanFactory#getBean
如果是原始的Bean,不是原始的bean,就会执行实例化之后后置操作BeanPostProcessor#postProcessAfterInitialization
prepareBeanFactory
调用Bean实例化初始化方法,这个初始化方法是在Spring Bean定义配置,通过init-method属性制定,先判断是否实现了InitializingBean,实现了就执行afterPropertiesSet方法,然后调用invokeCustomInitMethod方法反射执行initMethod
创建动态代理的需要的Advisor对象
具体的解析过程委派给BeanDefinitionParserDelegate
beanDefinition的类型判断根据具体的类型创建对象
设置各种Aware接口的实现类为忽略自动装配
4
根据BeanName从单例缓存中获取
调用自定义NamespaceHandler进行解析
是否是默认命名空间
直接调用method.invoke
mbd.getInstanceSupplier
configureAutoProxyCreator
获取beanFactoryPostProcessors并循环遍历
onRefresh
proceed方法按照通知链的顺序执行
3
BeanDefinitionReaderUtils.registerBeanDefinition
createProxy
2.注册到spring的IOC中
初始化
AbstractXmlApplicationContext#loadBeanDefinitions
执行的时候调用该方法的invock
如果BeanFactory中存在loadTimeWeaver的bean,那么需要添加动态织入功能
findAdvisorBeans
调用orderedPostProcessorNames的ProcessBeanFactory
放入registryProcessors
@Autowire和@Resource
XmlBeanDefinitionReader#doLoadBeanDefinitions
getObjectForBeanInstance获取给定的Bean实例,工厂的bean检查&,不是就直接返回bean实例,否则获取工厂bean并创建对应的bean
processBeanDefinition
applyBeanPostProcessorsBeforeInitialization
FactoryBean创建的单例对象,FactoryBean的名称和对象
是否依赖检查项
invokeInitMethods
执行postProcessBeanDefinitionRegistry
如果是原始的Bean,不是原始的bean,就会执行实例化之前前置操作BeanPostProcessor#postProcessBeforeInitialization
BeanDefinition存在methodOverrides则定义了方法覆盖
SimpleInstantiationStrategy#instantiate判断是否定义了方法覆盖,没有就调用构造器的初始化方法,有就利用CGLIB代理的构造初始化
处理ClassPathXmlApplicationContext传入的字符串中的占位符
设置自动装配的类(BeanFactory,ResourceLoader,ApplicationEventPublisher,ApplicationContext)
为空
创建IOC容器DLBF,进行定制化,如设置启动参数,开启注解的自动装配
配置容器特性、加载、事件处理器等
AbstractAspectJAdvice
registerBeanPostProcessors
createBeanInstance创建对象
ConstructorResolver#autowireConstructor使用容器自动装配的特性,调用匹配构造方法实例化
BeanPostProcessor实现类AbstractAutoProxyCreator#postProcessAfterInitialization
获取容器的当时时间,活动标识和属性源初始化
initializeBean
由BeanDefinitionDocumentReader实现
没有执行
doGetObjectFromFactoryBean调用工厂bean的getObject生产指定bean的实例对象
InstantiationAwareBeanPostProcessor#postProcessProperties给bean应用实例值之前后处理,可检查注入和替换必要属性
利用BeanPostProcessor的特性给各种Aware接口的实现类注入ApplicationContext中对应的属性
finishBeanFactoryInitialization
调用nonOrderedPostProcessorNames的ProcessBeanFactory
清空currentRegistryProcessors
BeanDefinitionValueResolver#resolveValueIfNecessary解析bean的依赖属性,获取依赖时,如果IOC没有就创建
解析当前命名空间地址获取该地址下的标签封装成NamespaceHandler
setConfigLocations
doCreateBean
返回JdkDynamicAopProxy
不存在
ClassPathXmlApplicationContext加载配置文件
返回ObjenesisCglibAopProxy
判断Aop代配置管理器,是代理类或不支持SpringProxy
如果存在增强器则创建代理
doGetBean
资源转化成IO流
解析标签
0 条评论
回复 删除
下一页