bean生命周期
2022-04-18 22:35:36 0 举报
AI智能生成
spring bean的生命周期
作者其他创作
大纲/内容
初始化BeanFactory流程
存入xml的路径
执行刷新操作
创建 BeanFactory,并加载 BeanDefinition
1.创建BeanFactory(直接new 一个)
2.加载BeanDefinition
1.实例化Beandenifition注册表
2.实例化资源加载器
3.资源加载器根据xml文件路径选择对应的文件读取输入流
1.ClassPath
2.File
3.Http文件
4.读取输入流,解析xml初始化BeanDefinition
1.解析bean标签
2.根据Class属性,获取类中的名称
3.根据id属性和name属性,获取beanName(优先级 id>name)
4.根据init-method属性获取bean的初始化方法名
5.根据destroy-method属性获取bean的销毁方法名
6.定义Beandefinition,将获取到的属性set进BeanDefinition中
7.读取property标签中的属性,进行Beandefinition的属性填充
8.注册BeanDefinition
获取 BeanFactory(获取1.2.1创建的BeanFactory)
添加 ApplicationContextAwareProcessor,让继承自 ApplicationContextAware 的 Bean 对象都能感知所属的 ApplicationContext
在 Bean 实例化之前执行 BeanFactoryPostProcessor(上下文扩展操作)
1.遍历beanDefinition注册表找到实现了BeanFactoryPostProcessor接口的beanDefinition,然后返回次beandefinition实例化的bean对象集合
2.遍历集合调用这些bean的postProcessBeanFactory方法
BeanPostProcessor 需要提前于其他 Bean 对象实例化之前执行注册操作
1.获取BeanFactory中的BeanDefinition容器中实现了BeanFactoryPostProcessor接口的bean
2.将这些bean添加到BeanFactory中的List<BeanPostProcessor>(上下文扩展操作集合)中(刷新扩展bean)
1.remove集合中已经存在同名的扩展bean(其实相当于清空集合)
2.再将扩展bean添加到集合中
初始化事件发布者
注册事件监听器
1.获取所有beandefinition中实现了ApplicationListener接口的beandefinition
2.将这些beandefinition(事件)注册到发布者的事件容器中
提前实例化单例Bean对象
创建bean
1.判断是否返回Bean对象代理如果是则直接进行对象代理实例化
2.实例化bean
1.通过jdk实例化策略实例化bean对象
2.通过cglib实例化策略来实例化bean对象
3.给bean对象进行递归填充属性
4.执行 Bean 的初始化方法和 BeanPostProcessor 的前置和后置处理方法
1.判断bean是否属于Aware接口的实现
1.如果bean属于BeanFactoryAware的实现则将当前的beanFactory引用set进bean的对应属性中
2.如果bean属于BeanClasLoaderAware的实现则将当前的beanClassLoader的引用set进bean的对应属性中
3.如果bean属于BeanNameAware的实现,则将当前的beanName,set进bean的对应属性中
2. 执行 BeanPostProcessor Before 处理
1.获取BeanPostProcessor注册表
2.遍历执行postProcessBeforeInitialization前置方法
3.执行 Bean 对象的初始化方法(两种)
1.如果bean对象实现了InitializingBean接口则直接调用afterPropertiesSet方法
2.如果bean对象没有实现InitializingBean接口当时Beandefinition中有InitMethodName这个属性则通过反射来调用这个属性中的方法名
4. 执行 BeanPostProcessor After 处理
1.获取BeanPostProcessor注册表
2.遍历执行postProcessAfterInitialization后置方法
5.注册实现了 DisposableBean 接口的 Bean 对象(两种方式判断是否实现了DisposableBean接口,1.beandefinition中含有DestroyMethodName属性;2.bean实现了DisposableBean接口)
非 Singleton 类型的 Bean 不执行销毁方法
5.将bean对象实例加到单例bean容器中
1.如果beandefinition中singleton属性为true则加到单例bean容器中
2.如果是false则不加入到单例bean容器中
获取bean实例
该bean没有实现FactoryBean接口就直接返回当前bean
如果实现了FactoryBean接口那么则执行Factory实现类的getObject方法来获取一个代理对象,当代理对象执行方法时候执行getObject中的操作
发布容器刷新完成事件
1.首先获取该事件(刷新事件)对应的监听器
2.轮询监听器执行该事件
虚拟机关闭钩子注册调用销毁方法
执行销毁单例bean的销毁方法
执行销毁单例bean的销毁方法
执行销毁单例bean的销毁方法
发布容器关闭事件
获取Bean对象调用方法流程
直接从单例bean容器中获取bean对象
虚拟机关闭钩子来调用销毁方法
收藏
收藏
0 条评论
下一页