本章内容:

  1. Spring的bean容器
  2. 介绍Spring的核心模块
  3. Spring的新功能

本章目录:


1.1 简化Java开发

1.1.1 激发POJO的潜能

1.1.2 依赖注入(DI)

1.1.3 应用切面


Spring的使命:简化java开发
为了降低Java开发的复杂性,Spring采取了以下4种关键策略:
1. 基于POJO的轻量级和最小侵入性编程;
2. 通过依赖注入和面向接口实现松耦合;
3. 基于切面和惯例进行声明式编程;
4. 通过切面和模板减少样板式代码。
5.


1.1.1 激发POJO的潜能

Spring竭力避免因自身的API而弄乱你的应用代码。Spring不会强迫你实现Spring规范的接口或继承Spring规范的类,相反,在基于Spring构建的应用中,它的类通常没有任何痕迹表明你使用了Spring。最坏的场景是,一个类或许会使用Spring注解,但它依旧是POJO(简单的Javabean)。


1.1.2 依赖注入(DI)

DI功能的实现
在实际开发中有多个对象,每个对象负责管理与之协作的其他对象(也就是所依赖的对象)的引用,这样导致对象之间的高度耦合。如下:

//骑士营救少女类 继承了 骑士类
public class DamselRescuingKnight implements Kinght{private RescueDamselQuest quest;//定义一个寻找营救少女类对象public  DamselRescuingKnight(){this.quest=new RescueDamselQuest();//两个对象高度耦合}public  void embarkOnQuest(){ quest.embark();//调用执行方法}
}

耦合具有两面性,首先高度耦合的代码难以测试,理解和复用,另一方面完全没有耦合的代码什么都做不了,不同的类应当有适当的交互。
Spring的解决办法是:通过DI,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。对象无需自行创建或管理它们的依赖关系。
案例:

public class BraveKnight implements Quest{private Quest quest;public  BraveKnight (Quest quest){this.quest=quest;}public  void embarkOnQuest(){ quest.embark();//调用执行方法}
}

BraveKnight没有自行创建探险任务,而是在构造的时候把探险任务作为构造器参数传入。这是依赖注入的方式之一,即构造器注入(constructor injection)。
更重要的是,传入的探险类型是Quest,也就是所有探险任务都必须实现的一个接口。所以,BraveKnight能够响应RescueDamselQuest、 SlayDragonQuest、 MakeRoundTableRounderQuest等任意的Quest实现。

这里的要点是BraveKnight没有与任何特定的Quest实现发生耦合。对它来说,被要求挑战的探险任务只要实现了Quest接口,那么具体是哪种类型的探险就无关紧要了。这就是DI所带来的最大收益——松耦合。如果一个对象只通过接口(而不是具体实现或初始化过程)来表明依赖关系,那么这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行替换。

对依赖进行替换的一个最常用方法就是在测试的时候使用mock实现。
案例:

public class BraveKnight{@Testpublic void KnightShouldEmbarkOnQuest(){Quest quest=mock(Quest.class);//创建mock Quest//注入mock QuestBraveKnight braveKnight=new BraveKnight(quest);braveKnight.embarkOnQuest();verify(quest,time(1)).embark();}
}   

你可以使用mock框架Mockito去创建一个Quest接口的mock实现。通过这个mock对象,就可以创建一个新的BraveKnight实例,并通过构造器注入这个mock Quest。
案例:
基于xml的装配knights.xml:

基于java的装配

不管你使用的是基于XML的配置还是基于Java的配置,DI所带来的收益都是相同的。尽管BraveKnight依赖于Quest,但是它并不知道传递给它的是什么类型的Quest,也不知道这个Quest来自哪里。与之类似,SlayDragonQuest依赖于PrintStream,但是在编码时它并不需要知道这个PrintStream是什么样子的。只有Spring通过它的配置,能够了解这些组成部分是如何装配起来的。这样的话,就可以在不改变所依赖的类的情况下,修改依赖关系

Spring装载xml配置文件的工作:
Spring通过应用上下文(Application Context)装载bean的定义并把它们组装起来。Spring应用上下文全权负责对象的创建和组装。Spring自带了多种应用上下文的实现,它们之间主要的区别仅仅在于如何加载配置。

如下用ClassPathXmlApplicationContext加载knights.xml,并获得
Knight对象的引用。

案例:
KnightMain.java加载包含Knight的Spring上下文。

这里的main()方法基于knights.xml文件创建了Spring应用上下文。随后它调用该应用上下文获取一个ID为knight的bean。得到Knight对象的引用后,只需简单调用embarkOnQuest()方法就可以执行所赋予的探险任务了。注意这个类完全不知道我们的英雄骑士接受哪种探险任务,而且完全没有意识到这是由BraveKnight来执行的。只有knights.xml文件知道哪个骑士执行哪种探险任务。


1.1.3 应用切面

DI能够让相互协作的软件组件保持松散耦合,而面向切面编程(aspect-oriented programming,AOP)允许你把遍布应用各处功能分离出来形成可重用的组件。

面向切面编程往往被定义为促使软件系统实现关注点的分离一项技术。系统由许多不同的组件组成,每一个组件各负责一块特定功能。除了实现自身核心的功能之外,这些组件还经常承担着额外的职责。诸如日志、事务管理和安全这样的系统服务经常融入到自身具有核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点,因为它们会跨越系统的多个组件。

