spring源码流程
2022-01-06 11:04:23 0 举报
spring源码流程
作者其他创作
大纲/内容
createBeanInstance创建对象
获取默认的构造方法来进行实例化操作
禁止使用临时类加载器进行类型匹配
没有可填充的属性,直接跳过
applyPropertyValues
剩下未执行过的
判断当前对象是否正在被销毁
创建当前bean的包装对象,默认为空
setConversionService()
判断当前对象是否是新添加的对象
排序
注入模式判断
populateBean完成属性的填充工作
归类
待完善
否
loadBeanDefinitions(resource);完成Bean Definition的加载和解析工作
2、重置当前容器的状态标志
直接跳过
获取当前bean的Class对象
满足
不满足
根据beanName来获取完整的BeanDefinition对象,而且是RootBeanDefinition
返回实际的对象
DefaultListableBeanFactory beanFactory = createBeanFactory();
TypedStringValue
jdk代理
获取当前容器的父容器BeanFactory parentBeanFactory = getParentBeanFactory();
调用postProcessorProperties方法来进行属性值的设置工作
mdb不等于空,且包含init-method
是
调用实例化策略来完成实例化操作
createBean()
从此方法开始进行对象的创建,包含了实例化,初始化,循环依赖,AOP等核心逻辑的处理过程
实现了PriorityOrdered接口
添加bean对象到当前bean的包装类中,并且进行包装类的初始化操作
进行实例化之后的属性值的设置工作
ResourceLoaderAware
生成的完整对象进行返回操作
添加到一级缓存中,并且清空二三级缓存
obtainFromSupplier通过supplier创建对象并且直接返回
loadBeanDefinitions(beanFactory);
ApplicationContextAwareProcessor
valueObject
调用了实现BeanDefinitionRegistryPostProcessor接口的bean
没有
loadBeanDefinitions(beanDefinitionReader);加载配置文件
清理缓存
对传入的BFPP进行归类
是否包含factorymethod
beanFactory.setSerializationId(getId());
初始化事件广播器
如果包含aop的相关处理,那么会在此处生成Advisor对象,方便后续进行调用
对象不为空且参数为空if (sharedInstance != null && args == null)
addSingleton将生成的完整对象设置到一级缓存中,方便后去来进行获取
通过默认的构造器来生成
resolveManagedArray
通过scope来获取具体的对象,直接创建
doCreateBean实际创建对象的方法
不包含
从二级缓存中获取对象
createAopProxy
分别获取name和value对象
从集合中获取每一个元素,来进行对象的创建for (String beanName : beanNames)
initializeBean完成当前bean的初始化操作
invokeBeanFactoryPostProcessors(beanFactory);
postProcessor.postProcessBeanDefinitionRegistry(registry);
NullBean
调用createBean()
设置父类容器的初始化
设置类型转换
是否实现了InitializingBean接口
是否需要立即被加载boolean isEagerInit;
直接返回对象
抛出异常
MessageSourceAware
当前BD中是否包含propertyValue对象
调用
EmbeddedValueResolverAware
匹配不上
1.获取ioc容器中目前所有bean定义的名称2.循环遍历,筛选出配置类3.对配置类作排序4.创建一个配置类解析器5.创建一个set candidates,长度为配置类的长度,元素为配置类. 创建一个set保存已经解析过的配置类,长度也为配置类的长度。
具体属性值的设置
null
resolveInnerBean
有还是没有
有
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
直接调用afterPropertiesSet方法来设置属性
注册监听器,为了方便接受广播的事件
autowireByType完成注入
EnvironmentAware
直接调用父容器的getBean来获取对象
createProxy
父容器不等于空,且BeanDefinitionMap中不存在当前bean
如果mbd不为空且Synthetic不为true
resolveManagedList
beanWrapper是否等于空
对象未空切允许早期引用
判断是否需要被代理
实现了Ordered接口
isPrototypeCurrentlyInCreation当前对象是否正在被创建过程中
1、先从一级缓存中获取对象
一级缓存中没有且当前对象正在被创建过程中
核心方法
autowireByName方法来完成注入
进行规则的匹配
从容器中获取所有的BeanDefinitionNames集合 List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
判断是否是单例对象
供用户自定义扩展
通过factorymethod来生成具体的对象并且返回
同时满足
RuntimeBeanNameReference
开始对象的实例化
instantiateBean使用默认的方式来进行实例化操作
最终得到BeanDefitionNames:类名集合BeanDefitionMap: Key:beanName Value:BeanDefintion
resetCommonCache()
RuntimeBeanReference
refName
调用BFPP的回调类
当前bean是否是单例对象,是否允许循环引用,当前对象是否正在被创建过程中
给容器对象完成属性的赋值操作1.ExpressionResolver---SPEL表达式的解析器2.PropertyEditor---属性编辑器3.beanPostProcessors---BPP集合4.ignoredDependencyInterfaces---忽略接口集合
setPropertyValues给bean对象设置属性值
BeanNameAware
先从一级缓存中获取对象Object singletonObject = this.singletonObjects.get(beanName);
调用实现Ordered接口
registerListeners();
prepareBeanFactory(beanFactory);
autowireConstructor通过此方式来生成对象,并且返回
resolveValueIfNecessary调用此方法来完成value值的解析工作
调用ObjectFactory的getObject()方法来创建对象
调用init-method来执行
ManagedArray
prepareRefresh();
是否是FactoryBean类型
标记当前对象要开始被创建markBeanAsCreated(beanName);
registerDisposableBeanIfNecessary回调,设置需要销毁的对象
判断是否是原型作用域的对象
验证异常
addSingletonFactory向三级缓存中添加beanName和lambda表达式
获取符合条件的Advisor
直接返回对象即可
是否为空
refresh();
会生成具体对象的代理对象
反射
ManagedList
获取当前bean的构造方法来生成具体的对象
applyMergedBeanDefinitionPostProcessors
判断是否实现了InstantiationAwareBeanPostProcessor
清空运行过程中产生的缓存
resolveReference
直接返回空对象
对PropertyValues进行一系列的验证工作
applyBeanPostProcessorsAfterInitialization循环调用BeanPostProcessor来完成after方法的调用
做类型转换RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
customizeBeanFactory(beanFactory);
直接返回单例对象
1、销毁前面过程中创建的bean对象
ManagedProperties
preInstantiateSingletons()
进行代理的创建
包含
resolveManagedMap
getBean()获取对象
result
byName
1、设置容器的启动时间2、设置活跃状态为true3、设置关闭状态为false4、获取Environment对象,并加载当前系统的属性值到Environment对象中5、准备监听器和事件的集合对象,默认为空的集合
直接跳转下一个
没有实现接口的
完成整个容器的启动,所有的对象都准备完成,可以进行后续业务流程的操作,清除上下文缓存,初始化生命周期处理器,发送刷新完成事件
ctor.newInstance()
finishBeanFactoryInitialization(beanFactory);
有一个单例对象的双重检查操作,接着从一级开始获取,没有的话从二级获取,没有的话,从三级获取,最终返回实际需要的对象
onRefresh();
如果不是,直接返回普通对象
返回空对象
默认没有实现,在springboot中启动了web容器
registerBeanPostProcessors(beanFactory);
initApplicationEventMulticaster();
循环遍历集合中所有存在的PropertyValue
invokeInitMethod执行初始化方法
pvs不等于空
ManagedMap
BeanClassLoaderAware
BeanDefinitions
获取容器中存在的advisor
直接开始创建对象
添加ExposeInvocationInterceptor的advisor
创建一个DefaultListableBeanFactory
转换bean的名称String beanName = transformedBeanName(name);
byType
ApplicationContext context = new ClassPathXmlApplicationContext(\"applicationContext.xml\")
setTempClassLoader()
解析@Component解析@PropertySources解析@ComponentScans解析@Imports解析@ImportResource解析@Bean解决单例问题
setConfigLocations(configLocations);
ApplicationEventPublisherAware
排序并注册BeanPostProcessor到BeanFactory
添加到符合条件的advisor集合
applyBeanPostProcessorsBeforeInitialization循环调用BeanPostProcessor来完成before方法的调用
判断mdb的Synthetic是否为true同时包含InstantiationAwareBeanPostProcessor
是否需要被跳过
initMessageSource();
Object sharedInstance = getSingleton(beanName);
匹配
默认没有实现,留给子类进行实现操作
freezeConfiguration()
doGetBean实际获取对象的操作
BeanFactoryAware
完成其他aware接口子类的设置工作
调用实现了BFPP接口的bean
验证bd中是否包含Supplier
super(parent);
判断BD是否是非抽象的且是非懒加载的且是单例的if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit())
冻结BeanDefinition
判断是否有依赖的对象if (dependsOn != null)
invokeAwareMethods调用aware接口相关的方法,设置容器属性
addEmbeddedValueResolver()
进行排序操作
获取bean对象的Class对象
使用自动注入的构造器来生成
copy
验证访问修饰符
把bean对象返回回去
获取PropertyValue的自动注入模式
BeanDefinitionHolder
设置一个序列化的id(private String id = ObjectUtils.identityToString(this);)
finishRefresh()
ApplicationContextAware
直接返回普通对象
refreshBeanFactory();
设置内置的值处理器
aop
从1,2,3级缓存中判断是否有具体的对象
先创建依赖的对象
postProcessBeanFactory(beanFactory);
jdk还是cglib
cglib代理
如果运行过程中出现异常情况
调用实现PriorityOrdered接口
已经执行过的跳过
通过BeanPostProcessor来获取构造器或者通过选择最合适的构造器
根据&+beanName去获取对象
设置配置文件路径到当前应用程序中
DependencyDescriptor
0 条评论
下一页