简介

Spring框架如今已成为服务端开发框架中的主流框架之一,是web开发者的利器。然而,真正让人着迷的,还是与其实现相关的 原理,设计模式以及许多工程化的思想。本文主要探讨Spring的三大核心组件

Spring的核心组件有很多,但真正构成其骨骼的,是Core,Context和Bean

Bean

三者之中,Bean是核心中的核心。Bean实现了将对象通过配置文件的方式,由Spring来管理对象存储空间,生命周期的分配。通过依赖注入的方式,可以实现将对象注入到指定的业务逻辑类中。这些注入关系,由Ioc容器来管理。

因此,Spring的核心思想常常被称作BOP(Bean Oriented Programming),面向Bean编程。

Bean组件定义在Spring的org.springframework.beans包下,解决了以下几个问题:

  1. Bean的定义
  2. Bean的创建
  3. Bean的解析

使用者只需要关注Bean的创建,其他两个过程由Spring内部完成。

1.整体架构

Spring Bean的整体架构是典型的工厂模式,最上层的接口是BeanFactory。ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBean是其子类,目的是为了区分Spring内部对象处理和转化的数据限制

  • ListableBeanFactory: 表示这些Bean是可列表的
  • HierarchicalBeanFactory: 表示这些Bean有继承关系
  • AutowireCapableBeanFactory: 定义Bean的自动装配规则

这几个接口分别定义了Bean的集合、Bean的关系和Bean的行为。

2.Bean定义

Bean的定义主要由BeanDefinition描述,层次关系如下:

Spring的配置文件中定义的节点,成功解析后都会被转化为BeanDefinition对象,之后所有的操作都会在BeanDefinition对象之上进行。

3.Bean解析

Bean解析的主要任务是:对Spring的配置文件进行解析,最后生成BeanDefinition对象。
解析过程非常复杂,包括配置文件里所有的tag。主要参与的类如下:

Context

Bean包装的是一个个Object,Object中存储着业务所需的数据。所以,如何给这些数据及之间的关系提供生存、运行环境(即保存对象的状态),就是Context要解决的问题。Context实际上就是Bean关系的集合,又称之为Ioc容器

ApplicationContext是Context最上层的接口,层次关系如下:

ApplicationContext能够标识一个应用环境的基本信息。其上继承了5个接口,用于拓展Context的功能,其中BeanFactory用于创建Bean,同时继承了ResourceLoader接口,用于访问任何外部资源。

ApplicationContext的子类,主要包括:

  1. ConfigurableApplicationContext: 用户可动态配置修改信息的Context,其下AbstractRefreshableApplicationContext最为常用。
  2. WebApplicationContext:
    为Web应用准备的Context,可以直接访问ServletContext。

总之,ApplicationContext必须完成的功能如下:

  • 标识一个应用环境
  • 利用BeanFactory创建Bean对象
  • 保存对象关系表
  • 捕获各种事件

作为Ioc容器,Context是Spring其他大部分功能的基础

Core

Spring 发现、建立和维护Bean之间关系的一揽子工具,称之为Core。实际上就是所需的Util。

Core的重要组成部分之一是Resource

1. Resource整体层次

Resource主要定义了资源的访问方式,所有资源都抽象到了Resource接口中,层次关系如下:

  • 资源包装。Resource向上继承了InputStreamSource接口,所有的资源都通过InputStream来获取,从而屏蔽了资源提供者。
  • 资源加载。Resource下的ResourceLoader接口,所有资源加载者统一实现该接口就能加载所有的资源,例如之前的ApplicationContext。

2. 与Context建立关系

如图,ApplicationContext通过ResourcePatternResolver接口与ResourceLoader进行交互,来进行资源的加载、解析和描述。ResourcePatternResolver将资源封装整合,便于其他组件使用。

总结


本文主要总结了构成Spring骨骼框架的三大核心组件及其之间的联系,以及对三者实现原理理解的一些心得体会。


作者: I'm coding

链接ACFLOOD

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

如果您觉得本文对您有所帮助,就给俺点个赞吧!

参考书籍:《深入分析Java Web技术内幕》(许令波)

图片来源:《深入分析Java Web技术内幕》(许令波)

