Note/Spring实战/3

上一篇:Note2

前言:这节主要是对Spring模块、Spring几个重要版本的新特性以及整个Spring生态圈的大致介绍。挑着看就行。

1. Spring模块

在【Note1】中就讲过了,Spring框架主要目标和功能就是通过DI、 AOP和消除样板式代码来简化企业级Java开发。但Spring并不仅仅只能做这些事情(即使已经够厉害了),在Spring框架之外还存在一个构建在核心框架之上的庞大生态圈, 它将Spring扩展到不同的领域, 例如Web服务、 REST、 移动开发以及NoSQL。 

【###】Spring框架的核心组成部分

下载Spring发布版本并查看其lib目录时, 会发现里面有多个JAR文件。 在Spring 4.0中, Spring框架的发布版本总共包括了60个jar文件(分为20个不同的模块, 每个模块有3个JAR文件 [二进制类库、 源码的JAR文件以及JavaDoc的JAR文件] )。

其中,二进制类库中包含的是编译后的.class文件,我们项目中引用的就是这种jar包。 源码的JAR文件中包含的是对应的源码,即.java文件。而JavaDoc的JAR文件包含的是对应的官方说明文档(.html文件),注意是全英文的哦。

60个jar包,分成20个模块。20个模块又可以根据其所属的功能分为6类不同的功能。

20个模块为开发企业级应用提供了所需的一切。 但是你也不必将应用建立在整个Spring框架之上, 你可以自由地选择适合自身应用需求的Spring模块。当Spring不能满足需求时,  Spring甚至提供了与其他第三方框架和类库的集成点 。

【###】下面继续逐一浏览Spring的6个功能模块, 看看它们是如何构建起Spring整体蓝图的 

(1)Spring核心容器

容器是Spring框架最核心的部分, 它管理着Spring应用中bean的创建、配置和管理。 

在该模块中, 包括了Spring bean工厂, 它为Spring提供了DI的功能。 基于bean工厂, 我们还会发现有多种Spring应用上下文的实现。 

除了bean工厂和应用上下文, 该模块也提供了许多企业服务, 例如Email、 JNDI访问、 EJB集成和调度。

所有的Spring模块都构建于核心容器之上。 当你配置应用时, 其实你隐式地使用了这些类。  

(2)Spring的AOP模块

在AOP模块中, Spring对面向切面编程提供了丰富的支持。 这个模块是Spring应用系统中开发切面的基础。

(3)数据访问与集成

前面讲过,使用JDBC编写代码通常会导致大量的样板式代码 。而Spring基于模板的JDBC抽象层和DAO(Data Access Object) 模块抽象了这些样板式代码。

对于那些更喜欢ORM(Object-Relational Mapping) 工具而不愿意直接使用JDBC的开发者, Spring提供了ORM模块。 Spring的ORM模块建立在对DAO的支持之上, 并为多个ORM框架提供了一种构建DAO的简便方式。 Spring没有尝试去创建自己的ORM解决方案, 而是对许多流行的ORM框架进行了集成。包括Hibernate、 Java Persisternce API、Java Data Object和iBATIS SQL Maps。

Spring的事务管理(Transaction)支持所有的ORM框架以及JDBC。

本模块同样包含了在JMS(Java Message Service) 之上构建的Spring抽象层, 它会使用消息以异步的方式与其他应用集成。 

从Spring 3.0开始, 本模块还包含对象到XML映射(OXM)的特性, 它最初是Spring Web Service项目的一部分。

除此之外, 本模块会使用Spring AOP模块为Spring应用中的对象提供事务管理服务。

(4)Web与远程调用 

MVC(Model-View-Controller) 模式是一种普遍被接受的构建Web应用的方法, 它可以帮助用户将界面逻辑与应用逻辑分离。 虽然Spring能够与多种流行的MVC框架进行集成, 但它的Web和远程调用模块自带了一个强大的MVC框架(Spring MVC), 有助于在Web层提升应用的松耦合水平。 

除了面向用户的Web应用, 该模块还提供了多种构建与其他应用交互的远程调用方案。 Spring远程调用功能集成了RMI(Remote Method Invocation) 、 Hessian、 Burlap、 JAX-WS, 同时Spring还自带了一个远程调用框架: HTTP invoker。 Spring还提供了暴露和使用REST API的良好支持。

(5)Instrumentation 

Spring的Instrumentation模块提供了为JVM添加代理(agent) 的功能。具体来讲, 它为Tomcat提供了一个织入代理, 能够为Tomcat传递类文件, 就像这些文件是被类加载器加载的一样。

用的很少。

(6)测试

鉴于开发者自测的重要性, Spring提供了测试模块以致力于Spring应用的测试。

通过该模块, 你会发现Spring为使用JNDI、 Servlet和Portlet编写单元测试提供了一系列的 mock 对象实现。 对于集成测试, 该模块为加载Spring应用上下文中的bean集合以及与Spring上下文中的bean进行交互提供了支持 。

