spring容器初始化和bean的生命周期
2021-06-15 22:05:08 6 举报
springbean的生命周期
作者其他创作
大纲/内容
会先调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation,然后调用实现了InstantiationAwareBeanPostProcessor接口的postProcessPropertyValues方法,如1.AutowiredAnnotationBeanPostProcessor#postProcessPropertyValues方法会拿到对应的InjectionMetadata对象将注解了@Autowired和@Value的方法或者属性进行反射赋值。2.CommonAnnotationBeanPostProcessor#postProcessPropertyValues与上面类似
初始化前调用invokeAwareMethods
遍历容器中beanDefinitionName列表,开始进行实例化和初始话
BeanDefinitionRegistryPostProcessor
invokeInitMethods方法调用实现了InitializingBean的afterPropertiesSet进行属性赋值,然后再调用init-method方法
此处不考虑循环依赖的场景
applyBeanPostProcessorsAfterInitialization方法调用实现了BeanPostProcessor接口的postProcessAfterInitialization方法。如AbstractAutoProxyCreator#postProcessAfterInitialization方法进行aop的代理创建工作
invokeAwareMethods方法会调用实现了1、BeanNameAware的setBeanName方法。2. BeanClassLoaderAware接口的setBeanClassLoader方法。3. BeanFactoryAware接口的setBeanFactory方法
初始化 invokeInitMethods
Y
容器创建前的准备工作,容器创建
没有则进行创建bean的工作
初始化后applyBeanPostProcessorsAfterInitialization方法
如果没有构造方法则使用默认构造方法进行反射创建对象,如果有多个构造方法,先查询多个候选的构造方法,选取有效的构造方法进行反射创建对象,例如有多个构造方法时,会采用注解了@Autowired的构造方法进行反射初始化
从单例池中获取
BeanFactoryPostProcessor
属性填充populateBean,会先调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation,然后调用实现了InstantiationAwareBeanPostProcessor接口的postProcessPropertyValues方法。
是否是FactoryBean
applyBeanPostProcessorsBeforeInitialization方法会调用实现了BeanPostProcessor接口的postProcessBeforeInitialization方法如1.ApplicationContextAwareProcessor#postProcessBeforeInitialization方法处理实现了ApplicationContextAware的setApplicationContext方法等一些列Aware。2.InitDestroyAnnotationBeanPostProcessor#postProcessBeforeInitialization方法拿到初始化前注入的生命周期方法进行反射调用。及@PostConstuctor等生命周期注解的方法。
initializeBean
实例化前会调用实现了InstantiationAwareBeanPostProcessor接口的postProcessBeforeInstantiation方法,如AbstractAutoProxyCreator#postProcessBeforeInstantiation方法提前创建aop代理对象。
实例化后调用applyMergedBeanDefinitionPostProcessors方法
注册内部的BeanPostProcess
实例化后会调用实现了MergedBeanDefinitionPostProcessor接口的postProcessMergedBeanDefinition方法,如1.AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition方法会将注解了@Autowiredg和@Value注解的方法或者属性以InjectionMetadata对象注入到injectionMetadataCache map中。2.CommonAnnotationBeanPostProcessor#postProcessMergedBeanDefinition方法会将注解了@Resource注解的方法或者属性以InjectionMetadata对象注入到injectionMetadataCache的map中3.InitDestroyAnnotationBeanPostProcessor#postProcessMergedBeanDefinition方法会将注解了@PostConstructor等生命周期注解的方法以LifecycleMetadata对象注入lifecycleMetadataCache的map到。
BeanDefinitionReader
spring容器
完成ApplicationContextAwareProcessor增强器的注入,处理实现了Aware接口的子类,注入系统环境和jvm环境信息等工作
容器增强
spring进行管理,销毁
获取bean
createBeanInstance方法创建BeanWrapper对象
annotation
容器的准备工作
N
xml
注册如AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessor的后置处理器
初始化前调用applyBeanPostProcessorsBeforeInitialization方法
实例化前调用,resolveBeforeInstantiation方法
注册事件广播器、监听器等工作
获取FactoryBean本身+根据getObject获取bean
实例化、初始化所有非懒加载的单例bean
0 条评论
回复 删除
下一页