  • 实现系统关注点功能的代码将会重复出现在多个组件中。这意味着如果你要改变这些关注点的逻辑,必须修改各个模块中的相关实现。即使你把这些关注点抽象为一个独立的模块,其他模块只是调用它的方法,但方法的调用还是会重复出现在各个模块中。
  • 组件会因为那些与自身核心业务无关的代码而变得混乱。一个向地址簿增加地址条目的方法应该只关注如何添加地址,而不应该关注它是不是安全的或者是否需要支持事务。

    其实简单的说,也就是将一些特定的,不停在各个模块或者组件中使用的功能抽离出来,做成一个独立可重用的的模块组件。

    案例:

AOP能够使这些服务模块化,并以声明的方式将它们应用到它们需要影响的组件中去。所造成的结果就是这些组件会具有更高的内聚性并且会更加关注自身的业务,完全不需要了解涉及系统服务所带来复杂性。总之,AOP能够确保POJO的简单性。
如下图,我们可以把切面想象为覆盖在很多组件之上的一个外壳。应用是由那些实现各自业务功能的模块组成的。借助AOP,可以使用各种功能层去包裹核心业务层。这些层以声明的方式灵活地应用到系统中,你的核心应用甚至根本不知道它们的存在。这是一个非常强大的理念,可以将安全、事务和日志关注点与核心业务逻辑相分离。

案例(AOP应用):
在骑士的例子上为它添加一个切面。
每一个人都熟知骑士所做的任何事情,这是因为吟游诗人用诗歌记载了骑士的事迹并将其进行传唱。假设我们需要使用吟游诗人(Minstrel)这个服务类来记载骑士的所有事迹。
Minstrel.java


在骑士执行每一个探险任务之前,singBeforeQuest()方法会被调用;在骑士完成探险任务之后,singAfterQuest()方法会被调用。
Minstrel都会通过一个PrintStream类来歌颂骑士的事迹,这个类是通过构造器注入进来的。
首先我们尝试不用切面进行操作:


但是这样就会让骑士类变得混乱不堪。
下面我们尝试采用切面(将Minstrel作为切面):
首先看xml配置文件

这里使用了Spring的aop配置命名空间把Minstrel bean声明为一个切面。首先,需要把Minstrel声明为一个bean,然后在<aop:aspect>元素中引用该bean。为了进一步定义切面,声明(使用<aop:before>)在embarkOnQuest()方法执行前调用Minstrel的singBeforeQuest()方法。这种方式被称为前置通知(before advice)。同时声明(使用<aop:after>)在embarkOnQuest()方法执行后调用singAfter Quest()方法。这种方式被称为后置通知(after advice)。

在这两种方式中,pointcut-ref属性都引用了名字为embank的切入点。该切入点是在前边的<pointcut>元素中定义的,并配置expression属性来选择所应用的通知。表达式的语法采用的是AspectJ的切点表达式语言。
在代码里面就不用进行任何操作,只是通过配置文件就完成了诗人类对骑士类的歌颂。
注意:
尽管我们使用Spring语法把Minstrel转变为一个切面,但首先要把它声明为一个Spring bean(也就是在配置文件里面进行配置)。能够为其他Springbean做到的事情都可以同样应用到Spring切面中,例如为它们注入依赖。


1.1.4 使用模板消除样板式代码

案例:
使用JDBC访问数据库

仅仅一个查询语句就涉及这么多的代码,所以Spring通过对模板的封装消除样板式代码。
代码如下:


1.2 容纳你的Bean

在这里我们了解一下配置文件是如何加载的,被加载到哪里去。
容器是Spring框架的核心。Spring容器使用DI管理构成应用的组件,它会创建相互协作的组件之间的关联。毫无疑问,这些对象更简单干净,更易于理解,更易于重用并且更易于进行单元测试。
Spring容器并不是只有一个。Spring自带了多个容器实现,可以归为两种不同的类型。

