Spring是Rod Johnson在2004年推出的一个轻量级框架。对Java EE 系统框架臃肿、低效、脱离现实的种种现状提出了质疑,并积极寻求探索革新之道。
spring 1.x时代
在这个时代,spring的IOC容器与aop编程都是通过xml文件实现的。显然,当项目不断的扩大时,xml配置文件会越来越多,xml配置文件的管理会成为一件麻烦的工作。有的朋友就奇怪了,注解也不难啊,咋那时没有推出注解功能呢?
这就得翻翻历史看看了,2004年的时候,jdk1.5都还没推出呢,我们知道注解是jdk1.5开始支持的。也就是当时jdk都还没支持注解呢,所以那时spring不支持注解也就不奇怪了。
spring 2.xml
随着jDK1.5带来的注解支持,Spring2.x可以使用注解对Bean进行申明和注入,大大的减少了xml配置文件,同时也大大简化了项目的开发。
.Spring3.x到Spring4.x
从Spring3.x开始提供了Java配置方式,使用Java配置方式可以更好的理解你配置的Bean,现在我们就处于这个时代,并且Spring4.x和Spring boot都推荐使用Java配置的方式。
那么我们开发中,到底使用xml还是注解还是Java配置方式呢?
个人觉得:
应用的基本配置可以用xml,比如:数据源、资源文件等
业务开发使用注解:如:service的bean
Java配置方式也是不错的方式,可以替代xml做基本的配置,但应该把静态资源数据抽取到资源文件里去,避免修改配置时需要修改源码。
Spring各个版本新特性
Spring3.1新特性
- 1.添加了引入环境profile功能
- 2.添加了@enable注解,使用特定功能
- 3.添加了对声明式缓存的支持,能够使用简单的注解声明缓存边界和规则
- 4.添加的用于构造器注入的c命名空间,类似与Spring2的p命名空间,用于对应属性注入
- 5.开始支持Servlet3.0,包括基于java配置中生命Servlet和Filter,不再只仅仅借助web.xml
- 6.改善对于JPA的支持,让JPA能在Spring中完整配置JPA,不必再使用persistence.xml文件
- 7.自动绑定路径变量到模型属性中
- 8.提供了@RequestMappingProduces和consumes属性,用于匹配请求中的Accept和Content-Type头部信息
- 9.提供了@RequestPart注解,用于将Multipart请求中的而某些部分绑定到处理器的方法参数中
- 10.持Flash属性,在redirect请求后依然能够存活的属性,flash属性的RedirectAttribute类型
- 11.为支持原生的EntityManager,Spring的JpaTemplate和JpaDaoSupport类已被废弃了来支持JPA 2.0,并在spring4中移除了
Spring3.2版本
- 1.@Autowired.@Value和@Bean注解能够作为元注解,用于创建自定义的注入和bean声明注解
- 2.@DateTimeFormat注解不再依赖JodaTime.如果提供了JodaTime,就会使用它,否则的话,会使用SimpleDateFormat;
- 3.Spring的声明式缓存提供了对JCache0.5的支持
- 4.支持定义全局的格式来解析和渲染日期和时间
- 5.在集成测试中,能够配置和加载WebApplicationContext
- 6.在集成测试中,能够针对request和session作用域的bean进行测试
Spring4.0版本
- 1.Spring提供了对WebSocket编程的支持,包括支持JSR-356--Java API for WebSocket
- 2.鉴于WebSocket仅仅提供了一种低层次的API,急需高层次的抽象,因此Spring4.0在WebSocket之上提供了一个高层次的面向消息的编程模型,
- 该模型基于SockJS,并且包含了对STOMP协议的支持
- 3.新的消息模块,很多的类型来源于Spring Integration项目。这个消息模块支持Spring的SockJS/STOMP功能,同时提供了基于模板的方式发布消息
- 4.Spring是第一批支持Java8特性的Java框架,比如它所支持的lambda表达式,别的暂且不说,这首先能够让使用特定的毁掉接口更加简洁,代码更加易读
- 5.与Java8 同时得到支持的是JSR-310--Date与Time API,在处理时间和日期时,他为开发者提供了java.util.Date或java.util.Calendar更丰富的API
- 6.为Groovy开发的应用程序提供了更加顺畅的编程体验,尤其是支持非常便利地完全采用Groovy开发Spring应用程序。随这些一起提供的是来自于Grails
- 的BeanBuilder,借助它能够通过Groovy配置Spring应用
- 7.添加了条件化创建bean的功能,在这里只有开发人员定义的条件满足时,才会创建所声明的bean
- 8.Spring4.0包含了Spring RestTemplate的一个新的异步实现,它会立即返回并且允许在操作完成后执行回调
- 9.添加了对多项JEE规范的支持,包括JMS2.0.JTA1.2.JPA2.1和Bean Validation1.1
Spring 5.0 基于 Java 8
这么说的意思是,Spring 的源代码已经是以 Java 8 的语法来重新写过了!这可是相当大的变更,可以说是核心层面的重写。你可以在 Spring 的源码中看到很多:
这样相比 Spring 4.x 更能充分利用 Java 8 的潜力。
日志记录
Spring 5.0 使用自己的 spring-jcl
模块来记录日志,这个模块会自动识别并使用现有的日志框架。
Bean 扫描
当项目非常大的时候,Spring 的扫描过程会导致很长的启动时间。在这个版本开始,你可以使用 META-INF/spring.components
文件来直接指定要注册哪些类。这种方式对于小的项目(比如说少于 200 个 bean)来说可能改善不是很明显,但对大项目来说帮助非常大。
反应式编程模型
Spring 5.0 新增了一个名为 Spring WebFlux 的反应式(Reactive)模型,与现有的 Spring MVC 并存,而它的并发承载能力可以说是高了数倍不止。注意 Spring WebFlux 和 Servlet 是不兼容的。
反应式编程模型属于比较新的东西,随着时间推移,Spring 的其他项目(如 Spring Data、Spring Security、Spring Integration 等)也会陆续加入对反应式编程模型的支持。
但是在数据库操作方面,反应式编程模型还不够成熟,因为 JDBC 规格本身仍然是阻塞式的。
单元测试
因为 JUnit 5 已经适配 Java 8,所以 Spring 5 也对 JUnit 5 做出了相应的适配,对测试进行启用和禁用更加方便,并发测试也更容易。
依赖库
Spring 5.0 的一些依赖关系也做了更新:
- Jackson 2.6+
- EhCache 2.10+ / 3.0 GA
- Hibernate 5.0+
- JDBC 4.0+
- XmlUnit 2.x+
- OkHttp 3.x+
- Netty 4.1+