概述

Spring是为了解决企业应用程序开发复杂性而创建的开源框架,书店上关于Spring的书籍汗牛充栋,网上相关的文章连篇累牍,其中有很多写的很不错的,有入门例子的,有问题解决方案的,有环境设置的,有源代码分析的,有spring与其他开源系统集成的,不一而足。本文通过生活白话,不拘泥于Spring源代码和专业术语的束缚,不拘泥于具体的实现细节,类比介绍Spring容器的宏观的设计理念。

Spring容器解说

Spring容器提供 Spring 框架的基本功能,是工厂模式的实现。换句话说,Spring就是Bean的工厂,管理Bean的生命周期。那如何来设计呢?Spring源代码虽不说是浩如烟海,也让人头晕目眩,如下图所示,我们让Spring容器走下神坛,既然是面向接口编程,用接口来描述框架,不必拘泥于具体实现可能更清晰些。

任何的设计都是这样,有原料,有入口,有加工,也有出口。既然Spring是Bean的容器,是Bean的工厂,那么生产Bean流程是:

1)        原料:bean的配置文件

2)        进料:通过ResourceLoader把xml文本文件读入

3)        初加工:通过BeanDefinitionReader把原料加工成半成品BeanDefinition

4)        精加工:Bean的生产车间BeanFactory把半成品BeanDefinition加工成Bean

5)        入库:成品库SingletonRegistry保存成品Bean,及Bean的标签(beanId),呵呵!你也知道这就是Map的工作了

IOC是Sprng 核心?关键?

Spring容器使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开,控制反转(IOC)模式是基于java反射的基本原理。

通常的软件设计,肯定把IOC作为容器的核心,其他外围的功能如bean 的Scope都是基于IOC展开,而Spring设计却只把它放如工具类BeanUtil,这正是Spring的高明之处,虽然IOC是Spring的创建bean的基础,但创建一个bean需要判断是否静态工厂创建,是否有含参数的构造方法,而这些参数也可能是其他对象的实例,创建bean的初始化方法等等,这些不仅仅是bean的IOC所能涵盖的,并且在创建一个bean的过程中可能需要多次迭代调用IOC程序。

综上所述,IOC虽然是Spring的创建Bean的基本原理,但仅是及其重要的一部分,并不是Spring容器的核心,是Spring创建bean的比不可少的工具。IOC是Spring容器的关键,而不是核心。

Interface分级设计

接口的分级设计,是针对不同的客户给予不同级别的产品。不同等级的接口关注点也各有不同,就像产品也分为多个级别,如高级产品、中级产品、初级产品分别对应于不同的客户群,或者如同银行的客户渠道有银行卡,柜台,网银,手机终端,ATM机等等。同样接口也分为内部接口和外部接口,就如同有些接口可能永远不被外部用户所知,仅仅是内部使用,就像工厂内部多个车间之间的内部产品。

org.springframework.beans.factory. BeanFactory是Spring的顶级Interface,其中只有getBean系列,containsBean,isPrototype,isSingleton,getType等成品Bean的基本方法。

org.springframework.beans.factory. ListableBeanFactory是Factory的管理方法如containsBeanDefinition,getBeanDefinitionCount,getBeanDefinitionNames,getBeanNamesForType系列,getBeansOfType系列,ListableBeanFactory是针对BeanDefinition半成品的。

而ApplicationContext接口除了集成ListableBeanFactory接口外,还继承了ResourcePatternResolver,HierarchicalBeanFactory,ApplicationEventPublisher,MessageSource的功能,如在资源处理(国际化处理),事件传递,及各应用层之间的context实现。同样是对外的接口,Spring更建议采用ApplicationContext的原因也就在这儿,ApplicationContext更像是针对VIP客户的产品。

Interface扩展设计

Spring设计是开放性的设计思路,是值得我们做架构设计人员学习的,如下图所示:

com.springframework.beans.factory

(淡黄色背景)

|BeanFactory

|ListableBeanFactory

|ConfigrableListableBeanFactory

|DefaultListableBeanFactory

com.springframework.context

(棕红色背景)

ApplicationContext

ConfigrableApplicationContext

org.springframework.context

(黄色背景)

.support

AbstractApplicationContext

AbstractRefreshableApplicationContext

AbstractXmlApplicationContext

ClassPathXmlApplicationContext

org.springframework.web.context

(绿色背景)

WebApplicationContext

ConfigrableWebApplicationContext

org.springframework.web.context

(浅蓝色背景)

.support

AbstractRefreshableWebApplicationContext

XmlWebApplicationContext

总结如下:

1)  不同的包下面放不同的东西,好像是废话啊!上层包放接口,下层包放实现的抽象类及实体类。如contex.support包下面放实现context包下面的接口的抽象类及实现类。

2)  为了适应WEB级别的ApplicationContext,创建了WebApplicationContext的接口,该接口继承了ApplicationContext,又添加了WEB层的个性化方法如getServletContext及属性。现在终于明白了在接口间的“extends”的含义,绝对是对上层接口的“扩展“,扩展的目的是适应更具体化的环境。就如同因为国家大,情况复杂,中央的政策相对都是比较抽象的,而地方政策必须结合地方的特色,既要满足中央政策的要求,即实现中央政策的接口,又要根据本地特殊情况,扩展个性化的政策,即地方政策接口,从而更具有可操作性。

