spring源码
2021-11-10 10:18:26 0 举报
test
作者其他创作
大纲/内容
有
在填充属性的过程中,会涉及到循环依赖的问题
getBean()获取对象
自己完成
BFPP执行过程
obtainFromSupplier通过supplier创建对象并且直接返回
调用jdk来生成代理对象
ResourceLoaderAware
xml
beanPostProcessorsBFF集合
1-c
先从一级缓存中获取对象
内置对象Spring需要的对象
BeanDefinitionRegistryPostProcessor
isPrototypeCurrentlyCreation当前对象是否正在被创建过程中
直接调用createBean
完成所有非懒加载的单例对象的实例化操作
注册监听器,为了方便接受广播的事件
调用init-method来执行
prototype
freezeConfigurations()冻结BeanDefinition
onRefresh();
对象为空且允许早起引用
是
抛出异常
2
反射
从容器中获取所有的BeanDefinitionNames集合;List<String> beanNames = new ArrayList<>(this.beanDefinitionNames)
applyBeanPostProcessorsBeforeInitialization循环调用BeanPostProcessor来完成before()方法的调用
spring Bean作用域
1外部集合
creatBeanInstance创建对象
配置(xxxproperty.class)
普通对象
IOC
postProcessBeanDefinitionRegistry();
有一个单例对象的双重检查操作,接着从一级开始获取,没有的话从二级获取,没有的话从三级获取,最终返回实际需要的对象
实现了BeanFactoryPostProcessor接口的类
invokeInitMethod执行初始化方法
BeanPostProcessor::after
直接返回对象
否
BeanFactoryAware
重置当前容器的状态标志
例如:ConfigurationClassPostProcessor;PropertySourcePlaceHolderConfigurer
BeanFactoryPostProcessor
extend
从集合中获取每一个元素,来进行对象的创建
完成整个容器的启动,所有对象都准备完成,可以进行后续业务流程的操作,清楚上下文缓存,初始化生命周期处理器,发送刷新完整事件
properties
obtainFreshBeanFactory()
populateBean完成属性的填充工作
通过factoryMethod来生成具体的对象并且返回
2-b
完整创建bean的过程
获取BeanDefinition对象并且进行检查操作
添加bean对象到当前bean的包装类中,并进行包装类的初始化操作
完成BeanDefinition的加载和解析工作
判断是不是原型作用域对象
3父类
对象创建过程
ExpressionResolverSPEL表达式的解析器
调用实例化策略来完成实例化操作
父容器!=null && BeanDefinitionMap中不存在当前bean
整个spring再运行期间可以有多个BFPP,那么按照什么顺序执行呢?
initializeBean完成当前bean的初始化操作
spring Bean
getSingleton()
registerListeners()
处理器(xxxhandler.class)
resolveBeforeInstantiation给BeanPostProcessor一个机会返回当前bean的代理对象
完成其他aware接口子类的设置工作
直接开始创建对象
addEmbeddedValueResolver()设置内置的值处理器
直接返回空对象
设置一些监听器且设置一些执行事件的集合
BeanFactoryPostProcessor(父)
重写init();添加解析器
完成spring自带或者用户自定义的BeanPostProcessor的解析
设置环境对象(Enviroment)且设置环境对象的属性值
bean的初始化
invokeBeanFactoryPostProcessor()
doCreateBean实际创建对象的方法
把bean对象返回回去
BeanClassLoaderAware
BeanPostProcessor::before
resolvableDependencies
2-a
以方法参数的形式注入进来的
只是在某个集合中添加对象即可;alreadyCreated
创建当前bean的包装对象,默认为空
是否包含factoryMethod
spring.handlers添加处理器的配置spring.schemas添加解析器的配置文件xxx.xsd...不同的标签配置文件
BeanDefinitionMap
Bean生命周期
Spring bean类型
执行init-method方法
使用自动注入的构造器来生成
扩展(解析xml的自定义标签)
实例化过程
spring的整体继承关系逻辑
Spring bean作用域
处理器xxxhandler重写init();然后将解析器
调用ObjectFactory的getObject()方法来创建对象
解析器(xxxparser.class)
从一,二,三级缓存中判断是否有具体的对象
session
private Supplier<?> instanceSupplier;public void setInstanceSupplier(@Nullable Supplier<?> instanceSupplier) { this.instanceSupplier = instanceSupplier;}
直接调用afterPropertiesSet方法来设置属性
清空运行过程中产生的缓存
验证bd中是否包含Supplier
yml
setConversionService()设置类型转换服务
MessageSourceAware
2子类
registerBeanPostProcessor(beanFactory);
ApplicationContextAware
获取当前容器的父容器
在spring中默认没有任何实现,模块方法,但是在springboot中启动了web容器
finishRefresh()
resetCommonCache();
有/没有
创建容器对象:DeflautListableBeanFactory
设置当前spring启动的时间
preInstantiateSingletons()开始对象实力化
AOP
通过scope来获取具体对象,直接创建;但是一般不会走这条路
从此方法开始进行对象的创建,包含了实例化,初始化,循环依赖,AOP等核心逻辑处理过程,此步骤是最核心关键的点,要对其中的细节足够清楚
BeanNameAware
获取默认的构造方法来进行实例化操作
当所有的bean对象都创建之后
解析表达式
详细过程
prepareBeanFactory(beanFactory);设置bean工厂参数
二级缓存
spring如何识别到自定义的BeanFactoryPostProcessor接口的实现类:1,定义在spring的配置文件中,让spring自动识别2,调用具体的addBeanFactoryPostProcessor(xxx);
addSingletionFactory向三级缓存中添加beanName和lambda表达式
beanDefinition
标记当前对象要开始被创建
request
如果包含AOP的相关处理,那么会在此处生成Advisor对象,方便后续进行调用
pupolateBean中有可能会更新调用此方法来创建不同的对象
从二级缓存中获取对象
applyBeanPostProcessorsAfterInitialization循环调用BeanPostProcessor来完成after()方法的调用
transformedBeanName转换bean的名称
加载xml配置文件的属性值到当前工厂中,生成BeanDefination
ignoredDependencyInterfaces
获得容器中的bean Name名称
postProcessBeanFactory();
完成刷新
判断当前对象是否正在被销毁
(b)Ordered
无
是否是FactoryBean类型
initMessageSource()
mbd不等于空且包含init-method
prepareRefresh()
会生成具体对象的代理对象
3-c
ApplicationContextAwareProcessor
循环便利多有的beanName,根据beanName获取bean对象
EmbeddedValueResolverAware
refresh()
创建一个beanFactory工厂
applyMergedBeanDefinitionpostProcessor
生成的完整对象进行返回操作
对实现了FactoryBean接口的子类来进行调用和处理工作
使用默认的构造器来生成
invokeBeanFactoryPostProcessors执行过程
完整对象
整个工厂中通过类型匹配找到的
对像不为空且参数为空
获取bean对像的Class对象
key:beanName
如果运行过程中出现异常情况
判断是否是单例对象
返回单例对象
finishBeanFactoryInitialization(beanFactory);
singleton
销毁前面过程中创建的bean对象
结束
调用cglib来生成代理对象
Spring源码
invokeAwareMethods调用aware接口相关的方法,设置容器属性
关联信息
3-b
我们自定义的对象
是否为空
设置关闭/开启的标志位(false/true)
是否需要立即被加载
ceateBean()
容器对象
判断是否有依赖的对象
BeanFactory
通过类型匹配找到的
调用afterSingletonsInstantiated来完成bean的处理工作
设置Aware接口的属性
根据beanName来获取完整的BeanDefinition对象,而且是RootBeanDefinition类型的实例
三级缓存
加载
初始化事件多播器
addSingleton将生成的完整对象设置到一级缓存中,方便后面来进行获取
执行BFPP接口中方法(postProcessBeanFactory();)
属性填充
setBeanClassLoader(XX);设置类加载器
验证访问修饰符(满足/不满足)
3-a
BeanDefinitionNames:存放beanDefinition的名称集合
开始进行对象创建
context.getBean();
是否实现了InitializingBean接口
解析对象BeanDefinition
json
EnvironmentAware
BeanFactoryBean工厂,整个容器的根接口,也是容器的入口Constructor ctor = clazz.getConstructor();Object obj = ctor.newInstance();
用户手动加入的BeanFactoryPostProcessor
(a)PriorityOrdered
1-a
实现了BeanDefinitionRegistryPostProcessor接口的类
获得bean创建工厂
doGetBean实际获取对象的操作
2-c
根据&+beanName获取对象
判断bean是否实现了SmartInitializingSingletion接口
先创建依赖的对象
instantiateBean使用默认的方式来进行实例化操作
如果mbd不为空且Synthetic不为true
判断BD是否是非抽象&非懒加载&单例的
postProcessBeanFactory();默认没有实现,留给子类进行实现操作准备BeanFactoryPostProcessor处理器;
ApplicationEventPublishAware
xxxParser--解析器
ProertyEditor属性编辑器
获取类加载器
postProcessBeanFactory()
获取当前bean的Class对象
(c)没有实现任何排序接口的对象
autowireConstructor通过此方式来生成对象,并且返回
BeanDefinitionRegistryPostProcessor(子)
1
进行spring容器创建前的准备工作
populate
AutowiredAnnotataionBeanpostProcessor@Autowired,@Value
判断当前对象是否新添加的对象
bean的初始化过程
注册BeanPostProcessor
直接调用父容器的getBean来获取对象
直接跳过
定义规范,方便扩展(BeanDefinitionReader)
通过BeanPostProcessor来获取构造器或者通过选择最合适的构造器
initApplicationEventMulticaster();
一级缓存中没有且当前对象正在被创建过程中
1-b
获取当前bean的构造方法来生成具体对象
scope
可以自由扩展,修复beanFactory中的相关信息,但是使用最多的是对beanDefinition的修改操作
一级缓存
启动容器,将spring容器所需的容器对象创建出来
value:BeanDefinition
0 条评论
回复 删除
下一页