spring单例池实例化流程
2025-11-24 13:58:52 0 举报
核心内容描述:在Spring框架中,单例池(Singleton Objects)是存储已创建的bean实例的缓存区域。当应用上下文启动时,它通过BeanFactory进行bean的加载和实例化。首先,容器会解析配置元数据,接着会进行bean定义的加载。随后,使用BeanDefinition将bean的配置信息封装起来,实例化BeanFactory后,会使用BeanFactoryPostProcessor对bean定义进行修改和增强。
作者其他创作
大纲/内容
instantiateUsingFactoryMethod()通过工厂方法创建对象
否
判断是否FactoryBean?
singletonFactory是lambda表达式,ObjectFactory只有一个方法就是getObject()方法,在创建bean的时候会用到
MergedBeanDefinitionPostProcessor的扩展点,回调接口,例如:找到对象中所有加了@Autowired注解的属性并缓存起来
singletonFactory.getObject()通过三级缓存beanFactory生成bean对象
递归获取加了@DepondsOn的bean
beforeSingletonCreation(beanName)singletonsCurrentlyInCreation将当前bean标识为创建中
是
applyMergedBeanDefinitionPostProcessors()MergedBeanDefinitionPostProcessor扩展点回调
invokeAwareMethods()执行部分aware接口回调
singletonFactories.get(beanName)从三级缓存中查询beanFactory
getBean(beanName)获取bean
getMergedLocalBeanDefinition(beanName)获取beanDefinition
bean对象是否为空null?
扩展点注入,例如@Autowired、@Component、@Configuration配置类的增强配置的实现就通过这个扩展点进行注入,可查看:AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、ImportAwareBeanPostProcessor
AbstractAutowireCapableBeanFactory类
InstantiationAwareBeanPostProcessor扩展点回调回调方法postProcessAfterInitialization()
AbstractBeanFactory类
applyBeanPostProcessorsAfterInitialization()BeanPostProcessor扩展点执行postProcessAfterInitialization()回调
resolvedConstructorOrFactoryMethod创建对象???
单例池为空&&正在创建的bean?
遍历所有的beanDefinitionNames
getMergedLocalBeanDefinition()取出BeanDefinition
determineConstructorsFromBeanPostProcessors推断构造方法
递归
判断循环依赖标识earlySingletonExposure?
prepareMethodOverrides()方法重写的回调
getInstanceSupplier()通过Supplier来创建对象
InstantiationAwareBeanPostProcessor回调postProcessAfterInstantiation()方法扩展点判断该对象是否需要属性注入,默认true
DefaultListableBeanFactory类preInstantiateSingletons()方法
getSingleton(beanName)先从单例池(一级缓存)中获取
earlySingletonObjects.get(beanName)从二级缓存中查询bean
parentBeanFactory处理流程
ImportAwareBeanPostProcessor,ApplicationContextAwareProcessor等例如:@PostConstruct注解的执行
InstantiationAwareBeanPostProcessor扩展点回调回调方法postProcessBeforeInstantiation()
transformedBeanName(name)验证bean的名称是否合法
getSingleton(beanName)获取bean对象
代理的时机有两个:第一个是提前暴露bean(循环依赖情况下);第二个是走完bean的生命周期(正常初始化)
SmartInitializingSingleton回调afterSingletonsInstantiated()方法扩展点
是否单例bean?
earlySingletonExposure判断当前bean是否存在并且支持循环依赖
autowireByName()判断注入模型,通过byName进行属性注入
invokeInitMethods执行接口版,xml版的回调
AnnotationAwareAspectJAutoProxyCreatorAbstractAutoProxyCreator
exposedObject = initializeBean()完成实例的初始化(bean生命周期回调)
markBeanAsCreated(beanName)标记bean已经创建
applyPropertyValues()完成属性注入
applyBeanPostProcessorsBeforeInitialization()BeanPostProcessor扩展点执行postProcessBeforeInitialization()回调
autowireByType()判断注入模型,通过byType进行属性注入
singletonFactory.getObject()调用参数传的lambda表达式的方法创建bean
AOP的代理对象是通过此扩展点进行扩展,通过AbstractAutoProxyCreator创建代理对象
SmartInstantiationAwareBeanPostProcessor回调getEarlyBeanReference()方法通过此扩展点创建三级缓存ObjectFactory对象
二级缓存为空?
是否是单例/非抽象/非懒加载?
当前类实现以下aware接口则优先回调:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
for循环所有bean
populateBean()属性填充
如果不需要做属性注入,则直接retrun,不会继续下面的注入逻辑
InstantiationAwareBeanPostProcessor回调postProcessProperties()方法扩展点属性注入
DefaultSingletonBeanRegistry类
singletonsCurrentlyInCreation在这个缓存中判断bean是否正在被创建
扩展点:AOP生成代理对象
是单例,并且支持循环依赖,并且是正在创建的bean
判断bean声明初始化/声明周期回调后bean是否发生变化?
工厂bean实例化流程
instantiateBean()通过无参构造方法创建对象
autowireConstructor()通过构造方法创建对象
0 条评论
下一页