Spring MVC系列-(1) Spring概述

275 阅读5分钟

Spring.png

1. Spring概述

本章主要介绍Spring中的体系结构和常见概念,比如bean、控制反转(Inverse of Control,IoC)等。

1.1 体系结构

Spring 框架提供约 20 个模块,可以根据应用程序的要求来使用。

Screen Shot 2020-01-11 at 7.54.32 PM.png

核心容器

核心容器由核心,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

上面的上下文可以分为两类,加载配置文件和配置类。

  • 加载文件

Screen Shot 2020-01-12 at 2.51.51 PM.png

  • 加载配置类

Screen Shot 2020-01-12 at 2.52.04 PM.png


本文由『后端精进之路』原创,首发于博客 teckee.github.io/ , 转载请注明出处

搜索『后端精进之路』关注公众号,立刻获取最新文章和价值2000元的BATJ精品面试课程

后端精进之路.png