2. Spring Portfolio 

使用Spring不应该仅仅停留在核心的Spring框架层面,整个Sprin Portfolio包括多个构建于核心Spring框架之上的框架和类库,整个Spring Portfolio几乎为每一个领域的Java开发都提供了Spring编程模型。

(1)Spring Web Flow
Spring Web Flow建立于Spring MVC框架之上, 它为基于流程的会话式Web应用(可以想一下购物车或者向导功能) 提供了支持。

(2)Spring Web Service(了解)
Spring Web Service提供了契约优先的Web Service模型, 服务的实现都是为了满足服务的契约而编写的。

(3)Spring Security
利用Spring AOP,Spring Security为Spring应用提供了声明式的安全机制。

(4)Spring Integration (了解)
许多企业级应用都需要与其他应用进行交互。 Spring Integration提供了多种通用应用集成模式的Spring声明式风格实现。

(5)Spring Batch(了解)
当我们需要对数据进行大量操作时, 没有任何技术可以比批处理更胜任这种场景。 如果需要开发一个批处理应用, 你可以通过Spring Batch, 使用Spring强大的面向POJO的编程模型。

(6)Spring Data
Spring Data使得在Spring中使用任何数据库都变得非常容易。  不管你使用文档数据库, 如MongoDB, 图数据库,如Neo4j, 还是传统的关系型数据库, Spring Data都为持久化提供了一种简单的编程模型。 这包括为多种数据库类型提供了一种自动化的Repository机制,它负责为你创建Repository的实现。

使用Spring Data可以简化Java Persistence API(JPA) 开发。

(7)Spring Social(了解)

这是Spring的一个社交网络扩展模块,它能够帮助你通过REST API连接Spring应用, 其中有些Spring应用可能原本并没有任何社交方面的功能目标。

(8)Spring Mobile(了解)
Spring Mobile是Spring MVC新的扩展模块, 用于支持移动Web应用开发。

(9)Spring for Android(了解)

与Spring Mobile相关的是Spring Android项目。 这个新项目, 旨在通过Spring框架为开发基于Android设备的本地应用提供某些简单的支持。

(10)Spring Boot

Spring极大地简化了众多的编程任务, 减少甚至消除了很多样板式代码。

而Spring Boot以Spring的视角,致力于简化Spring本身。

Spring Boot大量依赖于自动配置技术, 它能够消除大部分(在很多场景中, 甚至是全部) Spring配置。 它还提供了多个Starter项目, 不管你使用Maven还是Gradle, 这都能减少Spring工程构建文件的大小。 

3. Spring新特性

Spring 3.1在很大程度上聚焦于配置改善以及其他的一些增强, 包括Spring MVC的增强。

【###】Spring 3.1重要的功能升级:

(1)为了解决各种环境下(如开发、 测试和生产) 选择不同配置的问题, Spring 3.1引入了环境profile功能。 借助于profile, 就能根据应用部署在什么环境之中选择不同的数据源bean;

(2)在Spring 3.0基于Java的配置之上, Spring 3.1添加了多个enable注解, 这样就能使用这个注解启用Spring的特定功能;

(3)添加了Spring对声明式缓存的支持, 能够使用简单的注解声明缓存边界和规则, 这与你以前声明事务边界很类似;

(4)新添加的用于构造器注入的c命名空间, 它类似于Spring 2.0所提供的面向属性的p命名空间, p命名空间用于属性注入, 它们都是非常简洁易用的;

(5)Spring开始支持Servlet 3.0, 包括在基于Java的配置中声明Servlet和Filter, 而不再借助于web.xml;

(6)改善Spring对JPA的支持, 使得它能够在Spring中完整地配置JPA, 不必再使用persistence.xml文件。

【###】Spring 3.1多项针对Spring MVC的功能增强:

(1)自动绑定路径变量到模型属性中;

(2)提供了@RequestMappingproduces和consumes属性, 用于匹配请求中的Accept和Content-Type头部信息;

(3)提供了@RequestPart注解, 用于将multipart请求中的某些部分绑定到处理器的方法参数中;

(4)支持Flash属性(在redirect请求之后依然能够存活的属性) 以及用于在请求间存放flash属性的RedirectAttributes类型。

【###】Spring 3.1不再支持的功能:

(1)为了支持原生的EntityManager, Spring的JpaTemplate和JpaDaoSupport类被废弃掉了。虽然直到Spring 3.2版本, 它依然是可以使用的。 但最好不要再使用它们了, 因为它们不会进行更新以支持JPA 2.0, 并且已经在Spring 4中移除掉了。 

Spring 3.2是主要关注Spring MVC的一个发布版本 。

【###】Spring 3.2MVC相关功能改善

(1)Spring 3.2的控制器(Controller) 可以使用Servlet 3.0的异步请求, 允许在一个独立的线程中处理请求, 从而将Servlet线程解放出来处理更多的请求;

