Spring简介及历史

Spring简介

Spring 在起源可以追溯到 Rod Johnson 于2002年出版的《Expert One-to-One J2EE Design and Development》一书 。在这本书中,Rod 展示了他的 interface21 框架,他为自己的应用编写了这一框架。这一框架被发布到开源世界后,组成了现在我们所知的 Spring 框架的基础。
Spring 在早期的 beta 和发布备选版本阶段进行得很迅速,第一个正式版本 1.0 在 2004 年 3 月 24 日 发布。Spring 是指一个用于构造 Java 应用程序的轻量级框架,这句话两层意思:

  • 首先,你可以采用 Spring 来构造任何程序,这和Apache Struts 这样的框架不同,仅仅被限定于WEB 应用
  • 其次,“轻量级”并不意味着类的数量很少,或者发行包尺寸很小。实际上,指的是Spring哲学原则——最少的侵入。

演进历史

Spring 0.9

这是该框架第一个公开发布的版本,以Exper One-on-One:J2EE Design and Development一书 为基础,提供了Bean配置基础、AOP支持、JDBC抽象框架、抽象事务支持等。该版本没有官方参考文档,但可以在SourceForge上找到源代码和文档。

Spring 1.x

Spring发布的第一个带有官方参考文档(从Spring 1.1.1开始)的版本。主要由七个模块组成
在这里插入图片描述

  • Core:框架的最基本部分,提供依赖注入使你可以管理Bean容器。
  • DAO:提供了JDBC抽象层,从而无需进行繁琐的JDBC编码和数据库特定错误代码的解析。JDBC包不仅为实现特殊接口的类,而且为所有POJO(普通Java对象)提供了一种编程以及声明式的事务管理。
  • Context:ApplicationContext、UI、验证、JNDI、Enterprise JavaBean(EJB)、远程处理和邮件支持。
  • ORM:为流行的对象关系映射API(包括JDO,Hibernate和iBatis)提供了集成支持。
  • AOP:提供AOP Alliance兼容的面向切面的编程实现。
  • Web:提供了基本的面向Web的集成功能,如:使用Servlet侦听器初始化上下文以及面向Web的应用程序上下文。
  • Web MVC:为Web应用程序提供了Model-View-Controller(MVC)实现。

Spring 2.x

在这里插入图片描述

  • 增加了对国际化(i18n),事件传播,资源加载以及通过Servlet容器透明创建上下文的支持。
  • 通过使用新的基于XML Schema的配置而不是DTO格式来简化XML配置。值得注意的改进方面包括bean定义、AOP以及声明式事务。
  • 用于Web和门户的新bean作用域(请求、会话和全局会话)。
  • 支持AOP开发的@AspectJ注解。
  • Java Persistence API(JPA)抽象层。
  • 完全支持异步JMS消息驱动的POJO(用于普通的旧Java对象)。
  • JDBC简化包括在使用Java5+时的SimpleJdbcTemplate。
  • JDBC命名参数支持(NamedParameterJdbcTemplate)。
  • 针对Spring MVC的表单标签库。
  • 对Porlet MVC框架的介绍。
  • 动态语言支持。可以使用JRuby、Groovy以及BeanShell来编写bean。
  • JMX中的通知支持以及可控的MBean注册。
  • 为调度任务而引入的TaskExecutor注册。
  • 为调度任务而引入的TaskExecutor抽象。
  • Java注解支持,特别针对@Transactional、@Required和@AspectJ。
Spring 2.5
  • 引入@Autowired 注解及对JSR-250注解(@Resource、@PostConstruct和PreDestroy)的支持。
  • 引入新的构造型注解:@Component、@Repository、@Service、和@Controller。
  • 自动类路径扫描支持,可以检测和连接带有构造型注解的类。
  • AOP更新,包括一个新的Bean切入点元素以及AspectJ加载时织入(weaving)。
  • 支持完整的WebSphere事务管理。
  • 除了SpringMVC@Controller注解,还添加了@RequestMapping、@RequestParam和@ModelAttribure注解,从而支持通过注解配置进行请求处理。
  • 支持Tiles2。
  • 支持JSF1.2。
  • 支持JAX-WS2.0/2.1。
  • 引入了Spring TestContext Framework,提供注解驱动和集成测试支持,不受所用测试框架的影响。

Spring 3.x

