一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情。
Spring的历史
2002 年 10 月,Rod Johnson 撰写了一本名为 《Expert One-on-One J2EE》 设计和开发的书。本书由 Wrox出版,介绍了当时 Java 企业应用程序开发的情况,并指出了 Java EE 和 EJB 组件框架中的存在的一些主要缺陷。在这本书中,他提出了一个基于普通 Java 类和依赖注入的更简单的解决方案。
此书发布后不久,开发者 Juergen Hoeller 和 Yann Caroff 说服 Rod Johnson 创建一个基于基础结构代码的开源项目。这个项目就是Spring,Rod,Juergen 和 Yann 于 2003 年 2 月左右开始合作开发该项目 。Yann 为新框架创造了“Spring”的名字。
| 版本 | 发布时间 | 消息及特点 |
|---|---|---|
| 1.0 | 2004年3月24日 | Spring 1.0只包含一个完整的项目,他把所有的功能都集中在一个项目中,其中包含了核心的Ioc、AOP,同时也包含了其他的诸多功能,例如:JDBC、Mail、ORM、事务、定时任务、Spring MVC等。 |
| 2.0 | 2006 年 10 月 | Spring 2.0 具有可扩展的 XML 配置功能,用于简化 XML 配置,支持 Java 5,额外的 IoC 容器扩展点,支持动态语言。 |
| 2.5 | 2007 年 11 月 | Spring 2.5 中的主要新功能包括支持 Java 6 / Java EE 5,支持注释配置,classpath 中的组件自动检测和兼容 OSGi 的 bundle。 |
| 3.0 | 2009 年 12 月 | Spring 3.0 具有许多重要特性,如重组模块系统,支持 Spring 表达式语言,基于 Java 的 bean 配置(JavaConfig),支持嵌入式数据库(如 HSQL,H2 和 Derby),模型验证/ REST 支持和对 Java EE 的支持。 |
| 3.x | 2011 年到2012 年 | 2011 年和 2012 年发布了许多 3.x 系列的小版本。2012 年 7 月,Rod Johnson 离开了团队。2013 年 4月,VMware 和 EMC 通过 GE 投资创建了一家名为 Pivotal 的合资企业。所有的 Spring 应用项目都转移到了 Pivotal。 |
| 4.0 | 2013 年 12 月 | Spring 4.0 是 Spring 框架的一大进步,它包含了对Java 8 的全面支持,更高的第三方库依赖性(groovy 1.8+,ehcache 2.1+,hibernate 3.6+等),Java EE 7 支持,groovy DSL for bean 定义,对 websockets 的支持以及对泛型类型的支持作为注入 bean 的限定符。 |
| 4.x | 2014 年至 2017 年 | 2014 年至 2017 年期间发布了许多 Spring 框架 4.xx 系列版本。 |
| 5.0 | 2017年9月28日 | Spring 5.0开始支持JDK 8和Java EE 7,同时兼容JDK9。全面支持Servlet 3.1,还引入了一个全新的模块Spring WebFlux用于替代老话的 spring-webmvc;对Kotlin也有了更好的支持。 |
| 6.0 | 2022年第四季度 | spring 6 将会重构内部架构,以适应 graal 的 aot 的要求,同时把最低java版本要求改为17另外 spring boot 3 也将要求最低 java 版本为 17同时Spring小组也承诺会持续维护Spring5和Springboot 2.x |
spring的出现也了解决之前繁琐的EJB规范,java bean的演化
- 在java1996年发布,当年12月即发布了java bean1.00-A,有什么用呢?通过统一的规范可以设置对象的值(get,set方法),这是最初的java bean;
- 在实际企业开发中,需要实现事务,安全,分布式,javabean就不好用了.sun公司就开始往上面堆功能,这里java bean就复杂为EJB;
- EJB功能强大,但是太重了.此时出现DI(依赖注入),AOP(面向切面)技术,通过简单的java bean也能完成EJB的事情,这里的java bean简化为POJO;
- Spring诞生了.
JavaBean
JavaBean是公共Java类,但是为了编辑工具识别,需要满足至少三个条件:
- 有一个public默认构造器(例如无参构造器,)
- 属性使用public 的get,set方法访问,也就是说设置成private,同时get,set方法与属性名的大小也需要对应。例如属性name,get方法就要写成,public String getName(){},N大写。
- 需要序列化。这个是框架,工具跨平台反映状态必须的
最近看,里面讲到JavaBean最初是为Java GUI的可视化编程实现的.你拖动IDE构建工具创建一个GUI 组件(如多选框),其实是工具给你创建java类,并提供将类的属性暴露出来给你修改调整,将事件监听器暴露出来.《java 编程思想(第四版)》p823-824
EJB
在企业开发中,需要可伸缩的性能和事务、安全机制,这样能保证企业系统平滑发展,而不是发展到一种规模重新更换一套软件系统。 然后有提高了协议要求,就出现了Enterprise Bean。
EJB在javabean基础上又提了一些要求,当然更复杂了。
POJO
有个叫Josh MacKenzie人觉得,EJB太复杂了,完全没必要每次都用,所以发明了个POJO,POJO是普通的javabean,什么是普通,就是和EJB对应的。
总之,区别就是,你先判断是否满足javabean的条件,然后如果再实现一些要求,满足EJB条件就是EJB,否则就是POJO。
Spring最根本的理念就是简化JAVA开发
为了降低JAVA开发的复杂性,Spring有以下四种关键策略:
- 基于POJO的轻量级和最小侵入性编程;
- 通过依赖注入和面向接口实现松耦合;
- 基于切面和惯例进行声明式编程;
- 通过切面和模板减少样板式代码。
Spring认为所有的组件都应该放到IOC的容器中,组件之间的关系通过容器进行自动装配,也就是依赖注入
注解:
@Configuration 代表配置类,等比与之前的xml文件
@Bean代表注入此方法,等比xml文件中的bean标签
@ComponentScan() 指定扫描的包,等比xml文件中的context:component-scan标签
ComponentScan里的属性excludeFilters是指定排除那些包
而includeFilters是只扫描那些包,并且需要配置属性useDefaultFilters为false
上面的type属性是指定按什么方式过滤,FilterType.ANNOTATION是以注解的方式,而还有好多属性