(2)尽管从Spring 2.5开始, Spring MVC控制器就能以POJO的形式进行很便利地测试, 但是Spring 3.2引入了Spring MVC测试框架, 用于为控制器编写更为丰富的测试, 断言它们作为控制器的行为行为是否正确, 而且在使用的过程中并不需要Servlet容器;

(3)除了提升控制器的测试功能, Spring 3.2还包含了基于RestTemplate的客户端的测试支持, 在测试的过程中, 不需要往真正的REST端点上发送请求;

(4)@ControllerAdvice注解能够将通用的@ExceptionHandler、 @ InitBinder和@ModelAttributes方法收集到一个类中, 并应用到所有控制器上;

(5)在Spring 3.2之前, 只能通过ContentNegotiatingViewResolver使用完整的内容协商(full content negotiation) 功能。 但是在Spring 3.2中, 完整的内容协商功能可以在整个Spring MVC中使用, 即便是依赖于消息转换器(message converter) 使用和产生内容的控制器方法也能使用该功能;

(6)Spring MVC 3.2包含了一个新的@MatrixVariable注解, 这个注解能够将请求中的矩阵变量(matrix variable) 绑定到处理器的方法参数中;

(7)基础的抽象类AbstractDispatcherServletInitializer能够非常便利地配置DispatcherServlet, 而不必再使用web.xml。 与之类似, 当你希望通过基于Java的方式来配置Spring的时候, 可以使用Abstract- AnnotationConfigDispatcherServletInitializer的子类;

(8)新增ResponseEntityExceptionHandler,可以用来替代Default-HandlerExceptionResolver。ResponseEntityExceptionHandler

方法会返回ResponseEntity<Object>, 而不是 ModelAndView;

(9)RestTemplate和@RequestBody的参数可以支持范型;

(10)RestTemplate和@RequestMapping可以支持HTTP PATCH方法;

(11)在拦截器匹配时, 支持使用URL模式将其排除在拦截器的处理功能之外 。

【###】Spring3.2 非MVC相关功能的改善

(1)@Autowired、 @Value和@Bean注解能够作为元注解, 用于创建自定义的注入和bean声明注解;

(2)@DateTimeFormat注解不再强依赖JodaTime。如果提供了JodaTime,就会使用它,否则的话,会使SimpleDateFormat

(3)Spring的声明式缓存提供了对JCache 0.5的支持;

(4)支持定义全局的格式来解析和渲染日期与时间;

(5)在集成测试中, 能够配置和加载WebApplicationContext;

(6)在集成测试中, 能够针对request和session作用域的bean进行测试。

【###】Spring 4.0新特性

(1)Spring提供了对WebSocket编程的支持, 包括支持JSR-356——Java API for WebSocket;

(2)鉴于WebSocket仅仅提供了一种低层次的API, 急需高层次的抽象, 因此Spring 4.0在WebSocket之上提供了一个高层次的面向消息的编程模型, 该模型基于SockJS, 并且包含了对STOMP协议的支持;

(3)新的消息(messaging) 模块, 很多的类型来源于Spring Integration项目。 这个消息模块支持Spring的SockJS/STOMP功能, 同时提供了基于模板的方式发布消息;

(4)Spring是第一批(如果不说是第一个的话) 支持Java 8特性的Java框架, 比如它所支持的lambda表达式。 别的暂且不说, 这首先能够让使用特定的回调接口(如RowMapper和JdbcTemplate)更加简洁, 代码更加易读;

(5)与Java 8同时得到支持的是JSR-310——Date与Time API, 在处理日期和时间时, 它为开发者提供了比java.util.Date或java.util.Calendar更丰富的API;

(6)为Groovy开发的应用程序提供了更加顺畅的编程体验, 尤其是支持非常便利地完全采用Groovy开发Spring应用程序。 随这些一起提供的是来自于Grails的BeanBuilder, 借助它能够通过Groovy配置Spring应用;

(7)添加了条件化创建bean的功能, 在这里只有开发人员定义的条件满足时, 才会创建所声明的bean;

(8)Spring 4.0包含了Spring RestTemplate的一个新的异步实现,它会立即返回并且允许在操作完成后执行回调;

(9)添加了对多项JEE规范的支持, 包括JMS 2.0、 JTA 1.2、 JPA 2.1和Bean Validation 1.1。 

4. 小结

Spring致力于简化企业级Java开发, 促进代码的松散耦合。 成功的关键在于依赖(DI)注入和AOP。

DI是组装应用对象的一种方式,借助这种方式对象无需知道依赖来自何处或者依赖的实现方式。 不同于自己获取依赖对象, 对象会在运行期赋予它们所依赖的对象。 依赖对象通常会通过接口了解所注入的对象, 这样的话就能确保低耦合。

AOP可以帮助应用将散落在各处的逻辑汇集于一处——切面。 当Spring装配bean的时候, 这些切面能够在运行期编织起来, 这样就能非常有效地赋予bean新的行为。

 

下一篇:Note4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值