  • bean工厂(由org.springframework. beans.factory.eanFactory接口定义)是最简单的容器,提供基本的DI支持。
  • 应用上下文(org.springframework.context.ApplicationContext接口定义)基于BeanFactory构建,并提供应用框架级别的服务,例如从属性文件解析文本信息以及发布应用事件给感兴趣的事件监听者。(重点)

    总结:
    也就是说容器有两种一种是bean工厂,一种是应用上下文,利用容器来加载配置文件来得到bean。


1.2.1 使用应用上下文

Spring自带了多种类型的应用上下文。下面罗列的几个是你最有可能遇到的。

  • AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文
  • AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载Spring Web应用上下文
  • FileSystemXmlapplicationcontext:从文件系统下的一个或多个XML配置文件中加载上下文定义。
  • XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下文定义。

后面讨论web方面的,现在简单说一下FileSystemXmlApplicationContext从文件系统中加载应用上下文或者使用ClassPathXmlApplicationContext从类路径中加载应用上下文。
无论是从文件系统中装载应用上下文还是从类路径下装载应用上下文,将bean加载到bean工厂的过程都是相似的。
比如:
如何使用FileSystemXmlApplicationContext加载上下文:

ApplicationContext context=new FileSystemXmlApplicationContext("C:/knight.xml");

类似,使用ClassPathXmlApplicationContext从应用
的类路径下加载应用上下文:

ApplicationContext context=new ClassPathXmlApplicationContext("knight.xml");

二者区别:
使用FileSystemXmlApplicationContext和使用ClassPathXmlApp-licationContext的区别在于:FileSystemXmlApplicationContext在指定的文件系统路径下查找knight.xml文件;而ClassPathXmlApplicationContext是在所有的类路径(包含JAR文件)下查找 knight.xml文件。

再类似,使用AnnotationConfigApplicationContext在Java配置中加载应用上下文:

ApplicationContext context=new AnnotationConfigApplicationContext(类的全限名.class);

应用上下文准备就绪之后,我们就可以调用上下文的getBean()方法从Spring容器中获取bean。


1.2.2 bean的生命周期

在传统的Java应用中,bean的生命周期很简单。使用Java关键字new进行bean实例化,然后该bean就可以使用了。一旦该bean不再被使用,则由Java自动进行垃圾回收。
相比之下,Spring容器中的bean的生命周期就显得相对复杂多了。正确理解Spring bean的生命周期非常重要,因为你或许要利用Spring提供的扩展点来自定义bean的创建过程。下图展示了bean装载到Spring应用上下文中的一个典型的生命周期过程。

正如你所见,在bean准备就绪之前,bean工厂执行了若干启动步骤。
我们对图进行详细描述:

1. Spring对bean进行实例化;
2. Spring将值和bean的引用注入到bean对应的属性中;
3. 如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法;
4. 如果bean实现了BeanFactoryAware接口,Spring将调用 setBeanFactory()方法,将BeanFactory容器实例传入;
5. 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来;
6. 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法;
7. 如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用;
8. 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法;
9. 此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;
10. 如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。


1.3 俯瞰Spring风景线

首先让我们拆开Spring框架的核心来看看它究竟为我们带来了什么,然后我们再浏览下Spring Portfolio中的其他成员。

1.3.1 Spring模块

当我们下载Spring发布版本并查看其lib目录时,会发现里面有多个JAR文件。在Spring 4.0中,Spring框架的发布版本包括了20个不同的模块,每个模块会有3个JAR文件(二进制类库、源码的JAR文件以及JavaDoc的JAR文件)。完整的库JAR文件如图所示。

这些模块依据其所属的功能可以划分为6类不同的功能,如图下所示。体而言,这些模块为开发企业级应用提供了所需的一切。但是你也不必将应用建立在整个Spring框架之上,你可以自由地选择适合自身应用需求的Spring模块;当Spring不能满足需求时,完全可以考虑其他选择。事实上,Spring甚至提供了与其他第三方框架和类库的集成点,这样你就不需要自己编写这样的代码了。

让我们逐一浏览Spring的模块,看看它们是如何构建起Spring整体蓝
图的。

Spring核心容器

容器是Spring框架最核心的部分,它管理着Spring应用中bean的创建、配置和管理。在该模块中,包括了Spring bean工厂,它为Spring提供了DI的功能。
基于bean工厂,我们还会发现有多种Spring应用上下文的实现,每一种都提供了配置Spring的不同方式。除了bean工厂和应用上下文,该模块也提供了许多企业服务,例如E-mail、JNDI访问、EJB集成和调度。
所有的Spring模块都构建于核心容器之上。当你配置应用时,其实你隐式地使用了这些类。

Spring的AOP模块

在AOP模块中,Spring对面向切面编程提供了丰富的支持
这个模块是Spring应用系统中开发切面的基础。与DI一样,AOP可以帮助应用对象解耦。借助于AOP,可以将遍布系统的关注点(例如事务和安
全)从它们所应用的对象中解耦出来。

数据访问与集成

使用JDBC编写代码通常会导致大量的样板式代码,例如获得数据库连接、创建语句、处理结果集到最后关闭数据库连接。Spring的JDBC和DAO(Data Access Object)模块抽象了这些样板式代码,使我们的数据库代码变得简单明了,还可以避免因为关闭数据库资源失败而引发的问题。

该模块在多种数据库服务的错误信息之上构建了一个语义丰富的异常层,以后我们再也不需要解释那些隐晦专有的SQL错误信息了!
对于那些更喜欢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的事务管理支持所有的ORM框架以及JDBC。

本模块同样包含了在JMS(Java Message Service)之上构建的Spring抽象层,它会使用消息以异步的方式与其他应用集成。从Spring 3.0开始,本模块还包含对象到XML映射的特性,它最初是Spring WebService项目的一部分。
除此之外,本模块会使用Spring AOP模块为Spring应用中的对象提供事务管理服务。

Web与远程调用

MVC(Model-View-Controller)模式是一种普遍被接受的构建Web应用的方法,它可以帮助用户将界面逻辑与应用逻辑分离。Java从来不缺少MVC框架,Apache的Struts、JSF、WebWork和Tapestry都是可选的最流行的MVC框架。
虽然Spring能够与多种流行的MVC框架进行集成,但它的Web和远程调用模块自带了一个强大的MVC框架,有助于在Web层提升应用的松耦合水平。
除了面向用户的Web应用,该模块还提供了多种构建与其他应用交互的远程调用方案。Spring远程调用功能集成了RMI(Remote Method Invocation)、Hessian、Burlap、JAX-WS,同时Spring还了一个远程调用框架:HTTP invoker。Spring还提供了暴露和使用REST API的良好支持。

Instrumentation

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

测试

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


1.3.2 Spring Portfolio

事实上,Spring远不是Spring框架所下载的那些。整个SpringPortfolio包括多个构建于核心Spring框架之上的框架和类库。概括地讲,整个Spring Portfolio几乎为每一个领域的Java开发都提供了Spring编程模型。

Spring Web Flow

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

Spring Web Service

虽然核心的Spring框架提供了将Spring bean以声明的方式发布为WebService的功能,但是这些服务是基于一个具有争议性的架构(拙劣的契约后置模型)之上而构建的。这些服务的契约由bean的接口来决定。 Spring Web Service提供了契约优先的Web Service模型,服务的实现都是为了满足服务的契约而编写的。

Spring Security(Spring安全机制)

安全对于许多应用都是一个非常关键的切面。利用Spring AOP,Spring Security为Spring应用提供了声明式的安全机制。
你将会在第9章看到如何为应用的Web层添加Spring Security功能。同时,我们还会在第14章重新回到Spring Security的话题,学习如何保护方法调用。

Spring Integration(Spring批处理)

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

Spring Data

Spring Data使得在Spring中使用任何数据库都变得非常容易

尽管关系型数据库统治企业级应用多年,但是现代化的应用正在认识到并不是所有的数据都适合放在一张表中的行和列中。一种新的数据库种类,通常被称之为NoSQL数据库 [2] ,提供了使用数据的新方法,这些方法会比传统的关系型数据库更为合适。

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

我们将会在第11章看到如何使用Spring Data简化Java Persistence API(JPA)开发,然后在第12章,将相关的讨论拓展至几种NoSQL数据库。

Spring Social

社交网络是互联网领域中新兴的一种潮流,越来越多的应用正在融入社交网络网站,例如Facebook或者Twitter。这是Spring的一个社交网络扩展模块。
Spring Social更多的是关注连接(connect),而不是社交(social)。它能够帮助你通过REST API连接Spring应用,其中有些Spring应用可能原本并没有任何社交方面的功能目标。

Spring Mobile

移动应用是另一个引人瞩目的软件开发领域。智能手机和平板设备已
成为许多用户首选的客户端。Spring Mobile是Spring MVC新的扩展模
块,用于支持移动Web应用开发。

Spring for Android

与Spring Mobile相关的是Spring Android项目。这个新项目,旨在通过Spring框架为开发基于Android设备的本地应用提供某些简单的支持。最初,这个项目提供了Spring RestTemplate的一个可以用于Android应用之中的版本。它还能与Spring Social协作,使得原生应用可以通过REST API进行社交网络的连接。

Spring Boot

Spring极大地简化了众多的编程任务,减少甚至消除了很多样板式代码,如果没有Spring的话,在日常工作中你不得不编写这样的样板代码。
Spring Boot是一个崭新的令人兴奋的项目,它以Spring的视角,致力于简化Spring本身。
Spring Boot大量依赖于自动配置技术,它能够消除大部分(在很多场景中,甚至是全部)Spring配置。它还提供了多个Starter项目,不管你使用Maven还是Gradle,这都能减少Spring工程构建文件的大小。


1.4 Spring的新功能

1.4.1 Spring 3.1新特性

主要聚焦于功能的改善和增强。

