博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring ApplicationContext中Bean的生命周期
阅读量:5348 次
发布时间:2019-06-15

本文共 3542 字,大约阅读时间需要 11 分钟。

AbstractApplicationContext

Spring的AbstractApplicationContext是ApplicationContext的抽象实现类,该抽象类的refresh方法定义了spring容器在加载配置文件后的各项处理过程

public void refresh() throws BeansException, IllegalStateException {        synchronized (this.startupShutdownMonitor) {            prepareRefresh();            // 初始化BeanFactory            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();            prepareBeanFactory(beanFactory);            try {                postProcessBeanFactory(beanFactory);                /**                 *  调用工厂后处理器:                 *  根据反射机制找出所有实现了BeanFactoryPostProcessor接口的Bean,                 *  并调用其postProcessBeanFactory()接口方法                 */                invokeBeanFactoryPostProcessors(beanFactory);                /**                 * 注册Bean后处理器:                 * 根据反射机制找出所有实现了BeanPostProcessor接口的Bean,                 * 并注册                 */                registerBeanPostProcessors(beanFactory);                // 初始化消息源:初始化容器的国际化消息资源                initMessageSource();                // 初始化Application事件广播器                initApplicationEventMulticaster();                // 初始化其他特殊的Bean,由具体子类实现                onRefresh();                // 注册事件监听器                registerListeners();                // 初始化所有单例的Bean,使用懒加载的除外                finishBeanFactoryInitialization(beanFactory);                // Last step: publish corresponding event.                finishRefresh();            }            catch (BeansException ex) {                if (logger.isWarnEnabled()) {                    logger.warn("Exception encountered during context initialization - " +                            "cancelling refresh attempt: " + ex);                }                // Destroy already created singletons to avoid dangling resources.                destroyBeans();                // Reset 'active' flag.                cancelRefresh(ex);                // Propagate exception to caller.                throw ex;            }            finally {                // Reset common introspection caches in Spring's core, since we                // might not ever need metadata for singleton beans anymore...                resetCommonCaches();            }        }    }
AbstractApplicationContext源码

1、ResourceLoader加载配置信息,并使用Resource表示配置文件

2、BeanDefinitionReader读取Resource的配置文件,并解析配置文件——把配置文件中的每个<bean>解析成一个BeanDefinition对象,并保存到BeanDefinitionRegistry中。

BeanDefinition接口有一个抽象类AbstractBeanDefinition,AbstractBeanDefinition有两个实现类,ChildBeanDefinition和RootBeanDefinition。

在xml配置文件中,可以定义父<bean>和了<bean>,父<bean>用RootBeanDefinition来表示,子<bean>用ChildBeanDefinition表示;没有父<bean>的<bean>直接使用RootBeanDefinition表示;AbstractBeanDefinition对二者共同的类信息进行抽象。

3、容器扫描所有的BeanDefinition,使用反射机制识别出Bean工厂后处理器——即实现了BeanFactoryPostProcessor接口的bean,并调用这些Bean工厂后处理器的postProcessBeanFactory方法对BeanDefinition进行加工处理,主要完成以下两项任务:

a.解析使用占位符的<bean>元素,得到配置值

b.扫描所有的BeanDefinition,通过java反射机制找出所有属性编辑器的bean——即实现了java.beans.PropertyEditor接口的bean,并将它们注册到spring的属性编辑器注册表中。

4、调用InstantiationStrategy实例化bean

这里用到了策略模式:InstantiationStrategy接口有一个实现类SimpleInstantiationStrategy,SimpleInstantiationStrategy又有一个实现类CglibSubclassingInstantiationStrategy;SimpleInstantiationStrategy是最常用到的实例化策略;CglibSubclassingInstantiationStrategy利用CGLib为bean动态生成子类,在子类中生成方法注入的逻辑以支持方法注入,然后使用这个动态生成的子类创建Bean的实例。

5、实例化bean后,容器主程序调用BeanWrapper的setWrapperInstance(Object obj)方法把实例化后的bean传递到BeanWrapper里。

6、BeanWrapper结合BeanDefinition、属性编辑器完成属性注入

7、使用Bean后处理器——实现了BeanPostProcessor接口的bean,对bean进行后续加工——SpringAOP就是在这里实现的。

 

转载于:https://www.cnblogs.com/Mike_Chang/p/10274028.html

你可能感兴趣的文章
双重标准,我该怎么解决
查看>>
python中的网页标签等字符处理
查看>>
Mybatis输入类型和结果类型
查看>>
Linux常用命令(五)
查看>>
Linux常用命令(四)
查看>>
Linux常用命令(六)
查看>>
Linux常用命令(六)
查看>>
Linux常用命令(八)
查看>>
Linux常用命令(七)
查看>>
Linux常用命令(九)
查看>>
Linux常用命令(十一)
查看>>
Linux常用命令(十)
查看>>
实验吧之这就是一个坑
查看>>
Linux常用命令(十二)
查看>>
Linux常用命令(十三)
查看>>
Linux常用命令(十五)
查看>>
Linux常用命令(十四)
查看>>
Linux常用命令(十七)
查看>>
Linux常用命令(十六)
查看>>
Linux常用命令(二十四)
查看>>