Spring源码中关键类的梳理工作-创新互联
为了便于自己及大家对源码的深刻了解,现在将Spring中的关键类进行一个关系的梳理。梳理类之前,我们不妨简单梳理一遍Spring的ioc的加载流程, ApplicationContext classPath = new MyClassPathXmlApplicationContext("appicationContext.xml");一共一行代码,内容却很多。
创新互联建站是一家企业级云计算解决方案提供商,超15年IDC数据中心运营经验。主营GPU显卡服务器,站群服务器,资阳托管服务器,海外高防服务器,机柜大带宽租用·托管,动态拨号VPS,海外云手机,海外云服务器,海外服务器租用托管等。1. 首先会创建一些资源加载器,创建一些环境所需要的东西
2. 然后就会对配置文件名进行解析处理。
3. 做一些容器的初始化工作,包括但不限于设置容器的启动时间、设置活跃状态,准备监听器集合,事件集合等
4. 创建容器并加载xml文件,然后把文件内容封装成可以处理的对象
5.
大致流程了解了,我们需要按照正常的思路来梳理一些关键类
一、资源: 1. 容器的本质就是要把appicationContext.xml文件读取并封装到容器中并按照一定的规则进行实例化和初始化的工作。由于我们的bean
都在里边进行配置定义,那 Spring 总得对这个文件进行读取并解析
吧!Resource就是表示资源的大的抽象接口,其中有很多对具体文件类型、资源类型的解析的实现类:(这种设计模式也是Spring常用的策略模式)
2. 表示资源的有了,就需要有加载资源的类,于是就有了ResourceLoader组件,该组件负责对 Spring 资源的加载,资源指的是xml
、properties
等文件资源,返回一个对应类型的Resource
对象。ResourceLoader
组件其实跟Resource
组件差不多,都是一个根接口,对应有不同的子类实现,比如加载来自文件系统的资源,则可以使用FileSystemResourceLoader
, 加载来自ServletContext
上下文的资源,则可以使用ServletContextResourceLoader
。还有最重要的一点,ApplicationContext
,AbstractApplication
是实现了ResourceLoader
的,这说明什么呢?说明我们的应用上下文ApplicationContext
拥有加载资源的能力,这也说明了为什么可以通过传入一个String resource path
给ClassPathXmlApplicationContext("applicationContext.xml")
就能获得 xml 文件资源的原因了。
3. 既然我们拥有了加载器ResourceLoader
,也拥有了对资源的描述Resource
, 但是我们在 xml 文件中声明的
标签在 Spring 又是怎么表示的呢?于是就引入一个叫BeanDefinition
的组件,该组件对bean的属性的做了全部的定义:常见的scope,dependOn等
二、加载:
BeanDefinition有很多实现子类:
其中RootBeanDefinition
是最常用的实现类,它对应一般性的元素标签,
GenericBeanDefinition
是自2.5
以后新加入的bean
文件配置属性定义类,是一站式服务类。在配置文件中可以定义父和子
,父
用
RootBeanDefinition
表示,而子用
ChildBeanDefiniton
表示,而没有父的
就使用
RootBeanDefinition
表示。AbstractBeanDefinition
对两者共同的类信息进行抽象。Spring
通过BeanDefinition
将配置文件中的配置信息转换为容器的内部表示,并将这些
BeanDefiniton
注册到BeanDefinitonRegistry
中。Spring
容器的BeanDefinitionRegistry
就像是Spring
配置信息的内存数据库,主要是以map
的形式保存,后续操作直接从BeanDefinitionRegistry
中读取配置信息。一般情况下,BeanDefinition
只在容器启动时加载并解析,除非容器刷新或重启,这些信息不会发生变化,当然如果用户有特殊的需求,也可以通过编程的方式在运行期调整BeanDefinition
的定义。
1. 有了加载器ResourceLoader
,也拥有了对资源的描述Resource
,也有了对bean
的定义,我们不禁要问,我们的Resource
资源是怎么转成我们的BeanDefinition
的呢?BeanDefinitionReader
组件就诞生了。其实现子类中有PropertiedBeanDefinitionReader
,XmlBeanDefinitionReader和GroovyBeanDefinitionReader分别对不同类型的文件进行加载。
2. 以上组件齐全以后就具备了把资源加载到工厂的能力了
,但是还需要将BeanDefinition注册到工厂中去,这样使用getBean()的时候才能获取到对应的bean,BeanDefinitionRegistry就出现了。
其定义了如何把beanDefinition注册到容器中的规范:
其对应的是实现类:
三、环境,配置:SimpleBeanDefinitionRegister,DefaultListableBeanFactory,GenericApplicationContext,其中
SimpleBeanDefinitionRegistry
,DefaultListableBeanFactory
都持有一个 Map,也就是说这两个实现类都保存了 bean。而GenericApplicationContext
则持有一个DefaultListableBeanFactory
对象引用用于获取里边对应的 Map。
以上两点中ApplicationContext贯穿了所有,因此称之为容器。除了加载和存储的过程,还有一些比如:Environment(环境),PropertyPlaceholderHelper(资源占位符),BeanFactory(获取和处理bean的工厂类)等。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
当前题目:Spring源码中关键类的梳理工作-创新互联
文章位置:http://scyanting.com/article/dpihis.html