  • 为了解决各种环境下(如开发、测试和生产)选择不同配置的问题,Spring 3.1引入了环境profile功能。借助于profile,就能根据应用部署在什么环境之中选择不同的数据源bean
  • 在Spring 3.0基于Java的配置之上,Spring 3.1添加了多个enable注解,这样就能使用这个注解启用Spring的特定功能;
  • 添加了Spring对声明式缓存的支持,能够使用简单的注解声明缓存边界和规则,这与你以前声明事务边界很类似;
  • 新添加的用于构造器注入的c命名空间,它类似于Spring 2.0所提供的面向属性的p命名空间,p命名空间用于属性注入,它们都是非常简洁易用的;
  • Spring开始支持Servlet 3.0,包括在基于Java的配置中声明Servlet和Filter,而不再借助于web.xml;
  • 改善Spring对JPA的支持,使得它能够在Spring中完整地配置JPA,不必再使用persistence.xml文件。

对Spring MVC的功能增强:

  • 自动绑定路径变量到模型属性中;
  • 提供了@RequestMappingproduces和consumes属性,用于匹配请求中的Accept和ContentType头部信息;

1.4.2 Spring 3.2新特性

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

Spring MVC 3.2带来了如下的功能提升:

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

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

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

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

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

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

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

  • RestTemplate和@RequestBody的参数可以支持范型;

