Spring MVC系列-(1) Spring概述
后端精进之路 人气:0
![Spring.png](http://ww1.sinaimg.cn/large/a18449c6gy1gco2xb0bj9j20nn0cet8m.jpg)
## 1. Spring概述
本章主要介绍Spring中的体系结构和常见概念,比如bean、控制反转(Inverse of Control,IoC)等。
### 1.1 体系结构
Spring 框架提供约 20 个模块,可以根据应用程序的要求来使用。
![Screen Shot 2020-01-11 at 7.54.32 PM.png](http://ww1.sinaimg.cn/large/a18449c6gy1gasvb92cluj20n00k8whh.jpg)
#### 核心容器
核心容器由核心,Bean,上下文和表达式语言模块组成,它们的细节如下:
- **核心模块**提供了框架的基本组成部分,包括 IoC 和依赖注入功能。
- **Bean模块**提供 BeanFactory,它是一个工厂模式的复杂实现。
- **上下文模块**建立在由核心和 Bean 模块提供的坚实基础上,它是访问定义和配置的任何对象的媒介。ApplicationContext 接口是上下文模块的重点。
- **表达式语言模块**在运行时提供了查询和操作一个对象图的强大的表达式语言。
#### 数据访问/集成
数据访问/集成层包括 JDBC,ORM,OXM,JMS 和事务处理模块,它们的细节如下:
JDBC 模块提供了删除冗余的 JDBC 相关编码的 JDBC 抽象层。
ORM 模块为流行的对象关系映射 API,包括 JPA,JDO,Hibernate 和 iBatis,提供了集成层。
OXM 模块提供了抽象层,它支持对 JAXB,Castor,XMLBeans,JiBX 和 XStream 的对象/XML 映射实现。
Java 消息服务 JMS 模块包含生产和消费的信息的功能。
事务模块为实现特殊接口的类及所有的 POJO 支持编程式和声明式事务管理。
#### Web
Web 层由 Web,Web-MVC,Web-Socket 和 Web-Portlet 组成,它们的细节如下:
* Web 模块提供了基本的面向 web 的集成功能,例如多个文件上传的功能和使用 servlet 监听器和面向 web 应用程序的上下文来初始化 IoC 容器。
* Web-MVC 模块包含 Spring 的模型-视图-控制器(MVC),实现了 web 应用程序。
* Web-Socket 模块为 WebSocket-based 提供了支持,而且在 web 应用程序中提供了客户端和服务器端之间通信的两种方式。
* Web-Portlet 模块提供了在 portlet 环境中实现 MVC,并且反映了 Web-Servlet 模块的功能。
#### 其他
还有其他一些重要的模块,像 AOP,Aspects,Instrumentation,Web 和测试模块,它们的细节如下:
* AOP 模块提供了面向方面的编程实现,允许你定义方法拦截器和切入点对代码进行干净地解耦,它实现了应该分离的功能。
* Aspects 模块提供了与 AspectJ 的集成,这是一个功能强大且成熟的面向切面编程(AOP)框架。
* Instrumentation 模块在一定的应用服务器中提供了类 instrumentation 的支持和类加载器的实现。
* Messaging 模块为 STOMP 提供了支持作为在应用程序中 WebSocket 子协议的使用。它也支持一个注解编程模型,它是为了选路和处理来自 WebSocket 客户端的 STOMP 信息。
* 测试模块支持对具有 JUnit 或 TestNG 框架的 Spring 组件的测试。
### 1.2 Bean
Spring对Bean的官方定义如下:
>在 Spring 中,**构成应用程序主干**并由**Spring IoC容器**管理的**对象**称为bean。**bean是一个由Spring IoC容器实例化、组装和管理的对象。**
由上面的定义可以得到如下3点信息:
* bean是对象,一个或者多个不限定。
* bean由Spring IoC容器管理。
* 应用程序由一个个bean构成。
### 1.3 控制反转(IoC)与依赖注入(DI)
**控制反转**英文全称:Inversion of Control,简称就是IoC,这是管理Java实例协作关系的一种方式。这种方式还有另一个名称,**依赖注入(Dependency Injection)**,两者的含义相同。
传统方式下,当某个Java对象(调用者)需要调用另一个Java对象(被依赖对象)的方法时,通常有如下两种做法:
* 原始做法: 调用者主动创建被依赖对象,然后再调用被依赖对象的方法。
* 简单工厂模式: 调用者先找到被依赖对象的工厂,然后主动通过工厂去获取被依赖对象,最后再调用被依赖对象的方法。
注意上面的**主动**二字,这必然会导致调用者与被依赖对象实现类的硬编码耦合,非常不利于项目升级的维护。
使用Spring框架之后,调用者无需主动获取被依赖对象,调用者只要被动接受Spring容器为调用者的成员变量赋值即可,由此可见,使用Spring后,**调用者获取被依赖对象的方式由原来的主动获取,变成了被动接受**——所以Rod Johnson(Spring框架创始人)称之为**控制反转**。
另外从Spring容器的角度来看,**Spring容器负责将被依赖对象赋值给调用者的成员变量——相当于为调用者注入它依赖的实例**,因此Martine Fowler称之为**依赖注入**。
>Spring IoC容器就是这样的辅助程序,它负责对象的生成和依赖的注入。类的实例化、依赖的实例化、依赖的传入都交由Spring IoC容器控制,而不是用new方式实例化对象、通过非构造函数方法传入依赖等常规方式。
### 1.4 Bean的管理
在Spring的应用中,Spring容器负责创建对象,装配对象,配置它们以及管理它们的整个生命周期,从生存到死亡。
容器是Spring框架的核心,Spring自带了多个容器的实现。可以归纳为两种不同的类型:
- **BeanFactory**(由org.springframework.beans.factory.BeanFactory接口定义)是最简单的容器,提供基本的DI支持。
- **应用上下文**(由org.springframework.context.ApplicationContext接口定义)基于BeanFactory构建,并提供应用框架级别的服务,例如从属性文件解析文本信息,以及发布应用事件给感兴趣的事件监听者。
通常情况下,会使用应用上下文来进行Bean的管理。Spring自带了多种类型的应用上下文,下面列举了几种常见的:
![Screen Shot 2020-01-11 at 10.23.44 PM.png](http://ww1.sinaimg.cn/large/a18449c6gy1gaszmpf5erj21100fc47t.jpg)
上面的上下文可以分为两类,加载配置文件和配置类。
- 加载文件
![Screen Shot 2020-01-12 at 2.51.51 PM.png](http://ww1.sinaimg.cn/large/a18449c6gy1gats6o7ie4j20qs02amy2.jpg)
- 加载配置类
![Screen Shot 2020-01-12 at 2.52.04 PM.png](http://ww1.sinaimg.cn/large/a18449c6gy1gats7icfwzj20xq024gn3.jpg)
---
本文由『后端精进之路』原创,首发于博客 http://teckee.github.io/ , 转载请注明出处
搜索『后端精进之路』关注公众号,立刻获取最新文章和**价值2000元的BATJ精品面试课程**。
![后端精进之路.png](http://ww1.sinaimg.cn/large/a18449c6gy1g9v9luujswj21n10l9jux.jpg)
加载全部内容