Spring核心组件剖析的更多相关文章

  1. Spring 核心组件总结

    spring核心组件总结 spring介绍 spring概念 IOC: Inverse Of Control 控制反转 ​ 将我们创建对象的方式反转了,以前创建对象是由我们开发人员自己维护,包括依赖注 ...

  2. Spring 核心组件工作原理简析

    Spring Framework 的核心组件有三个: Spring Core,Spring Context 和 Spring Beans,它们奠定了 Spring 的基础并撑起了 Spring 的框架 ...

  3. spring核心组件

    spring的对象是bean组件,就像面向对象的object,bean包装的是object.context的作用,发现每个bean之间的关系,为他们之间建立好这种关系并进行维护.所以,可以把conte ...

  4. Spring核心组件知识梳理

    Spring的一些概念和思想 Spring的核心:AOP.IOC. 简单点说,就是把对象交给Spring进行管理,通过面向切面编程来实现一些"模板式"的操作,使得程序员解放出来,可 ...

  5. Spring IOC 剖析

    模拟实现 Spring Ioc 控制反转功能 使用 => 原理 => 源码 => 模拟实现 使用:了解 原理:熟悉 源码 And 模拟实现: 精通 对照 Spring 功能点 Spr ...

  6. 转 Spring源码剖析——核心IOC容器原理

    Spring源码剖析——核心IOC容器原理 2016年08月05日 15:06:16 阅读数:8312 标签: spring源码ioc编程bean 更多 个人分类: Java https://blog ...

  7. spring的核心组件及作用(一)

    Spring的核心组件有: Context     Core     Bean. 如果要在这三个核心组件上挑出一个最核心的组件,那就是Bean组件了. Spring的特性功能有:WEB ORM AOP ...

  8. Jquery UI 组合树 - ComboTree 集成Wabacus4.1 代码剖析

    Jquery UI 1.3 (组合树 - ComboTree ) 集成Wabacus4.1 集成Spring 代码剖析 使用时,请下载需要Jquery ui包进行配置 combotree.js 的代码 ...

  9. Spring初学

    一.spring体系结构spring核心组件 1.Beans(包装应用程序自定义对象Object,Object中存有数据) 2.Core (资源加载,资源抽象,建立维护与bean之间的一些关系所需的一 ...

随机推荐

  1. Docker网络解决方案 - Flannel部署记录

    Docker跨主机容器间网络通信实现的工具有Pipework.Flannel.Weave.Open vSwitch(虚拟交换机).Calico, 其中Pipework.Weave.Flannel,三者 ...

  2. 第三个Sprint ------第六天

    分数计算界面代码 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:a ...

  3. 09-java学习-数组-冒泡排序-选择排序-数组工具类编写-查找-扩容

    数组的排序算法 查找算法 数组协助类Arrays的学习和使用 数组的扩容

  4. iOS GCD中级篇 - dispatch_semaphore(信号量)的理解及使用

    理解这个概念之前,先抛出一个问题 问题描述: 假设现在系统有两个空闲资源可以被利用,但同一时间却有三个线程要进行访问,这种情况下,该如何处理呢? 或者 我们要下载很多图片,并发异步进行,每个下载都会开 ...

  5. ThreadPoolExecutor源码解读

    1. 背景与简介 在Java中异步任务的处理,我们通常会使用Executor框架,而ThreadPoolExecutor是JUC为我们提供的线程池实现. 线程池的优点在于规避线程的频繁创建,对线程资源 ...

  6. PGSQL 获取数据库大小以及表达小等的SQL

    SELECT d.datname AS Name, pg_catalog.pg_get_userbyid(d.datdba) AS Owner, CASE WHEN pg_catalog.has_da ...

  7. caffe配置NCCL

    设置Makefile.config 打开开关: USE_NCCL := 1, 并添加nccl库路径 USE_NCCL := 1 INCLUDE_DIRS += /path/nccl/build/inc ...

  8. c++ 为自定义类添加stl遍历器风格的遍历方式

    为仿照stl的遍历风格,实现对自定义类型的遍历. 1. 需要遍历的基础结构: struct ConnectionPtr { int id_; int port_; string addr_; //st ...

  9. Swagger2 配置

    1. 每个请求都需要换取key: @Bean public Docket createRestApi() { //添加head参数start ParameterBuilder appId = new ...

  10. Java_常用工具类收集

    一.日期工具类 package com.ebd.application.common.utils; import java.sql.Timestamp; import java.text.DateFo ...