第二章 容器的基本实现-之容器基本用法

我们都知道,Spring的核心功能之一就是统一管理应用的各类对象,通过IOC机制,使得开发人员可以不用new 关键字去创建对象,而是将类交给Spring容器进行管理,当我们需要某个类的对象时,直接伸手向Spring要就可以了;

1.先看一下我们应该怎么向Spring容器这个媒婆伸手要对象呢?

向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源码深度解析》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值