  • RestTemplate和@RequestMapping可以支持HTTP PATCH方法;

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

还有Spring 3.2中几项最为有意思的新特性:

  • @Autowired、@Value和@Bean注解能够作为元注解,用于创建自定义的注入和bean声明注解;
  • @DateTimeFormat注解不再强依赖JodaTime。如果提供了JodaTime,就会使用它,否则的话,会使用SimpleDateFormat;
  • Spring的声明式缓存提供了对JCache 0.5的支持;
  • 支持定义全局的格式来解析和渲染日期与时间;
  • 在集成测试中,能够配置和加载WebApplicationContext;
  • 在集成测试中,能够针对request和session作用域的bean进行测
    试。

1.4.3 Spring 4.0新特性

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

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

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

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

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

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

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

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

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


1.5 小结

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

Spring实战 第1章 Spring之旅相关推荐

  1. 《Spring实战》第一章 — Spring之旅

    2019独角兽企业重金招聘Python工程师标准>>> 1.1 使用Spring简化Java开发 为了降低Java开发,Spring使用了一下4种关键策略: 基于POJO的轻量级和最 ...

  2. Spring实战第七章

    一.SpringMVC配置代替方案 1自定DispatcherServlet 按照AbstractAnnotationConfigDispatcherServletInitializer的定义,它会创 ...

