我们都知道,Spring的核心功能之一就是统一管理应用的各类对象,通过IOC机制,使得开发人员可以不用new 关键字去创建对象,而是将类交给Spring容器进行管理,当我们需要某个类的对象时,直接伸手向Spring要就可以了;
1.先看一下我们应该怎么向Spring容器这个媒婆伸手要对象呢?
简单的代码实现:
第一步:定义类
package zgjzzm.bean;
@Data
public class MyObject{
private String name = "美丽善良温柔的对象";
}
第二步:在Spring配置文件中配置类
<bean id="myObject" class="zgjzzm.bean.MyObject" />
第三步到第六步:从Spring获取对象
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("MyObject.xml"));
MyObject myObject = (MyObject) beanFactory.getBean("myObject");
System.out.println(myObject.name);
**
所以,Spring容器要完成对象的创建,需要两个主要步骤,一是读取配置文件中的类信息,二是根据类信息通过反射完成对象的实例化;
**
2.Spring容器相关的代码主要在源码工程的spring-bean模块下面,如图所示:
Spring-bean真正创建对象时肯定不是这么简单的,里面有两个核心类,分别是DefaultListableBeanFactory类、XmlBeanDefinitionReader类;
2.1 DefaultListableBeanFactory类
这个类是bean加载的核心部分,是Spring注册以及加载bean的默认实现;
上述代码中的XmlBeanFactory类就是继承了DefaultListableBeanFactory类,唯一不同的就是它使用了自定义的xml读取器XmlBeanDefinitionReader,实现了BeanDefinitionReader的个性化读取;
关于这个类相关的UML图,如下所示:
下面对这些类、接口进行简单的介绍;
2.1.1 AliasRegistry
这是一个接口,定义了alias的简单的增删改查等操作;
接口位置:org.springframework.core;
2.1.2 SimpleAliasRegistry
这是一个类,它实现了AliasRegistry接口,里面采用map对alias信息进行缓存;
类位置:org.springframework.core;
2.1.3 SingletonBeanRegistry
这是一个接口,定义了对单例的注册和获取操作;
接口位置:org.springframework.beans.factory.config;
2.1.4 BeanFactory
这是一个接口,定义了bean的获取以及各种属性;
位置:org.springframework.beans.factory;
2.1.5 DefaultSingletonBeanRegistry
这是一个类,它继承了SimpleAliasRegistry类,以及实现了SingletonBeanRegistry接口;
位置:org.springframework.beans.factory.support
2.1.6 HierarchicalBeanFactory
这是个接口,它继承了BeanFactory接口,添加了对ParentBeanFactory获取的支持;
位置:org.springframework.beans.factory;
2.1.7 BeanDefinitionRegistry
这是一个接口,继承了AliasRegistry,里面主要定义了对BeanDefinition的各种增删改查操作;
位置:org.springframework.beans.factory.support;
2.1.8 FactoryBeanRegistrySupport
这是一个抽象类,继承了DefaultSingletonBeanRegistry类,主要提供了对FactoryBean的特殊处理;
位置:org.springframework.beans.factory.support;
2.1.9 ConfigurableBeanFactory
位置:org.springframework.beans.factory.config;
这是一个接口,继承了HierarchicalBeanFactory、SingletonBeanRegistry
提供了对Factory进行配置的各种方法;
2.1.10 ListableBeanFactory
位置:org.springframework.beans.factory;
这是一个接口:继承了BeanFactory ;
另外,提供根据各种条件获取bean的配置清单的方法;
2.1.11 AbstractBeanFactory
位置:org.springframework.beans.factory.support;
这是一个抽象类,继承了FactoryBeanRegistrySupport ,实现了ConfigurableBeanFactory ;
综合FactoryBeanRegistrySupport 和ConfigurableBeanFactory 的功能;
2.1.12 AutowireCapableBeanFactory
位置:org.springframework.beans.factory.config;
这是一个接口,继承了BeanFactory;
提供了创建bean、自动注入、初始化以及应用bean的后处理器;
2.1.13 AbstractAutowireCapableBeanFactory
位置:org.springframework.beans.factory.support;
这是一个抽象类,它继承了AbstractBeanFactory,实现了AutowireCapableBeanFactory;
对AbstractBeanFactory、和AutowireCapableBeanFactory进行了一个综合;
2.1.14 ConfigurableListableBeanFactory
位置:org.springframework.beans.factory.config;
这是一个接口,它继承了ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory;
主要是对BeanFactory配置清单操作定义、指定忽略类型以及接口等;
2.1.15 DefaultListableBeanFactory
位置:org.springframework.beans.factory.support;
这是一个类,它继承了AbstractAutowireCapableBeanFactory,实现了ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable;
它综合了上述的所有功能,主要是对bean注册后的处理;
2.2 XmlBeanDefinitionReader
这是个类,主要是基于xml配置文件,对bean的信息进行读取、解析;
整体来看,xml配置文件读取的流程可简单分为三步,如下所示:
其UML图如下所示:
下面对这些类/接口进行简单的介绍;
2.2.1 ResourceLoader
这是一个接口,定义了资源文件加载器,主要应用于根据给定的资源文件地址返回对应的Resource文件;
位置:org.springframework.core.io;
2.2.2 BeanDefinitionReader
这是个接口,主要定义对资源文件进行转换为BeanDefinition的各个功能;
位置:org.springframework.beans.factory.support;
2.2.3 EnvironmentCapable
这是个接口,定义了获取Environment的方法;
位置:org.springframework.core.env;
2.2.4 AbstractBeanDefinitionReader
这是个抽象类,主要是对BeanDefinitionReader, EnvironmentCapable这两个接口进行实现;
位置:org.springframework.beans.factory.support;
2.2.5 BeanDefinitionDocumentReader
这是个接口,定义读取Document并注册BeanDefinition的方法;
位置:org.springframework.beans.factory.xml;
2.2.6 BeanDefinitionParserDelegate
这是一个类,定义了解析Element的各种方法;
以上就是对《容器的基本实现-之容器基本用法》的简单介绍,欢迎有兴趣的小伙伴留言讨论!
参考书籍:《Spring5.0源码深度解析》