Fork me on GitHub

Spring源码 - 主题

注意:所有文章除特别说明外,转载请注明出处.

## Spring 容器高级主题 --- title: Spring 高级主题 tags: - Spring categories: - Spring copyright: true showdonate: true date: 2019-10-15 09:22:26 comments: true password: ---

注意:所有文章除特别说明外,转载请注明出处.

Spring容器技术内幕

1 内部工作机制

Spring 的 AbstractApplication 是 ApplicationContext 的抽象实现类,该抽象实现类的 refresh() 方法定义了Spring容器在加载配置文件后的各项处理过程,这些处理过程清晰刻画Spring容器启动时所执行的各项操作。

//refresh()方法内部定义的执行逻辑
//1. 初始化BeanFactory Spring将配置文件信息装入容器的Bean定义注册表(BeanDefinitionRegistry)中,但是此时Bean还没有初始化。
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

//2. 调用工厂后处理器 根据反射机制从 BeanDefinitionRegistry 中找出所有实现了 BeanFactoryPostProcessor 接口的Bean,并调用其 postProcessBeanFactory() 接口方法。
invokeBeanFactoryPostProcessors();

//3. 注册Bean后处理器 根据反射机制从 BeanDefinitionRegistry 找到所有实现了 BeanPostProcessor 接口的Bean,并将它们注册到容器Bean后处理器的注册表中。
registerBeanPostProcessors();

//4. 初始化消息源 初始化容器的国际化消息资源
initMessageSource();

//5. 初始化应用上下文事件广播器 初始化应用上下文事件广播器。
initApplicationEventMulticaster();

//6. 初始化其它特殊Bean:由具体子类实现
onRefresh();

//7. 注册事件监听器
registerListeners();

//8. 初始化所有单实例的Bean,使用懒加载模式的Bean例外 初始化所有Bean之后将它们放在Spring容器的缓存池中。
finishBeanFactoryInitialization(beanFactory);

//9. 完成刷新并发布容器刷新事件 创建上下文刷新事件,事件广播器负责将这些事件广播到每个注册的事件监听器中。
finishRefresh();

1.1 Spring容器从加载配置文件到创建出一个完成Bean的作业流程

    配置文件 -- ResourceLoader装载配置文件 --> Resource -- BeanDefinitionReader解析配置文件信息 --> BeanDefinitionRegistry(加工前的BeanDefinition)
                                                                                                        |                           |
                                                                                                        | BeanFactoryPostProcessor  |
                                                                                                        |      对配置信息加工       |
                                                                                                BeanDefinitionRegistry      PropertyEditorRegistry
                                                                                                (加工后BeanDefinition)      (存放自定义PropertyEditor)
                                                                                                        |                               |
                                                                                                        |                               |
                                                                                InsttantiationStrategy(实例化Bean对象)      BeanWrapper(设置Bean属性)              
                                                                                                        |                       /      |
                                                                                                        |                      /       |
                                                                                                    Bean实例(没设置属性)   ->   Bean实例(已设置属性)
                                                                                                                                        |
                                                                                                                                        |
                                                                                                                         BeanPostProcessor(对Bean进行加工)
                                                                                                                                        |
                                                                                                                                    bean实例


1.ResourceLoader:从存储介质中加载Spring配置信息,并使用Resource表示这个配置文件资源。

2.BeanDefinitionReader:读取Resource所指向的配置文件资源,然后解析配置文件。配置文件中的每个<bean>解析成一个BeanDefinition对象,并保存到BeanDefinitionRegistry中。

...

提示:Spring组件按照所承担角色划分为:1.物料组件:Resource | BeanDefinition | PropertyEditor | Bean 等,它们是在加工流程中被加工 | 被消费的组件,就像流水线的被加工的物料一样。2.设备组件:ResourceLoader …,它们相当于在流水线上不同环节的加工设备,对物料组件进行加工处理。

2 BeanDefinition

….BeanDefinition 是配置文件 元素标签在容器中的内部表示。Spring 通过BeanDefinition 将配置文件中的 配置信息转换成容器的内部表示,并将这些 BeanDefinition 注册到 BeanDefinitionRegistry 中。Spring容器中的 BeanDefinitionRegistry 就像Spring配置信息的内存数据库。

3 InstantiationStrategy

…InstantiationStrategy 负责根据BeanDefinition 对象创建一个 Bean 实例。SimpleInstantiationStrategy 是最常用的实例化策略,该策略利用Bean实现类的默认构造函数 带参构造函数或者工厂方法创建Bean实例。该组件只负责实例化Bean操作,相当于new功能,不会参与 Bean属性配置工作。属性填充交给BeanWrapper完成。

4 BeanWrapper

…BeanWrapper是Spring框架重要组件类。BeanWrapper相当于一代理器,Spring委托BeanWrapper完成Bean属性的填充工作。

属性编辑器

任何实现了java.beans.PropertyEditor接口的类都是属性编辑器。属性编辑器的主要功能就是将外部的设置值转换为JVM内部的对象类型,所以属性编辑器就是一个类型转换器。

引用Bean属性值

容器事件

Spring的ApplicationContext能够发布事件并且允许注册相应的事件监听器,所以它拥有一套完善的事件发布和监听机制。

1.Spring事件类结构

1.1 事件类

ApplicationEvent的唯一构造函数是 ApplicationEvent(Object source) ,通过source指定事件源。其有两个子类:1.ApplicationContextEvent:容器事件,其有四个子类,分别表示容器启动、属性、关闭和停止事件。2.RequestHandlerEvent:此是一个与Web应用相关的事件,当一个HTTP请求被处理后,产生该事件。

1.2 事件监听接口

Spring的事件监听器继承自 ApplicationListener 。ApplicationListener接口只定义一个方法:onApplicationEvent(E event),该方法接收 ApplicationEvent 事件对象,对应响应处理逻辑。

1.3 事件广播

当发生容器事件时,容器主控程序将调用事件广播器将事件通知给事件监听器注册表中的事件监听器,事件监听器分别对事件作出响应。

本文标题:Spring源码 - 主题

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 08:51:42

原始链接:http://bangjinhu.github.io/undefined/Spring 容器高级主题/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.