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