  3. Spring实战(前言:Spring容器)

    Spring容器,顾名思义是用来容纳东西的,装的就是Bean.Spring容器负责创建.配置.管理Bean.spring容器有两个核心接口:BeanFactory和ApplicationContext ...

  4. 《Spring实战》第二章读书笔记

    装配Bean 定义表演者(Performer)接口,含有一个表演(Perform)方法: package com.springinaction.springidol;public interface ...

  5. 【Spring实战】注入非Spring Bean对象

    2019独角兽企业重金招聘Python工程师标准>>> 大家经常用到Spring IOC去管理对象之间的依赖关系,但一般情况下都有一个前提:这些Bean对象必须是通过Spring容器 ...

  6. Spring实战(三)Spring中装配Bean的三种方式---XML、JavaConfig、AutoWire

    创建应用对象之间协作关系的行为称为装配(wiring),这也是依赖注入的本质. Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,而开发者需要告诉Spring需要创建哪些 ...

  7. Spring实战(十三)Spring事务

    1.什么是事务(Transaction)? 事务是指逻辑上的一组操作,要么全部成功,要么全部失败. 事务是指将一系列数据操作捆绑成为一个整体进行统一管理.如果某一事务执行成功,则该事务中进行的所有数据 ...

  8. 《Spring实战》读书笔记-第4章 面向切面的Spring

    <Spring实战>是学习Spring框架的一本非常经典的书籍,之前阅读了这本书,只是在书本上写写画画,最近整理了一下<Spring实战>的读书笔记,通过博客的方式进行记录分享 ...

  9. 《Spring实战》读书笔记-第3章 高级装配

    <Spring实战>是学习Spring框架的一本非常经典的书籍,之前阅读了这本书,只是在书本上写写画画,最近整理了一下<Spring实战>的读书笔记,通过博客的方式进行记录分享 ...

最新文章

  1. MOSFET驱动器汇总 : 单个N-CHANNEL,半桥,全桥,3项桥
  2. 如何检测过期的统计信息(转)
  3. 语言中能产生汉明窗吗_相声遇见“二次元”观众买账吗?
  4. dotNet 5 中执行 Node.js
  5. 【docker系列】docker之部署springboot项目
  6. webpack4.0各个击破(5)—— Module篇
  7. Mac触发角锁屏不睡眠
  8. express 设置handlebars模板引擎
  9. FPGA简单实现数据过采样
  10. w10恢复出厂设置_笔记本电脑w10怎么恢复出厂设置
  11. STM32利用AES加密数据、解密数据
  12. 多功能纺织品易燃性测试仪市场现状及未来发展趋势
  13. GBA火焰纹章改版-智慧的结晶
  14. aosp_003.adb
  15. linux怎样通过手机上网,Linux系统通过手机GPRS上网的设置教程
  16. 《C++ Templates》笔记 Chapter 12 Fundamentals in Depth-Chapter 13 Names in Templates
  17. 衡水中学的《凉凉》 警醒自己
  18. FCPX插件:56种高动态HDR视频调色预设HDR Look Effects
  19. java基础知识问题导航
  20. 2021年偃师一高高考成绩查询,2021洛阳市地区高考成绩排名查询,洛阳市高考各高中成绩喜报榜单...

热门文章

  1. oracle取整函数 kettle,怎样使用Kettle生成随机样本数据
  2. 3个必看的常见问题解答页面示例,帮您重做产品FAQ页面F
  3. 【优化求解】基于蝗虫算法(MOGOA)求解多目标问题matlab源码
  4. 第3章--Linux内核及内核编程
  5. 调试串口导致烧录失败
  6. ads1258_ADS1258高精度多通道模/数转换芯片
  7. 按位取反的概念和计算方法
  8. c语言之动静态链接库
  9. 用例规约初版(希望大家进来修改一下)
  10. hitTest:(CGPoint)point withEvent:(UIEvent *)event