开始翻译 Spring 官方文档有四个目的。
- 巩固 Spring 基础知识
- 锻炼英语阅读能力
- 养成从信息源头获取知识的习惯
- 完成购买的一个课程里的 ARTS 打卡计划
计划
计划每周至少翻译一篇,每篇至少一节。
第一章:Spring 框架概述
Spring 框架是一个轻量级和潜在的一站式构建企业级应用的解决方案。不过,Spring 是模块化的,允许你仅使用你需要的部分,而不需要引入剩下的部分。你可以使用 IoC 容器的同时,在上层使用任何一个 Web 框架,但你也可以仅使用 Hibernate 集成代码或者 JDBC 抽象层。Spring 框架支持声明式事务管理,通过 RMI 或者 Web Service 远程访问你的逻辑,以及用于持久化你的数据的各种各样的选项。它提供了一个全功能的 MVC 框架,而且让你能透明地集成 AOP 到你的软件中。
Spring 被设计成非侵入式的,这意味着你的领域逻辑代码基本上没有依赖框架本身。在你的集成层(比如,数据访问层),会存在某些数据访问技术和 Spring 类库的依赖。不过,这很容易和你代码的其他部门隔离开来。
这个文档是 Spring 框架特性的参考指南。如果你对这个文档有任何需求、评论和问题,请在用户邮件列表提交。关于框架本身的问题应在 StackOverFlow 提问(点击查阅)。
1. Spring 入门
这个参考指南提供了关于 Spring 框架的详细信息,提供了所有特性的详尽文档,以及 Spring 包含的基本概念的一些背景。
如果你知识刚开始入门 Spring,你可能想通过创建一个基于 Spring Boot 的应用来开始使用 Spring 框架。Spring Boot 提供了一种快速(和既定)的方式来创建一个生产级的 Spring 应用。它基于 Spring 框架,约定优先于配置,是为了让尽可能快的开始和运行而设计的。
你可以使用 start.spring.io 来生成一个基础项目,或者根据一个入门指南,比如构建一个 RESful Web Service 入门。为了易于消化,这些指南专注于任务,而且大部分是基于 Spring Boot。这些也包括其他你在解决特定问题时可能要考虑的 Spring 系列项目。
2. Spring 框架介绍
Spring 框架是为开发 Java 程序提供全面基础设施支持的 Java 平台。Spring 处理基础设施,所以你可以专注于你的应用。
Spring 让你能从 POJO 对象构建应用程序和将企业服务非侵入的应用到 POJO 对象上。这个能力适用于 Java SE 编程模型和 Java EE。
下面是你,作为一个应用开发者,可以从 Spring 平台得到的益处:
- 让一个 Java 方法在一个数据库事务中执行,而不需要处理事务相关的 API。
- 让一个本地 Java 方法成为一个 HTTP 端点,而不需要处理 Servlet API。
- 让一个本地方法成为一个消息处理器,而不需要处理 JMS API。
- 让一个本地方法成为一个管理操作,而不需要处理 JMX API。
2.1 依赖注入和控制反转
一个 Java 应用–一种宽松的说辞指运行在从受限的、嵌入式的应用到 n 层、服务器端的企业应用全范围–通常由互相协作来组成一个正确应用的对象组成。因此在一个应用中的对象彼此之间存在依赖关系。
尽管 Java 平台提供了大量的应用开发功能,它缺少组织基础构建块到一个连贯的整体的方式,把这种工作留给了架构师和开发者。尽管你可以用设计模式,比如,工厂、抽象工厂、建造者、装饰器和服务定位器,来组合构成一个应用的各种各样的类和对象实例。这些模式很简单:命名最佳实践、描述这个模式能做什么、应用在哪里、解决什么问题等等。模式是正式化的你必须自己在你的应用里实现的最佳实践。
Spring 框架控制反转(IoC)组件通过提供一种正式化的方式组合分离的组件到一个完整运行的应用解决了这个困扰,现在已经可以使用。Spring 框架把正式化的设计模式编纂成了第一类对象,你可以把它们集成到你自己的应用中。大量的组织和机构通过这种方式使用 Spring 框架来构造健壮、可维护的应用。
背景
“问题是,反转了哪些方面的控制?” Marting Fowler 于 2004 年在他的网站提出了这个关于控制反转(IoC)的问题。Fowler 建议重新命名这个原则使它更加“自解释”,同时他提出了依赖注入。
2.2 框架模块
Spring 框架由组织成了大概20个模块的特性所组成。这些模块被分组到核心容器(Core Container)、数据访问/集成(Data Access/Integration)、Web、AOP(面向切面编程)、工具(Instrumentation)、信息(Messaging)和测试(Test),正如下面图表所示。
图 2.1 Spring 框架概述
以下部分为每一个特性列出了可用的模块以及它们的构件名称和覆盖的主题。构件名称对应用于依赖管理工具的构件 ID(Artifact IDs)
2.21 核心容器
核心容器由 spring-core
、spring-beans
、spring-context
、spring-context-support
和 spring-expression
(Spring Expression Language)模块组成。
spring-core
和spring-beans
模块提供框架的根本部分,包括控制反转和依赖注入特性。BeanFactory
是一个工厂模式的精妙实现。它移除了编程式单例的需要,允许你从实际的编程逻辑分离配置和依赖说明。
上下文(spring-context
)模块构建在 core 和 Beans 模块的坚实基础之上:它是一种以和 JNDI 注册表相似的框架式方法访问对象的方式。上下文模块从 Beans 模块和增加的国际化(使用资源包(resource bundles)等)、事件传播、资源加载和透明的上下文创建(如 Servlet 容器)支持继承它的特性。上下文模块也支持 Java EE 特性,比如 EJB、JMX 和基本的远程调用。ApplicationContext
接口是上下文模块的重点。spring-context-support
提供为缓存(EhCache、Guava、JCache),邮件(JavaMail),调度(CommonJ,Quartz)和模板引擎(FreeMarker、JasperReports、Velocity)集成常用第三方类库到 Spring 应用上下文的支持。
spring-expression
模块提供一个强大的在运行时查询和操作对象图表的表达式语言。它是在 JSP 2.1 规格中指定的统一表达式语言(unified EL)的一个扩展。该语言支持设置和获取属性值、属性赋值、方法调用、数组内容访问、集合和索引器、逻辑和算数运算符、命名变量以及通过名称从 Spring 的 IoC 容器获取对象。它也支持列表映射和选择,以及常用列表集合。
2.22 AOP 和工具
spring-aop
模块提供一个符合 AOP 联盟的面向切面编程实现,允许你定义,例如,方法拦截器和切入点来清晰地分离应该被分离的功能性代码。使用源码级元数据功能,你也可以包含行为信息到你的代码中,以一种类似 .NET 特性(attributes)的方式。
独立的spring-aspects
提供与 AspectJ 的集成。
spring-instument
模块提供类工具支持和被用在特定 应用服务器的类加载器实现。spring-instrument-tomcat
模块包含 Tomcat 的 Spring 工具代理(instrumentation agent)。
2.2.3 消息
Spring 框架 4 包含了一个有着 Spring 集成项目(如Message
、MessageChannel
、MessageHandler
和其他为基于消息的应用程序提供基础服务的)关键抽象的spring-messaging
模块。这个模块也包含了一组映射消息到方法的注解集,类似 Spring MVC 基于注解的编程模型。
2.2.4 数据访问/集成
数据访问和集成层由 JDBC、ORM、OXM、JMS 和 Transaction 这些模块组成。
spring-jdbc
模块提供一个 JDBC 抽象层 ,它去除了冗长的 JDBC 编码和解析数据库厂商特定错误编码的必要。
spring-tx
模块为实现特殊接口和你所有的 POJO 对象的类提供了编程式和声明式事务管理。
spring-orm
模块提供了流行的对象关系映射 API,包括 JPA、JDO 和 Hibernate,的集成层。使用spring-orm
模块,你可以结合所有其他 Spring 提供的特性(比如前面提到的简单的声明式事务管理)使用所有这些 O/R-mapping 框架。
spring-oxm
模块提供了一个支持 Object/XML mapping 实现(如,JAXB、Castor、XMLBeans、JiBX 和 XStream)的抽象层。
spring-jms
模块(Java 消息服务)包含了发布/订阅消息相关的特性。从 Spring 框架 4.1 版本开始,它提供了和spring-messaging
模块的集成。
2.2.5 Web
Web 层由spring-web
、spring-webmvc
、spring-websocket
和spring-webmvc-porlet
这些模块组成。
spring-web
模块提供基础的面向 Web 的集成特性,比如多份文件上传功能以及使用 Servlet 监听器和面向 Web 应用程序上下文的 IoC 容器的初始化。它也提供了一个 HTTP 客户端和 Spring 远程调用支持的 Web 相关部分。
spring-webmvc
模块(也被称为 Web-Servlet 模块)包含了 Spring 的模型-视图-控制器(MVC)和 Web 应用程序的 REST Web Services 实现。Spring 的 MVC 框架提供了一个清晰的领域模型代码和 Web 表单的分离,同时集成了所有的其他 Spring 框架的特性。
spring-webmvc-porlet
模块(也被称为 Web-Portlet 模块)提供了用于 Portlet 环境的 MVC 实现,同时服用了基于 Servlet 的spring-webmvc
模块的功能。
2.2.6 Test
spring-test
模块支持 Spring 组件使用 JUnit 或 TestNG 做单元测试和集成测试。它提供了一致的 Spring 应用程序上下文加载以及这些上下文的缓存。
2.3 使用场景
先前提到的构件块使 Spring 成为了很多场景下合理的选择,从运行在资源受限设备上的嵌入式应用程序到使用 Spring 的事务管理功能和 Web 框架集成的成熟的企业应用程序。
图 2.2 典型的成熟 Spring Web 运用程序
(done)
参考文档
[1] Spring 官方文档