目录
容器基本用法
功能分析
测试代码
分析
Spring的结构组成
beans包的层级结构
核心类介绍
DefaultListableBeanFactory
XmlBeanDefinitionReader
容器基本用法
先写一个简单的Bean(一个简单的Java类)
public class MyTestBean {
prvate String testStr = "testStr";
public String getTestStr () {
return testStr;
}
public void setTestStr(Str ng testStr) {
this . testStr = testStr;
}
}
然后是相关的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="autowired" class="bean.MyTestBean"/>
</beans>
最后来一段测试代码
@SuppressWarnings("deprecation")
public class BeanFactoryTest (
@Test
public vo testSirnpleLoad(){
//读取配置文件 beanFactoryTest.xml
BeanFactory bf = new XmlBeanFactory (new ClassPathResource("beanFactoryTest "));
//根据 beanFactoryTest.xml 中的配置找到对应的类的配置,并实例化
MyTestBean bean=(MyTestBean) bf.getBean("myTestBean");
//调用实例化后的实例
assertEquals("testStr",bean getTestStr());
}
功能分析
测试代码
- 读取配置文件 beanFactoryTest.xml
- 根据 beanFactoryTest.xml 中的配置找到对应的类的配置,并实例化
- 调用实例化后的实例
分析
如果要想完成我们预想的功能,至少需要3个类。
- ConfigReader:用于读取以及验证配置文件。
- ReflectUtil:用于更具配置文件中的配置惊醒反射实例化。(更具上面的xml配置,对MyTestBean进行实例化)
- App:用于串联整个逻辑的串联。
(无需在意这三个类应该叫什么名,哪怕是起名ABCD都不要紧,重点是 功能 )
最简单的Spring功能架构
Spring的结构组成
我们首先尝试梳理Spring的框架结构,从全局的角度了解Spring的结构组成
beans包的层级结构
这里截取了5.2的图
- src/main/j ava 用于展现 Spring 的主要逻辑
- src/main/resources 用于存放系统的配置文件
- src/test/j ava 用于对主要逻辑进行单元测试
- src/test/resources 用于存放测试用的配置文件
- src/test/ testfixture 测试夹具 暂不清楚是做什么用途的,网上搜出来的内容基本跟Python测试相关,详细的内容可以看看这个链接
Spring Beans层级架构
核心类介绍
通过对beans工程的结构介绍,我们现在对beans的工程结构有了初步的认识,但是再正式开始源码分析之前,有必要了解Spring中核心的两个类。
DefaultListableBeanFactory
XmlBeanFactory 继承自 DefaultListableBeanFactory ,而 DefaultListableBeanFactory 是整个bean记载的核心部分,是Spring注册及加载 bean的默认实现。
XmlBeanFactory 与 DefaultListableBeanFactory 不同的地方在于 XmlBeanFactory 中使用了自定义的XML读取器(XmlBeanDefinitionReader),实现了个性化的BeanDefinitionReader读取。
DefaultListableBeanFactory 继承了 AbstractAutowireCapableBeanFactory ,并且实现了 ConfigurableListableBeanFactory 和 BeanDefinitionRegistry
下面插入一张容器加载相关类图,标红部分是上面文字中提到的相关类:
容器加载相关类图
从上面的容器加载类图,可以从全局角度了解 DefaulatListableBeanFactory 的脉络。
下面是对其他一些类的功能说明:
- AliasRegistry:定义 alias 的简单增删改查等操作。
- SimpleAliasRegistry:主要使用map作为alias的缓存,并对接口AliasRegistry进行实现。
- SingletonBeanRegistry:定义对单例的注册及获取。
- BeanFactory:定义获取bean及bean的各种属性。
- DefaultSingletonBeanRegistry:对接口SingletonBeanRegistry各函数的实现。
- HierarchicalBeanFactory:继承BeanFactory,也就是再BeanFactory定义的功能的基础上增加了对parentFactory的支持。
- BeanDefinitionRegistry:定义对BeanDefinition的各种增删改操。
- FactoryBeanRegistrySupport :再在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能。
- ConfigurableBeanFactory:提供配置Factory的各种方法。
- ListableBeanFactory:根据各种条件获取bean的配置清单。
- AbstractBeanFactory:综合FactoryBeanRegistrySupport和ConfigurableBeanFactory的功能
- AutowireCapableBeanFactory:提供创建bean、自动注入、初始化以及应用bean的后处理器。
- AbstractAutowireCapab eBeanFactory:综合AbstractBeanFactory并对接口AutowireCapableBeanFactory进行实现。
- ConfigurableListableBeanFactory:BeanFactory配置清单,指定忽略类型及接口等。
- DefaultListableBeanFactory:综合上面所有功能,主要是对bean注册后的处理。
XmlBeanFactory在3.1以后已经被废弃,不再推荐使用,不知道书里为什么讲这个,咱们先往下面看,以后再回来填这个坑,找了一些分析废弃原因的帖子,可以了解一下
XmlBeanFactory 对 DefaulatListableBeanFactory 类进行了扩展,主要用于从XML文档中读取BeanDefinition,对于注册和获取bean都是使用父类 DefaulatListableBeanFactory 的方法去实现,而唯独与父类不同的个性化实现就是增加了 XmlBeanDefinitionReader 类型的reader属性属性。在XmlBeanFactory 中主要使用reader属性对资源文件进行读取和注册。
XmlBeanDefinitionReader
XML配置文件的读取是Spring中重要的功能,因为Spring的大部分功能都是以配置作为切入点的,那么我们可以从XmlBeanDefinitionReader 中梳理一下资源读取、解析及注册的大致脉络,首先我们看看各个类的功能
等下搜一篇帖子详细看一下,书中的类图与idea中的类图差别有点大
配置文件读取相关类图