`

spring源码解析(一)

阅读更多
 
 

Spring

读书笔记

 

 


 

Spring整体概述

 

1,Spring设计目标与理念

Spring 它是一个框架,但是其实可以称之为一个轻量级开发平台,目的是简化企业开发。利用IOC和AOP这两大核心搭建起来的平台。如果把Spring这个平台类 比成操作系统的话,Spring Framework(Core) 就是kernel,即为IOC和AOP模块。就像是操作系统通过kernel去管理进程调度,IOC则是管理对象。在这个核心的支持下,我们简化了 JavaEE的开发。
比如建立在这个核心上的一些服务 WEBMVC,JDBC,ORM和远程调用。有了这个核心,在加上Spring的开源,同时依赖开源社区的力量 才使得Spring不断的发展壮大,这样发展了很多子项目和新技术来提供更多的服务。

 

2,Spring整体架构

Spring整体架构图
从图中我们可以看出Spring整体的架构,分层的思想和Spring的主要组件。
每个组件的应用就不具体描述了。想了解某一部分自行百度。

 

Spring核心实现

 

1,IOC概述

控制反转:程序所依赖对象的获取权利被反转了。

说的在普通一点就是:在程序运行中,需要许多对象之间的协作才能完成某个功能,当程序需要另一个对象去完成一个功能的时候,这个这个程序就会依 赖这个对象。在通常情况下,程序所依赖的对象可以通过程序本身创建,但是这样会导致代码的耦合度高,所以我们通过从外部给程序注入依赖对象,而不需要程序 本身去做这件事情。这样就实现了控制反转。
举个例子,当你创建一个 "人" 你需要 眼睛,鼻子,腿,胳膊,手。等等。程序需要自己去管理这些 依赖的对象。但是当使用IOC的方式的时候,程序则无需关注依赖对象。在创建"人" 的时候依赖的对象会已经注入到程序中。 并且当依赖的层级非常深或者复杂的时候,更能体现出IOC的优势。

 

2,IOC的实现

IOC 的实现主要是IOC的容器,IOC容器为开发者管理对象的依赖提供了很多便利和基础的服务。在Spring中提供了很多种IOC容器,例如两个主要的容器 系列,一种是实现了BeanFactory的简单IOC容器,这类容器实现了容器所需要的最基本功能,另一类就是ApplicationContext的 高级容器,在简单容器的基础上增加了许多功能和特性。

 

2.1 SpringIOC容器的设计

首先看如下图所示的IOC容器接口设计图,这张图描述了IOC容器接口的主要设计

Spring容器的接口设计图

一共有两条路径。

  • 第一是 BeanFactory 到 HierarchicalBeanFactory 到ConfigurableBeanFactory 通过这些接口设计的叠加d定义了BeanFactory就是简单IOC容器的基本功能

  • 第二条路径是 ApplicationContext相关路径,主要是从BeanFactory到ListableBeanFactory到Application在到 我们常用的WebApplication或者ConfigurableApplicationContext接口。我们之前也提到过 ApplicationContext是属于高级的容器因为它还继承了 MessageSource ResourceLoader ApplicationEventPublisher 通过这些添加了许多高级特性

上面所描述的都是接口的关系,而具体的IOC的实现都是在这个接口体系下实现的 比如DefaultListableBeanFactory 它就实现了ConfigurableBeanFactory,从而成为一个简单的IOC容器,像其他的容器比如 XmlBeanFactory 都是在DefaultListableBeanFactory的基础上进行扩展的 同样的ApplicationContext的实现也是类似的。

总的来说这个系统是以BeanFactory和ApplicationContext为核心的。BeanFactory是IOC容器的最基本的接口
ApplicationContext继承了BeanFactory接口体系中的 ListableBeanFactory,HierarchicalBeanFactory,AutowireCapableBeanFactory接口 从而具有了BeanFactory的基本功能 同时又继承了MessageSource ResourceLoader ApplicationEventPublisher接口这样就具备了高级功能,从而变身为高级容器。

一,BeanFactory容器的的设计原理
beanFactory 提供了一些检索获取bean的方法,可以很方便的从IOC容器中获取到所需要的Bean,从而忽略具体的IOC实现。从这个角度看,这些方法就是容器的入口。
接口方法如下:

 
  1. public interface BeanFactory {
  2. String FACTORY_BEAN_PREFIX = "&";
  3. Object getBean(String name) throws BeansException;
  4. <T> T getBean(String name, Class<T> requiredType) throws BeansException;
  5. <T> T getBean(Class<T> requiredType) throws BeansException;
  6. Object getBean(String name, Object... args) throws BeansException;
  7. boolean containsBean(String name);
  8. boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
  9. boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
  10. boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
  11. Class<?> getType(String name) throws NoSuchBeanDefinitionException;
  12. String[] getAliases(String name);
  13. }

beanFactory接口提供了IOC容器的规范,在这个基础上Spring提供了一些IOC容器的实现类。接下来我们以XmlbeanFactory为例子,简单说明IOC容器的设计原理。
XmlbeanFactory 的继承结构如下

我 们可以看到这是一层一层扩展下来的。XmlbeanFactory 继承了DefaultListableFactory,这是一个非常重要的类,使我们经常用到的一个IOC实现。比如在设计Application的时候 就会用到它。在Spring中DefaultListableFactory是作为一个默认功能完整的IOC容器。XmlbeanFactory再继承了 DefaultListableFactory的基础上又扩展了自己的功能。从名字上就可以看出来是xml相关功能,实际上就是可以读取xml文件的信息 来定义BeanDefinition。
XmlbeanFactory会初始化一个XmlBeanDifinitionReader,有了这个对象那么就可以处理以XML形式的的BeanDefinition。现在有了处理信息的对象,接下来我们就需要知道BeanDefinition信息的来源。
像如下这样构造resource 然后传递给 XmlBeanFactory

 
  1. ClassPathResource resource = new ClassPathResource("beans.xml");
  2. XmlBeanFactory factory = new XmlBeanFactory(resource);

这样IOC容器就可以方便的定位到BeanDefinition的信息然后进行IOC容器的初始化和依赖注入。
XmlBeanFactory是在DefaultListableFactory的基础上扩展了XML相关的附加功能接下来看看是如何实现的。

 
  1. public class XmlBeanFactory extends DefaultListableBeanFactory {
  2. private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
  3. public XmlBeanFactory(Resource resource) throws BeansException {
  4. this(resource, null);
  5. }
  6. public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException{
  7. super(parentBeanFactory);
  8. this.reader.loadBeanDefinitions(resource);
  9. }
  10. }

可 以看出来,在构造方法中获取到了Resource对象,然后用XmlBeanDefinitionReader 这个对象进行 loadBeanDefinitions(resource)。loadBeanDefinitions同时也是IOC容器初始化的重要部分。
在上面这个例子中我我们看到XmlBeanFactory是继承自DefaultListableBeanFactory的。 DefaultListableBeanFactory是一个非常重要一个IOC容器的实现,比如ApplicationContext也是在这个类基础 上进行扩展的。通过继承DefaultListableBeanFactory来获得IOC容器的基本功能。
接下来我们通过编程式的方式去使用DefaultListableBeanFactory,这样我们可以更好的理解IOC容器的使用过程,还有一些关键类之间的关系。

 
  1. //创建IOC配置文件的资源,这个抽象资源包含BeanDefinition的定义信息
  2. ClassPathResource resource = new ClassPathResource("beans.xml");
  3. //创建一个BeanFactory 这里使用DefaultListableBeanFactory
  4. DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
  5. //创建一个BeanDefinition的读取器,这里使用XmlBeanDefinitionReader来载入XML形式的BeanDefinition通过一个回调配置给BeanFactory
  6. XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
  7. //从定义好的资源位置读取配置信息,具体解析过程由XmlBeanDefinitionReader开完成。完成整个载入和注册Bean定义的时候,需要的IOC容器就建立起来了。整个时候就可以使用IOC容器了。
  8. reader.loadBeanDefinitions(this);

二 ApplicationContext容器的设计原理
ApplicationContex具备了容器的基本功能的基础上,还进行了一定的扩展。添加了一些BeanFactory 不具备的功能,如下图接口。

  • 支持不同的信息源 MessageSource 接口
  • 访问资源 ResourceLoader 接口
  • 支持应用事件 ApplicationEventPubliclisher 接口
  • 提供其他的附加服务

接下来 我们用FileSystemXmlApplicationContext的实现做为例子来讲述ApplicationContext容器的设计原理
ApplicationContext的基本功能已经被FileSystemXmlApplicationContext的基类AbstractXmlApplicationContext实现了,所以接下来只需要关注这个类的自身设计的量个功能。

  1. 实例化此容器IOC容器的启动IOC容器的refresh过程。

    1. public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException {
    2. super(parent);
    3. setConfigLocations(configLocations);
    4. if (refresh) {
    5. refresh();
    6. }
    7. }

    refresh() 过程会有IOC容器启动过程中的一系列的复杂操作,以后会分析。现在只是对基类的一个调用。

  2. 自身设计的功能,从这个类的名字就可以看出来,是要从系统中加载xml定义的bean信息。

    1. protected Resource getResourceByPath(String path) {
    2. if (path != null && path.startsWith("/")) {
    3. path = path.substring(1);
    4. }
    5. return new FileSystemResource(path);
    6. }

    不同的上下文有不同的获取beanDefinition定义信息的方式。调用这个方法就可以获取到FileSystemResource资源的定位。

 

2.2 IOC容器的初始化过程

之前所提及的refresh()过程就标志着IOC容器的初始化开始启动。
IOC容器的初始化主要分为三个步骤,resource资源的定位,载入,注册。

  1. BeanDefinition的Resource资源的的定位
  2. BeanDefinition的载入和解析
  3. BeanDefinition在IOC容器中的
分享到:
评论

相关推荐

    Spring源码解析.zip

    总的来说,"Spring源码解析"这个压缩包为我们提供了一个系统性学习Spring源码的途径。通过深入学习和理解Spring的IoC、AOP以及事务管理的源码,我们可以提升对Spring框架的掌握程度,进而提高我们的开发能力和问题...

    Spring源码解析.pdf

    ### Spring源码解析知识点 #### 一、Spring IoC 容器详解 ##### 1. BeanFactory —— 最基础的IoC容器 - **概念**:`BeanFactory` 是Spring框架中最基本的IoC容器,它负责管理Bean的生命周期,包括创建、配置和...

    Spring源码深度解析第二版

    Spring源码深度解析第二版 Spring是一款广泛应用于Java企业级应用程序的开源框架,旨在简化Java应用程序的开发和部署。Spring框架的核心主要包括了IoC容器、AOP、MVC框架等模块。 第1章 Spring整体架构和环境搭建 ...

    spring源码解析

    在"spring源码解析"的资料中,我们可能会深入探讨以下几个关键知识点: 1. **IoC(Inversion of Control,控制反转)与DI(Dependency Injection,依赖注入)**:这是Spring的核心特性,它通过反转对象的创建和管理...

    spring源码解析和mybatis学习

    本文将深入探讨这两个技术,并基于提供的资源——"Spring源码深度解析.pdf"和"MyBatis3用户指南中文版.pdf",对它们进行详细的知识点解析。 首先,让我们来了解Spring框架。Spring是一个开源的Java平台,它简化了...

    Spring源码分析.pdf

    Spring 源码分析 Spring 框架是 Java 语言中最流行的开源框架之一,它提供了一个强大且灵活的基础设施来构建企业级应用程序。在 Spring 框架中,IOC 容器扮演着核心角色,本文将深入分析 Spring 源码,了解 IOC ...

    Spring源码解析

    《Spring源码深度解析》 在Java开发领域,Spring框架无疑是最重要的组件之一,它以其强大的功能和灵活性赢得了广大开发者的心。深入理解Spring源码对于提升开发能力、优化系统设计以及解决实际问题至关重要。本文将...

    spring源码解析图.jpg

    spring ioc 源码解析图,全网最细、最全的源码解析讲解,关于spring bean创建过程原理解析、循环依赖原理解析等等等

    Spring核心源码解析.pdf

    本篇文档将对Spring框架的核心源码进行解析,以帮助开发者更深入地理解Spring的工作原理和核心概念。 首先,Spring框架通过使用IoC容器来管理应用对象的创建和依赖关系。这种做法可以让程序员从创建对象的复杂性中...

    spring源码解析思维导图

    XmlBeanFactory继承自DefaultListableBeanFactory,而DefaultListableBeanFactory是整个bean加载的核心部分,是Spring注册及加载bean的默认实现,XmlBeanFactory与DefaultListableBeanFactory不同的地方其实是在...

    Spring源码解析手册

    《Spring源码解析手册》是2023年针对Java开发者深入理解Spring框架的重要参考资料,旨在用通俗易懂的方式解析Spring的核心源码,帮助开发者掌握Spring的内部工作原理。本手册将通过实例、代码调试和GitHub资源来详细...

    spring 源码中文注释

    在源码分析的过程中,读者会深入理解Spring的内部工作机制,例如如何解析配置、如何创建bean实例、如何实现AOP代理等。这将有助于开发者编写更高效、更健壮的代码,也能为参与Spring的扩展或定制打下坚实基础。 总...

    Spring源码解析4章150页+Spring3.2.4中文注释源码

    4、Spring源码下载 二阶段 1、什么是IOC/DI 2、SpringIOC体系结构 3、源码分析-IOC容器的初始化 4、源码分析-IOC容器的依赖注入 5、源码分析-IOC容器的高级特性 三阶段 Spring AOP的涉及原理及具体实践 SpringJDBC...

    Java Spring 源码解析 Xmind 思维导图

    在Spring源码解析中,时序图用于描绘不同组件之间的调用关系,如AOP代理的生成过程、事件发布机制、数据访问层(DAO)与业务逻辑层(Service)的交互等。这有助于开发者理解Spring如何处理复杂的应用场景。 再者,...

    spring源码解析.xmind

    spring源码解析的,里面介绍了springIoc,springAop,用xmind来整理的,内容清晰,不一定完全正确,仅供参考,如有问题,希望大家私我,我修改,这个免费给大家修改了

    Spring源码解析(高清版)

    《Spring源码解析》是一本深入探讨Spring框架核心机制的高清版资料,旨在帮助开发者从源码层面理解Spring的工作原理,提升对框架的掌控能力。Spring作为Java领域广泛应用的轻量级框架,其源码解析对于Java开发人员...

    Spring5 源码分析(第 2 版)-某Tom老师

    《Spring5 源码分析(第 2 版)》是某Tom老师精心编写的深度解析文档,旨在帮助读者全面理解Spring5的核心机制和设计理念。Spring作为Java领域最为广泛应用的框架之一,其源码的深入理解对于开发者来说至关重要。这篇...

    spring事务源码解析

    spring事务源码解析

Global site tag (gtag.js) - Google Analytics