浅谈对Spring Framework的认识
Spring Framework,作为一个应用框架,官方的介绍如下:
The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform. A key element of Spring is infrastructural support at the application level: Spring focuses on the "plumbing" of enterprise applications so that teams can focus on application-level business logic, without unnecessary ties to specific deployment environments.
在开发中,Spring框架从程序员手中接管了对象的创建,Spring根据配置文件或者扫描注解,得到类、组件之间的关系,并创建对象进行注入,这个过程不需要程序员手动创建并赋值,从而降低了耦合性,开发的时候也不需要理会这些与功能代码实现无关的部分,这就是DI/IOC(依赖注入/控制反转)。基于DI/IOC,Spring框架的不同模块提供了各种功能,为应用提供了AOP功能、持久层的支持,为Web层提供了SpringMVC以及与其他框架的整合使用等等。(这特么不是上面的翻译啊啊啊)
这段时间正在学习Spring源码,浅谈一下我对Spring的认识。参考资料主要为Spring官方文档、《深入分析Java Web技术内幕》《Spring源码深度解析》,部分内容借鉴书中原文。
Spring中的主要组件如图:

Spring中的核心容器中有四个部分,核心组件是其中的Beans、Core和Context组件,至于SpEL不太了解o(* ̄▽ ̄*)o 。如果没有Core Container核心容器的支持,就不会有上层的AOP、Web等特性功能。
三个组件中,Beans组件可以说是比较核心的,Spring框架将对象之间的依赖关系转用配置文件、注解来配置,注入关系通过IOC容器来管理,而IOC容器中管理的实体就是被Bean包裹的对象。Bean就是被包装之后的Java对象,由Spring框架创建和维护。
Context组件是Bean的上下文,是Bean的生存环境,用于建立和维护Bean之间的关系,所以说Context其实是Bean关系的集合,这个关系的集合就叫做IOC容器。
而Core组件,就是发现、建立、维护Bean之间的关系所需要的一系列的工具类(Util)。
一、Beans组件
Beans组件主要解决了Bean的定义、创建和解析,实现在org.springframework.beans包中。
Bean的创建是典型的工厂模式,顶级接口是BeanFactory,简单的继承层次如下:

BeanFactory有三个子类接口,ListableBeanFactory(可列表的)、HierarchicalBeanFactory(可继承的)、AutowireCapableBeanFactory(可自动装备的),三者分别有不同的使用场合,而BeanFactory的默认实现类是DefaultListableBeanFactory,它实现了所有的接口。
Bean的定义主要由BeanDefinition描述。当Spring对配置文件中的Bean进行成功解析或者对注解的Bean解析完成后,其在Spring内部转换成BeanDefinition对象,此后所有的操作都是对这个对象进行的。UML图如下:

Bean的解析比较复杂,主要有对配置文件的解析和对注解的解析,配置文件解析过程主要由以下类完成:

二、Context组件
Context组件提供Spring的一个运行时环境,在org.springframework.context包实现。ApplicationContext是Context的顶级接口,它继承了六个接口,主要是扩展了Context:

