Spring Bean 创建流程
2024-07-03 14:30:22 0 举报
Spring Bean的创建流程主要分为以下几个步骤:首先,Spring容器在启动时会扫描所有的Bean配置信息,包括XML配置和注解配置;然后,Spring容器会根据配置信息创建BeanDefinition对象,这个对象包含了Bean的详细信息,如Bean的名称、类型、属性等;接着,Spring容器会利用BeanDefinition对象创建Bean实例,这一过程会调用Bean的构造方法;最后,Spring容器会利用BeanDefinition对象配置Bean属性,这个过程会调用Bean的setter方法,完成Bean的属性注入。总的来说,Spring Bean的创建流程是一个非常严谨和标准的过程,它保证了Spring容器中的Bean能够按照预定的规则被创建和配置,使得Spring框架能够灵活地管理和协调系统中的各种组件。
作者其他创作
大纲/内容
1、BeanNameAware2、BeanClassLoaderAware3、BeanFactoryAware4. EnvironmentAware5. EmbeddedValueResolverAware6. ResourceLoaderAware7. ApplicationEventPublisherAware8. MessageSourceAware9. ApplicationContextAware
InitDestroyAnnotationBeanPostProcessor
getSingleton()
DisposableBean
通过factoryMethod创建对象
BPP代理的方式
只是beanDefinition的一个属性值
populateBean()
initializeBean()初始化
postProcessAfterInstantiation()实例化后的后置处理,可以用来设置值,放回false时跳过后面的属性值解析
doGetBean()
执行BPP的before方法
@PostConstruct
需要实现该接口的postProcessBeforeInstantiation()方法
1.自定义类型转换器2.注册嵌入值解析器 StringValueResolver3.初始化loadTimeWeaverAware bean4.冻结所有的bean定义(beanDefinitionNames集合)5.实例化剩下的单例对象
创建依赖的对象
applyPropertyValues()属性解析完成,应用属性值
getBean()
postProcessBeforeDestruction
pvsToUse为空
autowireByName()/autowireByType()更具不同的自动装配执行
通过反射的方式创建
这里主要是对各个类型的解析和转换
postProcessProperties()
直接放回代理对象
AutowiredAnnotationBeanPostProcessor
resolveBeforeInstantiation()实例化之前进行处理BPP一次机会返回代理对象
是
pvsToUse不为空
CommonAnnotationBeanPostProcessor
通过supplier创建对象
抽象出一个接口规范,所有的对象必须要通过getObject方法获取
instantiateUsingFactoryMethod()通过factoryMethod创建对象
afterPropertiesSet()
obtainFromSupplier()通过supplier创建对象
Aware接口回调???
执行BPP的after方法
@Autowired
resolveValueIfNecessary()将传入的参数解析成为目标类型
createBean()
preInstantiateSingletons()
applyMergedBeanDefinitionPostProcessors()
doCreateBean()
自定义的destoryMethod
getMergedLocalBeanDefinition()
createBeanInstance()
InstantiationAwareBeanPostProcessors
AbstractAutowireCapableBeanFactory
autowireConstructor()构造器注入
@PostConstruct@PreDestroy@Resource@Auwowired@Value
创建对象
postProcessAfterInitialization()
postProcessPropertyValues()
有相似之处
invokeAwareMethod
finishBeanFactoryInitialization()
invokeCustomInitMethod()
true
AOP
通过FactoryBean创建对象
invokeInintMethod
随便定义创建对象的方法,不止局限于getObject
addSingletonFactory()提前暴露给三级缓存,防止循环依赖
从二级缓存中获取半成品对象==暴露的对象,进行循环依赖的验证
refresh()
@Resource
属性填充
通过反射创建对象
注意:以下接口回调依赖应用上下文ApplicationContext才能生效,因为在AbstractApplicationContext#refresh方法内调用了prepareBeanFactory方法,而prepareBeanFactory内执行了beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));在ApplicationContextAwareProcessor#postProcessBeforeInitialization->invokeAwareInterfaces方法内才执行下面接口的回调。
@Value
初始化beanWrapper注入转换服务和属性编辑器
@Inject
反射执行invoke方法
AbstractApplicationContext
如果存在该类型的子接口
autowireConstructor()构造器方式创建对象
registerDisposableBeanIfNecessary()注入销毁对象k:beanName v: DisposableBeanAdapter
设置接口回调顺序
否
instantiateBean()默认无参构造器创建对象
false
代理对象是否为空
接口规范实现
DestructionAwareBeanPostProcessors
applyBeanPostProcessorsBeforeInitialization()
return
加载注解相关的解析配置工作
@PreDestroy
收藏
收藏
0 条评论
下一页