Spring框架全体总结
2021-06-29 20:50:34 0 举报
Spring框架全体总结
作者其他创作
大纲/内容
同时满足
invokeAwareMethods调用aware接口相关的方法,设置容器属性
否
是否需要被立刻加载isEagerInit
是否为空
有
populateBean 完成属性的填充工作
10、registerListeners
添加到一级缓存中 并且清空二三级缓存
value:beanDefinition
11、finishBeanFactoryInitialization完成所有非懒加载的单例对象的实例化操作
对象为空且允许早期引用
2、重置当前容器的状态标志
是
验证访问修饰符
进行国际化相关操作 MessageSource Locale
3、prepareBeanFactory给容器对象完成属性的赋值操作
GenericBeanDefinition 通用的对象定义信息
1、设置容器的启动时间2、设置活跃状态为True3、设置关闭状态为false4、获取Environment对象 并加载当前系统的属性值到Environment对象中5、准备监听器和事件的集合对象, 默认为空的集合
applyBeanPostProcessorsAfterInitialization的循环调用BeanPostProcessor来完成after方法的调用
registerSingleton二级缓存
通过BeanPostProcessor来获取构造器或者选择最合适的构造器
循环遍历所有的beanName 根据beanName获取bean对象 singletonInstance = getSingleton(beanName)
BeanDefinition
key:beanName
返回
直接返回对象即可
先从一级缓存中获取对象
通过scope来获取具体的对象,直接创建即可,一般不会走这条路径
RootBeanDefinition包含了父类的相关信息的对象定义信息
二级缓存中没有且当前对象正在创建过程中
根据&+beanName获取对象
createBean()
没有
调用实例化策略来完成实例化操作getInstantiationStrategy().instantiate
判断是否是原型作用域的对象
直接返回空对象
初始化事件广播器
AOPAbstractAutoProxyCreator重要
ResourceLoaderAware
判断当前对象是否是新添加的对象
ctor.newInstance
getBean之后的逻辑啊哦做
applyBeanPostProcessorsBeforeInitialization的循环调用BeanPostProcessor来完成before方法的调用
2、obtainFreshBeanFactory()创建容器,并且完成配置文件的加载
有一个单例对象的双重检查操作,接着从一级缓存中获取,没有的话从二级获取,没有的话从三级获取 最终返回实际需要的对象getEarlyBeanReference
判断是否是单例对象
从集合中获取每一个元素来进行对象的创建
通过obtainFromSupplier通过Supplier创建对象并直接返回
mbd不等于空,且包含init-method方法
1、createBeanFactory():DefaultListableBeanFactory
直接开始创建对象即可
EnvironmentAware
BeanNameAware
直接调用父容器的getBean来获取对象
使用自动注入的构造器来生成
把bean对象返回回去
2、设置配置文件路径到当前应用程序中setConfigLocations(configLocations);
开始进行对象的创建
从容器中获取所有的BeanDefinitionName集合beanNames
返回空对象
ApplicationEventPublisherAware
标记当前对象要开始被创建markBeanAsCreated
是否实现了InitializingBean接口
直接返回单例对象即可
4、postProcessBeanFactory 默认没有实现,留给子类进行实现操作
抛出异常
父容器不为空 且BeanDefinition中不存在当前bean
添加bean的对象到当前bean的包装类中 并且进行包装类的初始化操作
使用了try catch包裹如果运行过程中出现异常情况
判断当前对象是否正在被销毁singletonsCurrentlyInDestruction
直接调用afterPropertiesSet方法设置属性
获取当前容器的父容器
获取bean的Class对象
prepareMethodOverrides 处理lookup-method 和 replace-method标签
1、prepareRefresh()前戏,做容器刷新提前的准备工作
registerDisposableBean方法添加到disposableBeans集合中
resolveBeforeInstantiation给BeanPostProcessor一个机会返回当前bean的代理对象
EmbeddedValueResolverAware
transformedBeanName转换bean的名称 判断beanName中是否有&这个前缀
registerSingleton一级缓存
ApplicationContextAware
7、initMessageSource
ignoredDependencyInterfaces忽略操作
补充
调用afterSingletonsInstantiated方法完成对bean的处理工作 统一bean的处理工作了
instantiateBean使用默认的方式来进行实例化操作
createBeanInstance创建对象
验证bd中是否包含Supplier
getBean()获取对象了
3、开始进入容器的创建和刷新环节refresh()
initializeBean完成当前bean的初始化操作
上面是getObject方法的处理逻辑下面是getObject()后面的处理逻辑
当前bean是否是单例对象,是否允许循环引用,当前兑现是否正在创建过程中
populateBean中有可能会重新调用此方法来创建不同的对象
从此方法开始进行对象的创建 包括了实例化 初始化 循环依赖 Aop等核心的逻辑处理过程 此步骤是最最核心且关键的点,要对其中的细节最够清除
获取当前bean的构造方法来生成具体的对象
是否是FactoryBean类型
invokeInitMethods执行初始化方法
有还是没有
完成整个容器的启动, 所有的对象都准备完成 可以进行后续流程的操作 清除上下文缓存 初始化生命周期处理器 发送刷新完成事件
CommonAnnotationBeanPostProcessor InitDestroyAnnotationBeanPostProcessor@PostConstruct @PreDestory @Resource
直接调用createBean
PropertyEditor属性编辑器
MessageSourceAware
一级缓存中没有且当前对象正在创建过程中
BeanPostProcessorsBPP集合
直接跳过完成属性填充
获取bean对象的class对象 方便后续创建beanresolveBeanClass
通过factoryMethods来生成具体的对象并返回instantiateUsingFactoryMethod
doGetBean()实际获取对象的操作
3、抛出异常
当所有的bean对象都创建完毕之后
获取默认的构造方法来进行实例化操作
创建当前bean的包装对象 默认为空
在spring中默认没有实现, 模板方法, 但是springBoot中启动了web容器
返回bean对象
BeanFactoryAware
判断bean是否实现了SmartInitializingSingleton接口
直接返回对象
1、先从一级缓存中获取对象
resolvableDependencies依赖对象
AutowiredAnnotationBeanPostProcessor @Autowired @Value
applyMergedBeanDefinitionPostProcessors
ApplicationContext
2、LoadBeanDefinitions();加载配置文件
创建容器
getSingleton() sharedInstance
ApplicationContext context = new ClassPathXmlApplicationContext(\"bean2.xml\")
addEmbeddedValueResolver()设置内置的值处理器
isPrototypeCurrentlyInCreation当前对象是否正在被创建过程中
获取beanDefinition对象并进行检查操作getMergedLocalBeanDefinition
完成Spring自带或者用户自定义的BeanPostProcessor的解析
addSingletionFactory向三级缓存中添加beanName和lambda表达式
addSingleton将生成的完整对象设置到一级缓存中,方便后续进行获取
调用jdk或者cglib的方式来生成代理对象
生成的完整对象进行返回操作
判断BD是否是抽象的且是非懒加载的且是单例的
注册监听器 为了方便接受广播的事件
preInstantiateSingletons开始对象实例化
设置类型转换服务setConversionService()
只是在某个集合中添加对象即可alreadyCreated
8、initApplicationEventMulticaster
13、resetCommonCaches清空运行过程中产生的缓存
通过一系列add set ignore register开头的方法设置属性值
直接跳过
直接抛出异常
sharedInstance对象不为空 且参数为空
5、invokeBeanFactoryPostProcessors执行BFPP接口中的方法
会生成具体对象的代理对象
BeanDefinitionNames:存放beanDefinition的名称集合
完成其他的aware接口子类的设置工作
BeanDefinitionMap
是否包含factoryMethod
doCreateBean实际创建对象的方法
使用默认的构造器来生成
如果mbd不为空且isSynthetic不为true
registerDisposableBeanIfNecessary注册销毁的bean如果必要的话类似于回调, 设置需要销毁的对象
1、销毁前面过程中创建的对象
从二级缓存中获取对象
6、注册BeanPostProcessorregisterBeanPostProcessors只是注册没有执行
先创建依赖的对象
registerSingleton三级缓存
12、finishRefresh完成刷新
BeanClassLoaderAware
调用invokeCustomInitMethod来执行init-method方法 执行
在填充属性的过程中 会涉及到循环依赖问题(见另外一张画图)
不满足
反射
调用构造方法
autowireConstructor通过此方式来生成对象,并且返回
对实现FactoryBean接口的子类来进行调用和处理工作
其他aware注册在这里ApplicationContextAwareProcessor
BeanFactory
完成beanDefinition的加载和解析工作
可以自由扩张 修改BeanFactory中的相关信息 但是使用最多的是对BeanDefinition的修改操作1、configurationClassPostProcessor2、PropertySourcePlaceHolderConfigurer
从一二三级缓存中判断是否有具体的对象
ExpressionResolver spel表达式的解析器
详细流程
创建Spring应用程序上下文
修改
freshConfigurations冻结BeanDefinition
调用ObjectFactory的getObject方法来创建对象
9、onRefresh
判断是否有依赖的对象
根据beanName来获取完整的beanDefinition对象 而且是RootBeanDefinition
1、调用父类构造方法创建PathMathingResourcePatternResolver解析配置文件
0 条评论
下一页