spring3.2源码系列-初识spring(一)

Spring框架是一个分层的架构,如下图所示。
在这里插入图片描述

  • Data Access/Integration层包含有JDBC、ORM、OXM、JMS和Transaction模块。

  • Web层包含了Web、Web-Servlet、WebSocket、Web-Porlet模块。

  • AOP模块提供了一个符合AOP联盟标准的面向切面编程的实现。

  • Core Container(核心容器):包含有Beans、Core、Context和SpEL模块。

  • Test模块支持使用JUnit和TestNG对Spring组件进行测试。

    到此spring的概念就不一一列举了,各种书籍上都有,总结的文章可以看下面的这个:
    https://www.cnblogs.com/wmyskxz/p/8820371.html

    我们从spring最基础的应用讲起,一步步深入的了解源码。首先是定义一个简单的bean,spring的思想是让我们的bean作为一个纯粹的POJO存在。

public class Student {
	private String name = "Hello Spring";

	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
}

spring的配置文件applicationContext.xml我们这样写:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="student" class="bean.Student" />

</beans>

准备好这些,我们就可以通过写测试类,获得spring所管理的这个bean了。

@SuppressWarnings("deprecation")
public class BeanFactoryTest {
	@Test
	public void testSimpleLoad() {
	    /** 1. 读取配置文件applicationContext.xml,根据配置文件中的配置找到对应的类实例化 */
		BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
		/** 2. 通过名称获取spring实例化的类 */
		Student student = beanFactory.getBean("student");
		assertEquals("Hello Spring", student.getName());
	}
}

注:java.lang.SuppressWarnings是J2SE 5.0中标准的Annotation之一。可以标注在类、字段、方法、参数、构造方法,以及局部变量上。作用:告诉编译器忽略指定的警告,不用在编译完成后出现警告信息。

@SuppressWarnings(“deprecation”)
如果使用了使用@Deprecated注释的方法,编译器将出现警告信息。使用这个注释将警告信息去掉。

接下来我们从第一步开始来看看spring的源码,首先来看看 XmlBeanFactory 的类图(在Spring3.1以后XmlBeanFactory类被废除了),如下图所示

在这里插入图片描述注:图中蓝色实现是类的继承关系,绿色实线是接口的继承关系,绿色虚线实现关系

  • 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的后处理器;
  • AbstractAutowireCapableBeanFactory:综合 AbstractBeanFactory 并实现接口 AutowireCapableBeanFactory;
  • ConfigurableListableBeanFactory:BeanFactory 配置清单;
  • DefaultListableBeanFactory:综合上面所有的功能,对bean做处理后的注册。

XmlBeanFactory 对 DefaultListableBeanFactory 类进行了扩展
1、使用父类进行bean的注册和获取。
2、使用 XmlBeanDefinitionReader 类型的reader属性对资源文件xml读取、解析和注册。

@Deprecated
@SuppressWarnings({"serial", "all"})
public class XmlBeanFactory extends DefaultListableBeanFactory {
	
	private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);

	/**
	 * Create a new XmlBeanFactory with the given resource,
	 * which must be parsable using DOM.
	 * @param resource XML resource to load bean definitions from
	 * @throws BeansException in case of loading or parsing errors
	 */
	public XmlBeanFactory(Resource resource) throws BeansException {
		this(resource, null);
	}

	/**
	 * Create a new XmlBeanFactory with the given input stream,
	 * which must be parsable using DOM.
	 * @param resource XML resource to load bean definitions from
	 * @param parentBeanFactory parent bean factory
	 * @throws BeansException in case of loading or parsing errors
	 */
	public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
		super(parentBeanFactory);
		this.reader.loadBeanDefinitions(resource);
	}
}

接下来我们看看 XmlBeanDefinitionReader 类的相关类图:
在这里插入图片描述

  • BeanDefinitionReader: 主要定义资源文件读取并转换为 BeanDefinition 的各个功能。
  • EnvironmentCapable: 定义获取 Environment 方法。
  • AbstractBeanDefinitionReader: 对 EnvironmentCapable、BeanDefinitionReader 类定义的功能进行实现。
  • AbstractBeanDefinitionReader 类中的 ResourceLoader(接口) 属性,定义资源加载器,主要应用于根据给定的资源文件地址返回对应的 Resource.
  • XmlBeanDefinitionReader 类中的 DocumentLoader(接口) 属性,定义从资源文件加载到转换为 Document 的功能。
  • XmlBeanDefinitionReader 类中的 BeanDefinitionDocumentReader(接口) 属性,定义读取 Document 并注册 BeanDefinition 功能。
  • BeanDefinitionDocumentReader 接口的实现类 DefaultBeanDefinitionDocumentReader 类使用 BeanDefinitionParserDelegate 类,定义解析 Element 的各种方法。

最终 XmlBeanDefinitionReader 解析XML的大致流程如下:

  1. 通过继承自 AbstractBeanDefinitionReader 中的方法,来使用 ResourLoader 将资源文件路径转换为对应的 Resource 文件。
  2. 通过 DocumentLoader 对 Resource 文件进行转换,将 Resource 文件转换为 Document 文件。
  3. 通过实现接口 BeanDefinitionDocumentReader 的 DefaultBeanDefinitionDocumentReader 类对 Document 进行解析,并使用 BeanDefinitionParserDelegate 类对 Element 进行解析。

下一篇文章 我们将深入XML是如何加载并解析成 BeanDefinition的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值