可以看出,ApplicationContext继承了BeanFactory,使得其有创建Bean的功能,这也间接说明了Spring容器中运行的实体是Bean。ApplicationContext继承了ResourceLoader接口,意味着ApplicationContext可以访问外部资源。
ApplicationContext两个子类接口分别是ConfigurableApplicationContext和WebApplicationContext,根据字面意思便可理解其用途。
一般来说,ApplicationContext有一下几个作用:
1.标识一个应用环境
2.利用BeanFactory创建Bean对象
3.保存对象关系表
4.能捕获各种事件
Context作为Spring的IOC容器,整合了Spring的大部分功能的基础。
三、Core组件
Core组件提供了很多比较重要的关键类,比如资源的访问。这里暂时不想写了,留坑以后填。
写累了,下篇再接着写IOC容器的工作过程吧,BeanFactory的创建过程、Bean及其关系网的创建、IOC容器的扩展点等等。洗洗睡了_(:зゝ∠)_
浅谈对Spring Framework的认识的更多相关文章
- 浅谈使用spring security中的BCryptPasswordEncoder方法对密码进行加密与密码匹配
浅谈使用springsecurity中的BCryptPasswordEncoder方法对密码进行加密(encode)与密码匹配(matches) spring security中的BCryptPass ...
- 浅谈.NET Micro Framework性能优化 转自 软件中国
.NET Micro Framework的可剪裁性,高定执行,和天生对硬件高集成度都让它的前途一片光明.当然,它现在还很年轻,就发布的SDK v3.0来看,它还有很长的路要走. 废话不说,就这几个月我 ...
- Spring 学习教程(一):浅谈对Spring IOC以及DI的理解
一.个人对IoC(控制反转)和DI(依赖注入)的理解我们平时在开发java web程序的时候,每个对象在需要使用它的合作对象时,自己都要将它要合作对象创建出来(比如 new 对象),这个合作对象是由自 ...
- Spring缓存框架原理浅谈
运维在上线,无聊写博客.最近看了下Spring的缓存框架,这里写一下 1.Spring 缓存框架 原理浅谈 2.Spring 缓存框架 注解使用说明 3.Spring 缓存配置 + Ehcache(默 ...
- 1.1浅谈Spring(一个叫春的框架)
如今各种Spring框架甚嚣尘上,但是终归还是属于spring的东西.所以在这里,个人谈一谈对spring的认识,笔者觉得掌握spring原理以及spring所涉及到的设计模式对我们具有极大的帮助.我 ...
- 浅谈Spring MVC知识
关于MVC框架,我相信大家都不陌生,都会说也就是模型-视图-控制器这三层的框架结构,如果你参加面试的时候考官会问:“MVC框架是什么?你说一说.”其实我们都知道这个问题还需要问的,只要你是一个开发人员 ...
- 浅谈Spring中的Quartz配置
浅谈Spring中的Quartz配置 2009-06-26 14:04 樊凯 博客园 字号:T | T Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在 ...
- 浅谈Spring的两种配置容器
浅谈Spring的两种配置容器 原文:https://www.jb51.net/article/126295.htm 更新时间:2017年10月20日 08:44:41 作者:黄小鱼ZZZ ...
- 走进Spring Boot源码学习之路和浅谈入门
Spring Boot浅聊入门 **本人博客网站 **IT小神 www.itxiaoshen.com Spring Boot官网地址:https://spring.io/projects/spring ...
随机推荐
- Bootstrap之字体图标
优点:1.减少请求 2.容易控制样式 所在位置:在下载的bootstrap文件中的fonts文件夹存放字体图标 默认路径为当前目录下,如需修改路径,则需在bootstrap.css中查找font-fa ...
- 3D banner(CSS3+HTML5)
1.这是一篇 3Dbanner制作的简易流程,支持高版本的chrome和firefox浏览器,俩浏览器显示可能会有些差异 2.没有兼容性代码,因为仅仅只是熟悉流程,希望小伙伴们自己改善哈(>﹏& ...
- 让ABAP开发者更加轻松的若干快捷键
引言 ABAP是一种和当代编程语言在许多方面有着相当不同的编程语言.ABAP的某些方面可能会让我们奇怪,为什么它会如此复杂?而它的某些方面又是那么杰出,给予了ABAP开发者们比其它任何语言更多的便利. ...
- SharePoint 2013 Excel Services ECMAScript 示例之明日限行
前言:最近遇到一个“明日限行”的功能,北京的交通啊,这个不在今天讨论范围内,暂不吐槽,想想代码开发,还要写WebPart部署,很麻烦,而且部署服务器,需要领导审批,想绕过这个麻烦事儿,就想到客户端了, ...
- Android系统的五种数据存储形式(二)
之前介绍了Android系统下三种数据存储形式,今天补充介绍另外两种,分别是内容提供者和网络存储.有些人可能认为内存提供者和网络存储更偏向于对数据的操作而不是数据的存储,但这两种方式确实与数据有关,所 ...
- Java Web中乱码问题
response.setContentType("text/html;charset=UTF-8"); 用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式.什么编码读取这个 ...
- JVM之PC寄存器(Program Counter Register)
基本特性: 当前线程执行的字节码的行号指示器. Java虚拟机支持多个线程同时执行,每一个线程都有自己的pc寄存器. 任意时刻,一个线程都只会执行一个方法的代码,称为该线程的当前方法,对于非nativ ...
- 基于php基础语言编写的小程序之计算器
基于php基础语言编写的小程序之计算器 需求:在输入框中输入数字进行加.减.乘.除运算(html+php) 思路: 1首先要创建输入数字和运算符的输入框,数字用input的text属性,运算符用sel ...
- Python简单练习
#coding=UTF-8 a=10; b=2; c=a+b; print (c); score=90; if score>=80: print ("很好"); elif s ...
- Sublime Text 3
Sublime Text 3 插件安装 安装 Package Control 按 Ctrl+` 或者,菜单 View > Show Console 打开命令窗口 import urllib.re ...