理解Spring 容器设计理念
概述
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 容器设计理念相关推荐
- Spring Boot教程(7) – 直观地理解Spring容器
在你学习Spring之前,你肯定听说过"控制反转"."依赖注入"."上下文"等名词,伴随着这些名词的,是一些冗长晦涩的解释,这些解释并没有什 ...
- 彻底理解 Spring 容器和应用上下文
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:收藏了!7 个开源的 Spring Boot 前后端分离优质项目个人原创+1博客:点击前往,查看更多 作者:陈本 ...
- spring 上下文_一次性教你彻底理解 Spring容器和应用上下文!
作者:陈本布衣 www.cnblogs.com/chenbenbuyi 有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生命周期.业务代码只需要按照业务本身的流程,走啊走 ...
- Spring深入理解-Spring框架设计理念
导语 Spring框架作为企业中最常用的框架,是为了降低企业级开发的复杂性,现在经过发展它可以做的事情也是越来越多了.但是尽管Spring家族的东西已经越来越多,越来越健全,但是它的核心理念是不变 ...
- Spring容器与上下文理解
2019独角兽企业重金招聘Python工程师标准>>> 转自:https://www.cnblogs.com/chenbenbuyi/p/8166304.html 个人感觉介绍的很不 ...
- Spring基础篇——Spring容器和应用上下文理解
转载自 https://www.cnblogs.com/chenbenbuyi/p/8166304.html 上文说到,有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生 ...
- 用项目案例彻底理解Spring IOC容器
本篇介绍Spring IOC容器,通过具体的实例详细地讲解IOC概念,彻底理解Spring反转控制的思想.通过本篇的学习,可以达成如下目标. ● 运用工厂模式设计程序 ● 理解JavaBean和POJ ...
- boot spring 没有父子容器_理解 MyBatis 是如何在 Spring 容器中初始化的
MyBatis 初始化过程就是 生成一些必须的对象放到 Spring 容器中 .问题是这个过程到底生成了哪些对象?当遇到 MyBatis 初始化失败时,如何正确的找到分析问题的切入点?本文将针对这些问 ...
- Spring容器和Spring应用上下文的理解
1. 什么是Spring容器?作用是什么? 1.1 什么是Spring容器? Spring容器称为IOC容器,即:控制反转 应用程序里不用再过问对象的创建和管理对象之间的依赖关系了,都让IOC容器给代 ...
- 深入理解Spring的容器内事件发布监听机制
前言 Spring 提供了 ApplicationContext 事件机制,可以发布和监听事件,这个特性非常有用. Spring 内置了一些事件和监听器,例如在 Spring 容器启动前,Spring ...
最新文章
- NGUI从入门到实战第1章开启NGUI学习之旅
- Java: System.exit() 与安全策略
- cvpr2018论文阅读
- executor线程池框架_如何使用Java 5 Executor框架创建线程池
- 中英对照 关于计算机的科技英语,《计算机专业英语》(中英文对照).pdf
- 从入门到入土:基于C语言采用SOCKET套接字实现TCP公开扫描程序Web服务器扫描程序|代码展示
- [转贴]一个农村高考落榜生的心路历程
- IoC、DI、AOP
- Android防止内存泄漏的八种方法(下)
- python爬取喜马拉雅vip音频安卓_Python爬虫:爬取喜马拉雅音频数据详解
- DDS通信协议与安全实践
- 网管员应该掌握好的学习方法
- Win10环境下VS2003安装教程
- Excel如何一次性显示所有隐藏工作表
- 帧率、分辨率、码流的概念
- 思维导图(自我介绍)
- Skin Cancer MNIST(皮肤癌患者相关数据集)
- 怎么打开微信支付管理中关闭的服务器,手机微信中如何关闭已经开启的自动续费服务...
- Vinted运营干货分享:Vinted国内使用详细步骤参考
- 反射望远镜的发展历程(3)