3) 在org.springframework.web.context.support.AbstractRefreshableWebAppplicationContext类是既实现了ConfigrableWebApplicationContext接口,即实现WEB的个性化特色,又继承了org.springframework.context.support.AbstractRefreshableApplicationContext类。借助了已有的类,实现了架构上的复用,这就像制定政策既要满足地方上的特色,又可以参照其他地区现成的政策经验。呵呵!在实际工作中,也会常常有这样的设计。

理解Spring 容器设计理念相关推荐

  1. Spring Boot教程(7) – 直观地理解Spring容器

    在你学习Spring之前,你肯定听说过"控制反转"."依赖注入"."上下文"等名词,伴随着这些名词的,是一些冗长晦涩的解释,这些解释并没有什 ...

  2. 彻底理解 Spring 容器和应用上下文

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:收藏了!7 个开源的 Spring Boot 前后端分离优质项目个人原创+1博客:点击前往,查看更多 作者:陈本 ...

  3. spring 上下文_一次性教你彻底理解 Spring容器和应用上下文!

    作者:陈本布衣 www.cnblogs.com/chenbenbuyi 有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生命周期.业务代码只需要按照业务本身的流程,走啊走 ...

  4. Spring深入理解-Spring框架设计理念

    导语   Spring框架作为企业中最常用的框架,是为了降低企业级开发的复杂性,现在经过发展它可以做的事情也是越来越多了.但是尽管Spring家族的东西已经越来越多,越来越健全,但是它的核心理念是不变 ...

  5. Spring容器与上下文理解

    2019独角兽企业重金招聘Python工程师标准>>> 转自:https://www.cnblogs.com/chenbenbuyi/p/8166304.html 个人感觉介绍的很不 ...

  6. Spring基础篇——Spring容器和应用上下文理解

    转载自 https://www.cnblogs.com/chenbenbuyi/p/8166304.html 上文说到,有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生 ...

  7. 用项目案例彻底理解Spring IOC容器

    本篇介绍Spring IOC容器,通过具体的实例详细地讲解IOC概念,彻底理解Spring反转控制的思想.通过本篇的学习,可以达成如下目标. ● 运用工厂模式设计程序 ● 理解JavaBean和POJ ...

  8. boot spring 没有父子容器_理解 MyBatis 是如何在 Spring 容器中初始化的

    MyBatis 初始化过程就是 生成一些必须的对象放到 Spring 容器中 .问题是这个过程到底生成了哪些对象?当遇到 MyBatis 初始化失败时,如何正确的找到分析问题的切入点?本文将针对这些问 ...

  9. Spring容器和Spring应用上下文的理解

    1. 什么是Spring容器?作用是什么? 1.1 什么是Spring容器? Spring容器称为IOC容器,即:控制反转 应用程序里不用再过问对象的创建和管理对象之间的依赖关系了,都让IOC容器给代 ...

  10. 深入理解Spring的容器内事件发布监听机制

    前言 Spring 提供了 ApplicationContext 事件机制,可以发布和监听事件,这个特性非常有用. Spring 内置了一些事件和监听器,例如在 Spring 容器启动前,Spring ...

最新文章

  1. NGUI从入门到实战第1章开启NGUI学习之旅
  2. Java: System.exit() 与安全策略
  3. cvpr2018论文阅读
  4. executor线程池框架_如何使用Java 5 Executor框架创建线程池
  5. 中英对照 关于计算机的科技英语,《计算机专业英语》(中英文对照).pdf
  6. 从入门到入土:基于C语言采用SOCKET套接字实现TCP公开扫描程序Web服务器扫描程序|代码展示
  7. [转贴]一个农村高考落榜生的心路历程
  8. IoC、DI、AOP
  9. Android防止内存泄漏的八种方法(下)
  10. python爬取喜马拉雅vip音频安卓_Python爬虫:爬取喜马拉雅音频数据详解
  11. DDS通信协议与安全实践
  12. 网管员应该掌握好的学习方法
  13. Win10环境下VS2003安装教程
  14. Excel如何一次性显示所有隐藏工作表
  15. 帧率、分辨率、码流的概念
  16. 思维导图(自我介绍)
  17. Skin Cancer MNIST(皮肤癌患者相关数据集)
  18. 怎么打开微信支付管理中关闭的服务器,手机微信中如何关闭已经开启的自动续费服务...
  19. Vinted运营干货分享:Vinted国内使用详细步骤参考
  20. 反射望远镜的发展历程(3)

热门文章

  1. 为什么程序员喜欢养猫?
  2. 拿什么拯救你的硬盘?十大绝招帮你忙
  3. 首发速看:智微JMS901双接口U盘成功量产,附量产工具软件+固件+教程分享
  4. 垃圾场恶臭环境监测系统方案
  5. 按计算机应用领域分类,按计算机用途分类
  6. Paypal 与Moneybookers
  7. vant area地区选择组件使用方法
  8. Mysql优化之explain你真的会吗?
  9. TeamTalk IM_PDUBASE详解
  10. 二分以及编程过程中求中点各种写法思想解析以及完美写法