Spring深入理解

本文写作思想来源于其他博客,在这里附上大神的连接:spring深入理解

1.什么是Spring?用一句话概括。

     spring是一个为了解决企业应用程序开发的,一个开源框架。内部采用了IOC容器来管理Bean之间的关系以及Bean的生命周期,采用AOP的编程思想,实现了分层架构,可以与其他很多优秀的框架集成。

2.spring的架构图(拿一张度娘的图)

我们可以看到,spring总共有几十个组件,但核心组件有三个:Core、Context和Beans。下面根据核心组件来依次说明。

3.spring的设计理念

  在三个核心组件中,又有一个核心组件,就是Beans。其实,spring就是面向Bean的编程,Bean才是Spring中的主角。

  Bean 在 Spring 中作用就像 Object 对 OOP 的意义一样,Spring 中没有 Bean 也就没有 Spring 存在的意义。Spring 提供了 IoC容器通过配置文件或者注解的方式来管理对象之间的依赖关系。 

   Spring 设计的核心 org.springframework.beans 包(架构核心是org.springframework.core包),它的设计目标是与 JavaBean 组件一起使用。这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。下一个最高级抽象是 BeanFactory 接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。

   bean工厂的概念:Spring作为IOC容器的基础。IOC则将处理事情的责任从应用程序代码转移到框架。

   Spring的依赖注入机制:可以让你把对象之间的依赖关系转而用配置文件来管理。那IOC容器就是被Bean包裹的对象。

4.核心组件的协同工作

   引用博客中的一个案例,把 Bean 比作一场演出中的演员的话,那 Context 就是这场演出的舞台背景,而 Core 应该就是演出的道具了。只有他们在一起才能具备演出一场好戏的最基本条件。

   我们知道 Bean 包装的是 Object,而 Object 必然有数据,如何给这些数据提供生存环境就是 Context 要解决的问题,对 Context 来说他就是要发现每个 Bean 之间的关系,为它们建立这种关系并且要维护好这种关系。所以 Context 就是一个 Bean 关系的集合,这个关系集合又叫 Ioc 容器,一旦建立起这个 Ioc 容器后 Spring 就可以为你工作了。那 Core 组件又有什么用武之地呢?其实 Core 就是发现、建立和维护每个 Bean 之间的关系所需要的一些列的工具,从这个角度看来,Core 这个组件叫 Util 更能让你理解。(总结一句话:Bean是一个核心,Context就是维护核心与核心之间的关系,Core就是为维护关系提供一些工具,来更好的维护这层关系)。

5.核心组件详解

  1.bean组件

   Bean组件在Spring的org.springframework.beans包下。这个包下的所有类主要解决三件事:Bean的定义、Bean的创建以及对Bean的解析。对使用者来说,只需要关心Bean的创建,其他两个由Spring内部完成。

   Spring Bean的创建使用的是典型的工厂模式,它的顶级接口是BeanFactory。

  2.Context组件

   Context在spring的org.springframework.context包下,context组件主要是给spring提供一个运行时的环境,用来确保各个对象的状态。

    ApplicationContext是Context的顶级父类,他除了能标识一个应用环境的基本信息外,还继承了五个接口,这5个接口主要是为了扩展Context的功能。

    

从图中我们看到,ApplicationContext继承了BeanFactory,这也说明了Spring容器中运行的主体对象是Bean,另外 ApplicationContext 继承了 ResourceLoader 接口,使得 ApplicationContext 可以访问到任何外部资源。

ApplicationContext 的子类主要包含两个方面:

  1. ConfigurableApplicationContext 表示该 Context 是可修改的,也就是在构建 Context 中用户可以动态添加或修改已有的配置信息,它下面又有多个子类,其中最经常使用的是可更新的 Context,即 AbstractRefreshableApplicationContext 类。
  2. WebApplicationContext 顾名思义,就是为 web 准备的 Context 他可以直接访问到 ServletContext,通常情况下,这个接口使用的少。

再往下分就是按照构建 Context 的文件类型,接着就是访问 Context 的方式。这样一级一级构成了完整的 Context 等级层次。

总体来说 ApplicationContext 必须要完成以下几件事:

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

Context 作为 Spring 的 Ioc 容器,基本上整合了 Spring 的大部分功能,或者说是大部分功能的基础。

3.Core组件

  我们在使用过程中,其实大多数时候都是直接使用,并没有关注是如何来的,为什么要这样使用。就例如Mybatis的执行流程中,其实就是和Core组件息息相关的。

   core组件作为Spring的核心组件,他包含了很多的关键类其中一个重要组成部分就是定义了资源的访问方式。这种把所有资源都抽象成为一个接口的方式值得以后在设计中拿来学习。

   

    从上图可以看出 Resource 接口封装了各种可能的资源类型,也就是对使用者来说屏蔽了文件类型的不同。对资源的提供者来说,如何把资源包装起来交给其他人用这也是一个问题,我们看到 Resource 接口继承了 InputStreamSource 接口,这个接口中有个 getInputStream 方法,返回的是 InputStream 类。这样所有的资源都被可以通过 InputStream 这个类来获取,所以也屏蔽了资源的提供者。另外还有一个问题就是加载资源的问题,也就是资源的加载者要统一,从上图中可以看出这个任务是由 ResourceLoader 接口完成,他屏蔽了所有的资源加载者的差异,只需要实现这个接口就可以加载所有的资源(这段话写的太好了)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值