Spring 基于Java5的第一个版本,旨在充分利用Java5的功能,如泛型、可变参数和其他语言改进。该版本引入了基于Java的@Configuration模型。
在这里插入图片描述

  • 支持Java5功能,例如泛型、可变参数以及其他改进。
  • 对Callables、Futures、ExceutoService适配器和ThreadFactory集成提供很好的支持。
  • 框架模块目前针对每个模块JAR都使用一课源代码树进行分别管理。
  • Spring Expression Language(SpEL)的引入。
  • 核心Java Config功能和注解的集成。
  • 通用型转换系统和字段格式化系统。
  • 全面支持REST。
  • 新的MVC XML名称空间和其他注解,例如Spring MVC中的@CookieValue和@RequestHeaders。
  • 验证增强功能和JSR-303(bean验证)支持。
  • 对JavaEE6的早期支持,包括@Async/@Asynchronous注解、JSR303、JSF2.0、JPA2.0等。
  • 支持嵌入式数据库,例如HSQL、H2和Derby。

Spring 4.x

Spring第一个完全支持Java 8的版本。虽然仍然可以使用较旧版本的Java,但Java SE6已经提出了最低版本要求。启用的类和方法已经被删除,但模块组织几乎相同。
在这里插入图片描述

  • 从先前的Spring 3 版本中删除弃用的软件包和方法。
  • 支持Java8,将最低Java版本提高到6 update 18。
  • Java EE6 及以上版本现在被认为是Spring Framework 4.0的基准。
  • Groovy bean定义DSL,允许通过Goovy语法配置bean定义。
  • 核心容器、测试和一般web改进。
  • WebSocket、SocJS、和STOMP消息。

Spring 5.x

整个框架代码都基于Java 8,并且自2016年7月起与Java 9完全兼容。

  • 充分利用Java 8 的强大功能,从而在性能上得到极大的改进。
  • 支持Portlet、Veloctiy、JaspReports、XMLBeans、JDO、Guava、Tiles 2和Hibernate 3。
  • 现在XML 配置名称空间被流式传输到未版本化的模式;虽然特定版本的声明仍然被支持,但要针对最新的XSD架构进行验证。
  • Resource 抽象为防御 getFile 访问提供了isFile指示符。
  • Spring 提供的Filter实现完全支持Servlet 3.1签名。
  • 支持 Protobuf 3.0。
  • 支持JMS 2.0+和JPA 2.0+。
  • 引入了Spring Web Flow,这是一个用于替代Spring MVC的项目,构建在反应式基础之上,这意味着他完全是异步和非阻塞的,主要用户事件循环执行模型,而非传统的每个请求执行模式都带有一个线程的大型线程池(基于Project Reactor构建)。
  • Web 和核心模块适用于反应式编程模型。
  • Spring 测试模块有了很大的改进。现在支持JUnit 5,引入了新的注解来支持 Jupiter 编程和扩展模型,例如@SpringUnitConfig、@SpringJUnitWebConfig、@EnabledIf和@DisabledIf。
  • 支持在 Spring TestContext Framework 中实现并行测试执行。

Spring体系结构

在这里插入图片描述

Core Container(核心容器)

该模块主要包含Core、Beans、Context和SpEL模块。其中Core和Beans是整个框架最基础的部分,提供IOC和依赖注入特性。这里最重要的概念就是BeanFactory,提供了以Factory模式的实现来消除对程序性单例模式。

  • Core:模块主要包含Spring框架最基本的核心工具类,Core是其他组件的基础核心。
  • Beans:模块主要包含访问配置文件、创建/管理Bean以及IOC/DI相关的类。
  • Context:继承了Beans的特性,主要为Spring提供大量的扩展,如国际化、事件机制、资源加载等待。ApplicationContext接口是Context模块的关键。
  • SpEL:模块提供了一个强大的语言表达式。

AOP and Instrumentation

提供符合AOP Alliance标准的面向切面编程的实现,可以让你定义如方法拦截器和切点,从而降低程序之间的耦合性。

  • AspectJ模块提供了与AspectJ的集成 。
  • Instrumentation模块提供用于某些应用程序服务器的类工具支持和类加载器实现 。

Messaging

该模块具有来自Spring Integration项目的关键抽象,如Message,MessageChannel,MessageHandler等。它们构成基于消息的应用程序的基础。该模块还包括一组注释,用于将消息映射到方法,类似于基于Spring MVC注释的编程模型。

Data Access/Integration

数据访问/集成层由JDBC,ORM,OXM,JMS和事务模块组成。

  • JDBC模块提供了JDBC抽象层,从而无需进行繁琐的JDBC编码和数据库特定错误代码(不同数据代码可能不同)的解析。
  • 事务模块支持对实现特殊接口的类以及所有POJO(普通Java对象)进行编程和声明式事务管理。
  • 该模块为当前流行的ORM(包括JPA,JDO和Hibernate)提供了集成层。使用ORM模块,可以将所有这些O/R映射框架与Spring提供的所有功能结合使用,如前面提到的事务管理功能。
  • OXM模块提供了一个抽象层,该抽象层支持Object/ XML映射实现,例如JAXB,Castor,XMLBeans,JiBX和XStream。
  • JMS模块(Java Messaging Service)包含用于生成和使用消息的功能。从Spring Framework 4.1开始,提供了与Spring-Messaging模块集成。

