导图社区 Spring
关于Spring--BEAN生命周期思维导图,如BEAN元信息配置阶段、Bean元信息解析阶段、Bean注册阶段... ...
编辑于2023-06-13 23:32:48 陕西Spring
BEAN生命周期
BEAN元信息配置阶段
1. API的方式
不管是是通过xml配置文件的<Bean>标签,还是通过注解配置的@Bean,还是@Compontent标注的类,还是扫描得到的类,它最终都会被解析成一个BeanDefinition对象,最后我们的Bean工厂就会根据这份Bean的定义信息,对bean进行实例化、初始化等等操作。
BeanDefinition
RootBeanDefinition。表示根bean定义信息 通常bean中没有父bean的就使用这种表示
ChildBeanDefinition。表示子bean定义信息如果需要指定父bean的,可以使用ChildBeanDefinition来定义子bean的配置信息,里面有个parentName属性,用来指定父bean的名称。
GenericBeanDefinition。通用的bean定义信息既可以表示没有父bean的bean配置信息,也可以表示有父bean的子bean配置信息,这个类里面也有parentName属性,用来指定父bean的名称。
ConfigurationClassBeanDefinition。表示通过配置类中@Bean方法定义bean信息。可以通过配置类中使用@Bean来标注一些方法,通过这些方法来定义bean,这些方法配置的bean信息最后会转换为ConfigurationClassBeanDefinition类型的对象
AnnotatedBeanDefinition。表示通过注解的方式定义的bean信息里面有个方法AnnotationMetadata getMetadata();用来获取定义这个bean的类上的所有注解信息。
BeanDefinitionBuilder。构建BeanDefinition的工具类。spring中为了方便操作BeanDefinition,提供了一个类:BeanDefinitionBuilder,内部提供了很多静态方法,通过这些方法可以非常方便的组装BeanDefinition对象
2. Xml文件方式
3. properties文件的方式
4. 注解的方式
类上标注@Compontent注解来定义一个bean
配置类中使用@Bean注解来定义bean
Bean元信息解析阶段
Bean元信息的解析就是将各种方式定义的bean配置信息解析为BeanDefinition对象。
XmlBeanDefinitionReader。spring中提供了一个类XmlBeanDefinitionReader,将xml中定义的bean解析为BeanDefinition对象。创建XmlBeanDefinitionReader的时候需要传递一个bean注册器(BeanDefinitionRegistry),解析过程中生成的BeanDefinition会丢到bean注册器中
AnnotatedBeanDefinitionReader。定义一个注解方式的BeanDefinition读取器,需要传递一个BeanDefinitionRegistry(bean注册器)对象
Spring Bean注册阶段
bean注册阶段需要用到一个非常重要的接口:BeanDefinitionRegistry
BeanDefinitionRegistry唯一实现:DefaultListableBeanFactory
BeanDefinition合并阶段
Bean Class加载阶段【这个阶段就是将bean的class名称转换为Class类型的对象。】
Bean实例化阶段
Bean实例化前
BeanPostProcessor是一个接口,还有很多子接口,这些接口中提供了很多方法,spring在bean生命周期的不同阶段,会调用上面这个列表中的BeanPostProcessor中的一些方法,来对生命周期进行扩展,bean生命周期中的所有扩展点都是依靠这个集合中的BeanPostProcessor来实现的,所以如果大家想对bean的生命周期进行干预,这块一定要掌握好。
Bean实例化之前会调用org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation。 开发者自己可以在这个地方直接去创建一个对象作为bean实例,而跳过spring内部实例化bean的过程。
Bean实例化操作
这个过程会通过反射来调用bean的构造器来创建bean的实例。
使用的构造器Spring给开发者提供了接口org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors。用于确定使用的构造器。
合并后的BeanDefinition处理
Bean属性设置阶段【org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean】
实例化后阶段,执行org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation方法,返回false的时候,后续的Bean属性赋值前处理、Bean属性赋值都会被跳过了。
Bean属性赋值前阶段
执行org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessProperties和org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessPropertyValues方法,都返回空的时候,表示这个bean不需要设置属性,直接返回了,直接进入下一个阶段。
AutowiredAnnotationBeanPostProcessor在这个方法中对@Autowired、@Value标注的字段、方法注入值。 CommonAnnotationBeanPostProcessor在这个方法中对@Resource标注的字段和方法注入值。
Bean属性赋值阶段
Bean初始化阶段【org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)】
Bean Aware接口回调
BeanNameAware:将bean的名称注入进去 BeanClassLoaderAware:将BeanClassLoader注入进去 BeanFactoryAware:将BeanFactory注入进去
Bean初始化前操作
执行org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization 方法,若返回null,当前方法将结束。
org.springframework.context.support.ApplicationContextAwareProcessor#postProcessBeforeInitialization。 注入6个Aware接口对象。 EnvironmentAware :注入Environment对象 EmbeddedValueResolverAware :注入EmbeddedValueResolver对象 ResourceLoaderAware :注入ResourceLoader对象 ApplicationEventPublisherAware :注入ApplicationEventPublisher对象 MessageSourceAware :注入MessageSource对象 ApplicationContextAware :注入ApplicationContext对象
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor#postProcessBeforeInitialization 。中会调用bean中所有标注@PostConstruct注解的方法。
Bean初始化操作
调用InitializingBean接口的afterPropertiesSet方法
调用定义bean的时候指定的初始化方法。
Bean初始化后操作
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization 去调用org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization 。
所有单例bean初始化完成后阶段