01-Spring中Bean的生命周期

104 阅读4分钟

Spring基本概念-DefaultListableBeanFactory-BeanDefinition

  • AliasRegistry:支持别名功能,一个名字可以对应多个别名
  • BeanDefinitionRegistry:可以注册、保存、移除、获取某个BeanDefinition
  • BeanFactory:Bean工厂,可以根据某个bean的名字、或类型、或别名获取某个Bean对象
  • SingletonBeanRegistry:可以直接注册、获取某个单例Bean
  • SimpleAliasRegistry:它是一个类,实现了AliasRegistry接口中所定义的功能,支持别名功能
  • ListableBeanFactory:在BeanFactory的基础上,增加了其他功能,可以获取所有BeanDefinition的beanNames,可以根据某个类型获取对应的beanNames,可以根据某个类型* 获取{类型:对应的Bean}的映射关系
  • HierarchicalBeanFactory:在BeanFactory的基础上,添加了获取父BeanFactory的功能
  • DefaultSingletonBeanRegistry:它是一个类,实现了SingletonBeanRegistry接口,拥有了直接注册、获取某个单例Bean的功能
  • ConfigurableBeanFactory:在HierarchicalBeanFactory和SingletonBeanRegistry的基础上,添加了设置父BeanFactory、类加载器(表示可以指定某个类加载器进行类* 的加载)、设置Spring EL表达式解析器(表示该BeanFactory可以解析EL表达式)、设置类型转化服务(表示该BeanFactory可以进行类型转化)、可以添加BeanPostProcessor(* 表示该BeanFactory支持Bean的后置处理器),可以合并BeanDefinition,可以销毁某个Bean等等功能
  • FactoryBeanRegistrySupport:支持了FactoryBean的功能
  • AutowireCapableBeanFactory:是直接继承了BeanFactory,在BeanFactory的基础上,支持在创建Bean的过程中能对Bean进行自动装配
  • AbstractBeanFactory:实现了ConfigurableBeanFactory接口,继承了FactoryBeanRegistrySupport,这个BeanFactory的功能已经很全面了,但是不能自动装配和获取b* eanNames
  • ConfigurableListableBeanFactory:继承了ListableBeanFactory、AutowireCapableBeanFactory、ConfigurableBeanFactory
  • ConfigurableListableBeanFactory:继承了ListableBeanFactory、AutowireCapableBeanFactory、ConfigurableBeanFactory
  • AbstractAutowireCapableBeanFactory:继承了AbstractBeanFactory,实现了AutowireCapableBeanFactory,拥有了自动装配的功能
  • DefaultListableBeanFactory:继承了AbstractAutowireCapableBeanFactory,实现了ConfigurableListableBeanFactory接口和BeanDefinitionRegistry接口* ,所以DefaultListableBeanFactory的功能很强大
  • BeanPostProcessor
  • Bean的后置处理器,可以在创建每个Bean的过程中进行干涉,是属于BeanFactory中一个属性,讲Bean的生命周期中详细讲
  • BeanFactoryPostProcessor
  • Bean工厂的后置处理器,是属于ApplicationContext中的一个属性,是ApplicationContext在实例化一个BeanFactory后,可以利用BeanFactoryPostProcessor继续处理Be* anFactory。
  • 程序员可以通过BeanFactoryPostProcessor间接的设置BeanFactory,比如上文中的CustomEditorConfigurer就是一个BeanFactoryPostProcessor,我们可以通过它向Be* anFactory中添加自定义的PropertyEditor。
  • FactoryBean允许程序员自定义一个对象通过FactoryBean间接的放到Spring容器中成为一个Bean。那么它和@Bean的区别是什么?因为@Bean也可以自定义一个对象,让这个对象成为一个Bean。区别在于利用FactoryBean可以更加强大,因为你通过定义一个XxFactoryBean的类,可以再去实现Spring中的其他接口,比如如果你实现了BeanFactoryAware接口,那么你可以在你的XxFactoryBean中获取到Bean工厂,从而使用Bean工厂做更多你想做的,而@Bean则不行。

Bean的生命周期

image.png

一个简单的Bean的生命周期:

  • 推断构造方法(确定使用哪个构造方法来实例化对象)
  • 实例化
  • 填充属性(依赖注入)
  • 初始化
  • 源码步骤:启动AnnotationConfigApplicationContext->创建BeanFactory->初始化BeanFactory->执行BeanFactory后置处理器->进行扫描-> 生产BeanDefinition->合并BeanDefinition->加载类->实例化前->腿短构造方法->实例化->BeanDefinition的后置处理器->填充属性->执行Aware->初始化前->初始化->初始化后

Bean的销毁过程

  • 容器关闭
  • 发布ContextClosedEvent事件
  • 调用LifecycleProcessor的onClose方法
  • 销毁单例Bean
  • 找出所有DisposableBean(实现了DisposableBean接口的Bean)
  • 遍历每个DisposableBean
  • 找出依赖了当前DisposableBean的其他Bean,将这些Bean从单例池中移除掉
  • 调用DisposableBean的destroy()方法
  • 找到当前DisposableBean所包含的inner beans

父子BeanDefinition

父子BeanDefinition是Spring中的概念,Spring在根据BeanDefinition创建Bean的过程中,会先看当前BeanDefinition是否存在父BeanDefinition,如果存在则需要进行合并,合并就是把子BeanDefinition和父BeanDefinition中所定义的属性整合起来(如果存在某个属性在父子BeanDefinition中都存在,那么取子BeanDefinition中的属性)

父子BeanFactory 类似java的类加载反的委派机制

BeanFactory是一个Bean的容器,在Spring中,当我们在使用某个BeanFactory去获取Bean时,如果本BeanFactory中不存在该Bean,同时又有父BeanFactory,那么则会检查父BeanFactory是否存在该Bean,如果也不存在,那么则会创建Bean。

父子ApplicationContext

父子ApplicationContext和父子BeanFactory类似,子ApplicationContext除开可以使用父ApplicationContext来获取Bean之外,还可以使用父ApplicationContext中其他的东西,比如ApplicationListener

BeanPostProcessor(Bean的后置处理器)

Bean的后置处理器是指Spring在创建一个Bean的过程中,可以通过后置处理器来干涉Bean的创建过程。

Spring在 '一个简单的Bean的生命周期'基础上,在这4步中的某些"间隙"中增加了扩展点,比如:

  • BeanPostProcessor:提供了初始化前、初始化后
  • InstantiationAwareBeanPostProcessor:在BeanPostProcessor的基础上增加了实例化前、实例化后、填充属性后
  • MergedBeanDefinitionPostProcessor:在BeanPostProcessor的基础上增加了在实例化和实例化后之间的扩展点