Web

Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供上下文支持。该模块包含Web、WebMVC、Web Socket和Web-Porlet模块。

  • Web模块提供了基本的面向Web的集成功能,如文件上传功能以及使用Servlet监听器和面向Web的应用程序上下文对IoC容器的初始化。
  • WebMVC模块(也称为Web-Servlet模块)包含基于Spring的Model-View-Controller(MVC)支持和针对Web应用程序的Rest Web服务实现。
  • Web-Portlet 模块(也称为Web-Portlet模块)提供Portlet环境中的MVC实现。

Test

该模块支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试。

Spring模块依赖关系图

在这里插入图片描述

Spring5新特性

  • 整个框架的代码基于Java8
  • 通过使用泛型等特性提高可读性
  • 对Java8提高直接的代码支撑
  • 运行时兼容JDK9
  • Java EE 7API需要Spring相关的模块支持
  • 运行时兼容Java EE8 API
  • 取消了一些包、类和方法
    ○ 包 beans.factory.access
    ○ 包 dbc.support.nativejdbc
    ○ 模块移除了包mock.staicmock,不再提供AnnotationDrivenStaticEntityMockingControl支持
    ○ 许多不建议使用的类和方法在代码库中删除

核心特性

JDK8的增强:

  • 访问Resuouce时提供getFile或和isFile防御式抽象
  • 有效的方法参数访问基于Java 8反射增强
  • 在Spring核心接口中增加了声明default方法的支持一贯使用JDK7 Charset和StandardCharsets的增强
  • 兼容JDK9
  • Spring 5.0框架自带了通用的日志封装
  • 持续实例化via构造函数(修改了异常处理)
  • spring-jcl替代了通用的日志,仍然支持可重写
  • 自动检测log4j 2.x, SLF4J, JUL(java.util.Logging)而不是其他的支持
  • 访问Resuouce时提供getFile或和isFile防御式抽象
  • 基于NIO的readableChannel也提供了这个新特性

核心容器

  • 支持候选组件索引(也可以支持环境变量扫描)
  • 支持@Nullable注解
  • 函数式风格GenericApplicationContext/AnnotationConfigApplicationContext
  • 基本支持Bean API注册
  • 在接口层面使用CGLIB动态代理的时候,提供事物,缓存,异步注解检测
  • XML配置作用域流式
  • Spring WebMVC
  • 全部的Servlet 3.1 签名支持在Spring-provied Filter实现
  • 在Spring MVC Controller方法里支持Servlet4.0 PushBuilder参数
  • 多个不可变对象的数据绑定(Kotlin/Lombok/@ConstructorPorties)
  • 支持Jackson2.9
  • 支持JSON绑定API
  • 支持protobuf3
  • 支持Reactor3.1 Flux和Mono

SpringWebFlux

  • 新的Spring-webflux模块,一个基于Reactive的Spring-webmvc,完全的异步非阻塞,旨在使用enent-loop执行模型和传统的线程池模型。
  • Reactive说明在spring-core比如编码和解码。
  • Spring-core相关的基础设施,比如Encode 和Decoder可以用来编码和解码数据流;DataBuffer 可以使用java ByteBuffer或者Netty ByteBuf;ReactiveAdapterRegistry可以对相关的库提供传输层支持。
  • 在Spring-web包里包含HttpMessageReade和HttpMessageWrite。

测试方面的改进

  • 完成了对JUnit 5’s Juptier编程和拓展模块在Spring TestContext框架。
  • SpringExtension:是JUnit多个可拓展API的一个实现,提供了对现存Spring TestContext Framework的支持,使用@ExtendWith(SpringExtension.class)注解引用。
  • @SpringJunitConfig:一个复合注解。
  • @ExtendWith(SpringExtension.class) 来源于Junit Jupit。
  • @ContextConfiguration 来源于Srping TestContext框架。
  • @DisabledIf 如果提供的该属性值为true的表达或占位符,信号:注解的测试类或测试方法被禁用。
  • 在Spring TestContext框架中支持并行测试。
  • 具体细节查看Test 章节 通过SpringRunner在Sring TestContext框架中支持TestNG, Junit5,新的执行之前和之后测试回调。
  • 在testexecutionlistener API和testcontextmanager新beforetestexecution()和aftertestexecution()回调。MockHttpServletRequest新增了getContentAsByteArray()和getContentAsString()方法来访问请求体。
  • 如果字符编码被设置为mock请求,在print()和log()方法中可以打印Spring MVC Test的redirectedUrl()和forwardedUrl()方法支持带变量表达式URL模板。
  • XMLUnit 升级到了2.3版本。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值