【spring源码阅读】一、Bean工厂类结构

Bean工厂使用简单示例

pojo类

public class Student {
	private String name;
	private int age;
	private String hobby;
	
	// ellipsis get/set methods
	
	@Override
	public String toString() {
		return "Student{" +
				"name='" + name + '\'' +
				", age=" + age +
				", hobby='" + hobby + '\'' +
				'}';
	}
}

xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "https://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>
	<bean class="org.springframework.custom.beans.Student">
		<property name="name" value="john"/>
	</bean>
</beans>

测试类

public class CustomTest {

	@Test
	public void testXmlFactory() {
		DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
		XmlBeanDefinitionReader definitionReader = new XmlBeanDefinitionReader(beanFactory);
		ClassPathResource classPathResource = new ClassPathResource("spring.xml");
		definitionReader.loadBeanDefinitions(classPathResource);

		Student bean = beanFactory.getBean(Student.class);
		System.out.println(bean);
	}
}

不出意料打印了student信息

Student{name='john', age=0, hobby='null'}

核心类介绍

一、DefaultListableBeanFactory

通过对 beanFactory的简单例子可以对其使用有了一定认识,接下来我们重点关注 示例中的 DefaultListableBeanFactory类。

DefaultListableBeanFactory是整个bean加载的核心部分,是Spring注册及加载bean的默认实现,DefaultListableBeanFactory继承了AbstractAutowireCapableBeanFactory并实现了ConfigurableListableBeanFactory以及BeanDefinitionRegistry接口。下图是DefaultListableBeanFactory的相关类图。
在这里插入图片描述
从上面的类图以及层次结构图中,我们可以很清晰地从全局角度了解DefaultListableBeanFactory的脉络。如果读者没有了解过Spring源码可能对上面的类图不是很理解,不过没关系,我会逐渐了解每个类的作用。那么,让我们先简单地了解图中各个类的作用。

AliasRegistry:定义对alias的简单增删改等操作。

public interface AliasRegistry {
	void registerAlias(String name, String alias);
	void removeAlias(String alias);
	boolean isAlias(String name);
	String[] getAliases(String name);
}

SimpleAliasRegistry:主要使用map作为alias的缓存,并对接口AliasRegistry进行实现。

SingletonBeanRegistry:定义对单例的注册及获取。

BeanFactory:定义获取beanbean的各种属性。

DefaultSingletonBeanRegistry:对接口SingletonBeanRegistry各函数的实现。

HierarchicalBeanFactory:继承BeanFactory,也就是在BeanFactory定义的功能的基础上增加了对parentFactory的支持。

BeanDefinitionRegistry:定义对BeanDefinition的各种增删改操作。

FactoryBeanRegistrySupport:在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能。

ConfigurableBeanFactory:提供配置Factory的各种方法。

ListableBeanFactory:根据各种条件获取bean的配置清单。

AbstractBeanFactory:综合FactoryBeanRegistrySupportConfigurableBeanFactory的功能。

AutowireCapableBeanFactory:提供创建bean、自动注入、初始化以及应用bean的后处理器。

AbstractAutowireCapableBeanFactory:综合AbstractBeanFactory并对接口AutowireCapableBeanFactory进行实现。

ConfigurableListableBeanFactoryBeanFactory配置清单,指定忽略类型及接口等。

DefaultListableBeanFactory:综合上面所有功能,主要是对bean注册后的处理。

二、XmlBeanDefinitionReader

XML配置文件的读取是Spring中重要的功能,因为Spring的大部分功能都是以配置作为切入点的,那么我们可以从XmlBeanDefinitionReader中梳理一下资源文件读取、解析及注册的大致脉络,首先我们看看各个类的功能。

ResourceLoader:定义资源加载器,主要应用于根据给定的资源文件地址返回对应的Resource。

BeanDefinitionReader:主要定义资源文件读取并转换为BeanDefinition的各个功能。

EnvironmentCapable:定义获取Environment方法。

DocumentLoader:定义从资源文件加载到转换为Document的功能。

AbstractBeanDefinitionReader:对EnvironmentCapableBeanDefinitionReader类定义的功能进行实现。

BeanDefinitionDocumentReader:定义读取Docuemnt并注册BeanDefinition功能。

BeanDefinitionParserDelegate:定义解析Element的各种方法。

XmlBeanDifinitionReader中主要包含以下几步的处理。

  1. 通过继承自AbstractBeanDefinitionReader中的方法,来使用ResourLoader将资源文件路径转换为对应的Resource文件。

  2. 通过DocumentLoader对Resource文件进行转换,将Resource文件转换为Document文件。

  3. 通过实现接口BeanDefinitionDocumentReader的DefaultBeanDefinitionDocumentReader类对Document进行解析,并使用BeanDefinitionParserDelegate对Element进行解析。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值