[Learning]《Spring源码深度解析》 第一至三章

0.What’s this?

这是一篇关于《Spring源码深度解析》的笔记

第一章 基本架构

1.1 Spring的整体架构

Spring的整体是分层架构,内部模块可以被总结分为以下几个部分

1.Core Container

Spring的核心容器,包含以下四个部分:

  1. Core
    包含Spring框架基本的核心工具类,内部又包含:asm(字节码框架,能动态改变jvm里面的字节码)、cglib(代码生成库)、core(核心方法包)、lang(一些注解)、util(辅助工具包)等。
  2. Beans
    包含有关bean的一些工具类,如访问配置文件、创建和管理Bean、进行IoC/DI操作等的类。
  3. Context
    该模块构建于Core和Beans模块的基础之上,提供了类似JNDI注册器的框架式的对象访问方法。继承了Beans的特性,为Spring核心提供了大量的扩展。同时支持如EJB、JMX等的J2EE特性。
  4. Expression Language
    提供了一个表达式语言,用于在运行时查询和操纵对象。

2.Data Access/Integration

  1. JDBC模块:包含Spring对JDBC数据访问进行封装的所有类,简化了JDBC代码的编写。
  2. ORM模块:对象-关系映射API,Spring框架中包含JDO、Hibernate,iBatis等ORM框架,均遵从Spring的通用事务和DAO异常层次结构。
  3. OXM模块:提供一个实现了Objec-XML映射的抽象层,如JAXB,Castor,XMLBeans等。
  4. JMS模块:包含了一些制造和消费消息的特性。
  5. Transaction模块:支持编程和声明性的事务管理。

3.Web

Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供上下文。这部分包含如下集合模块:

  1. Web模块:提供了基础的面向Web的集成特性。
  2. Web-Servlet模块:包含Spring的MVC实现,使模型范围内的代码和web forms分离,并与Spring框架的其他特性集成在一起。
  3. Web-Struts模块:提供了对Struts的支持(在3.0中deprecated)。
  4. Web-Portlet模块:提供了用于Portlet环境和Web-Servlet模块的MVC实现。

4.AOP

AOP-面向切面编程
该模块提供了一个符合AOP标准的面向切面编程的实现。例如可以定义方法拦截器和切点,将业务逻辑和通用逻辑分离,降低耦合性。也可以利用source-level的元数据功能,将各种行为信息合并到代码中。

5.Test

提供基于JUnit和TestNG的Spring组件测试服务。

第二章 容器的基本实现

2.1 容器的基本用法

Spring的核心是Bean,Spring的角色则是这些Bean的容器。

一个简单Bean的定义:

public class SimpleBean{
    private String name = "bean";

    public String getName(){
        return name;
    }

    public void setName(String str){
        name = str;
    }
}

之后再配置文件中,beans标签内,通过创建子标签bean,来绑定一个bean和对应的类

(File name: BeanConfig.xml)
<beans ...>
    <bean id="simpleBean" class="SimpleBean"/>
</beans>

接下来通过BeanFactory就可以通过这个id拿到我们想要的Bean了

    BeanFactory bf = new XmlBeanFactory(new ClassPathResource("BeanConfig.xml"));
    SimpleBean bean = (SimpleBean) bf.getBean("simpleBean");

2.2 功能分析

读取Bean的主要过程如下:

  1. 读取配置文件BeanConfig.xml
  2. 根据id在文件中找到对应的类
  3. 通过反射将其实例化,并返回给调用者

这个过程涉及三个角色:读取和验证配置文件的ConfigReader,根据配置文件中的配置进行反射实例化的ReflectionUtil以及串联两个部分的调用者Application

2.3 工程搭建

……

2.4 Spring的结构组成

2.4.1 beans包的层级结构

……

2.4.2 核心类

  1. DefaultListableBeanFactory
    该类是Spring注册及加载bean的默认实现,上文代码中所用的XmlBeanFactory(spring 3.1后已弃用)继承于这个类,同时又使用了XmlBeanDifinitionReader,实现了自定义的BeanDifinitionReader读取。
  2. XmlBeanDefinitionReader
    这个类的主要职责是从xml文件中读取出Bean的配置,处理步骤主要包括:
    ①通过继承于AbstractBeanDefinitionReader中的方法,使用ResourceLoader将资源文件转换为Resource文件
    ②通过DocumentLoader将Resource文件转换为Document文件
    ③通过接口BeanDefinitionDocumentReader下的DefaultBeanDifinitionDucumentReader方法对Document进行解析,再使用BeanDefinitionParserDelegate对解析出的Element再进行解析,获取最终的Bean配置。

2.5 容器的基础 BeanFactory

BeanFactory获取到bean配置的处理流程:

  1. 首先调用ClassPathResource的构造函数来构造Resource资源文件的实例对象,该对象继承于InputStreamSource,能返回任何InputStream对象。资源文件主要封装了资源的三个状态:存在性,可读性,是否打开,并且提供了不同资源到URL、URI、File类型的转换等。
  2. 获取到Resource资源文件后,将该对象交给XmlBeanDefinitionReader来处理,在XmlBeanFactory构造方法中,调用的了该类的loadBeanDefinitions方法。
  3. XmlBeanDefinitionReader首先对资源文件进行封装,并获取输入流,构造InputSource,再通过InputSource和Resource实例,继续调用函数doLoadBeanDefinitions。
  4. 在doLoadBeanDefinitiond方法中,首先获取对XML文件的验证模式(DTD、XSD等),然后加载XML文件,获得对应的Document,根据Document注册Bean信息。
  5. 注册Bean之前,首先先处理beans标签中的profile属性,即决定环境是生产、开发或调试等环境,该属性也可以不定义。随后通过BeanDefinition,对标签内的内容进行解析。

bean的标签有两种

默认标签:
<bean id="bean" class="Bean">
自定义标签:
<tx:annotation-driven />

对于默认标签,调用parseDefaultElement进行处理

第三章 默认标签解析

默认标签有四种,import, alias, bean, beans,在parseDefaultElement方法中分别调用四种方法对四种标签进行处理。

3.1 bean标签的解析和注册

处理流程:

  1. 通过BeanDefinitionDelegate.parseBeanDefinitionElement方法进行元素解析,获取配置中配置的各种属性,如class、name等。获取到的信息被封装在一个BeanDefinitionHolder对象中。
  2. 通过BeanDefinitionDelegate.decorateBeanDefinitionIfRequired方法获取BeanDefinitionHolder,如果不为空则说明默认标签的子节点下有自定义属性,需要进行解析。如meta,lookup-method等。
  3. 对解析完成的bdHolder进行注册,注册委托给DefinitionReaderUtils的registerBeanDefinition方法。
  4. 发出响应事件,通知相关的监听器。

3.2 Alias标签解析

<alias name="beanName" alias="aliasName" />

通过alias标签指定某个bean的别名,解析的主要工作是将别名与beanName组成一对注册到register中。

3.3 import标签解析

该标签用于在其他模块中引入之前的模块定义过的配置文件,以减少重复的配置工作。
处理流程:

  1. 获取resource属性所表示的路径
  2. 解析路径中的系统属性,如${user.name}
  3. 判定location中的路径,如果是绝对路径则递归调用bean的解析过程,进行另一次解析,否则计算出绝对路径再进行解析
  4. 通知监听器,解析完成

3.4 嵌入式beans标签的解析

功能类似于import标签的功能,处理流程即递归进行bean标签的解析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值