Spring从入门到精通(一)

本章主要是Spring框架的概述与整体介绍,对于Spring比较熟悉的朋友可以跳过。

一、Spring概述

Spring是一个优秀的开源框架,它为更容易而又快捷地开发java应用程序提供了全面的基础设施。

下面是百度百科关于其起源的介绍

Spring的形成,最初来自Rod Jahnson所著的一本很有影响力的书籍《Expert One-on-One J2EE Design and Development》,就是在这本书中第一次出现了Spring的一些核心思想,该书出版于2002年。另外一本书《Expert One-on-One J2EE Development without EJB》,更进一步阐述了在不使用EJB开发JAVA EE企业级应用的一些设计思想和具体的做法。

Spring在Rod Jahnson著书阐述之后,于 2003 年 6 月首次在 Apache 2.0 许可下发布。之后经过10多年的发展已经非常成熟并基于Spring延伸出了SpringBoot、SpringCloud等优秀的开源框架。通过访问其官网(https://spring.io/)可以看到首页有一个动态展现Spring的出现使得java开发会如何的一些介绍。

Spring从入门到精通(一)_第1张图片

点击“WHY SPRING”,我们可以看到官网的介绍:

Spring makes programming Java quicker, easier, and safer for everybody. Spring’s focus on speed, simplicity, and productivity has made it the world's most popular Java framework.

使用本人非常一般的英语翻译过来的话大意是:

Spring使得每一个人在使用Java编程都更快、更容易、更安全。Spring对速度、简单性和生产力的关注使其成为世界上最流行的Java框架。

下面还有一段话:

“We use a lot of the tools that come with the Spring framework and reap the benefits of having a lot of the out of the box solutions, and not having to worry about writing a ton of additional code—so that really saves us some time and energy.”

大意是:

“我们使用了许多Spring框架附带的工具,并从拥有大量开箱即用的解决方案中获益,而不必担心编写大量额外的代码--因此这确实为我们节省了一些时间和精力。“

说白了,就是说我们不想造轮子了,别人有些东西写的很好,我们使用起来非常方便。

然后就是官网的另一大介绍:

Spring从入门到精通(一)_第2张图片

简单来说就是:Spring可以干什么。

说了很多,基本就是:微服务、反应性、云、网络应用、无服务器、事件驱动、批量等。

当然,上面说的东西其实已经涉及到SpringBoot、SpringCloud了。本系列文章只介绍Spring框架。

上面都是一些闲扯的话,百度百科上可能说的更详细,比如,Spring的初衷、Spring的目标等,当然有一个可以粘贴来供大家了解一下:

Spring的基本组成:

1、最完善的轻量级核心框架。

2、通用的事务管理抽象层。

3、JDBC抽象层。

4、集成了Toplink, Hibernate, JDO, and iBATIS SQL Maps。

5、AOP功能。

6、灵活的MVC Web应用框架。

其实简单说来就是,轻量级、事务管理、对JDBC的抽象、集成了其他优秀框架、AOP和IOC(这两者是Spring的核心),另外还有一点就是非侵入式。关于侵入式与非侵入式,下面一段文字介绍非常清楚,忘记从那篇文章拷贝来的,如有朋友清楚,可以告知,一定加上原作者的地址与介绍:

这里解释一下Spring中的侵入式和非侵入式。简单的说,假设我们想把一些业务代码放到一个框架里。侵入式的做法是要求业务代码”知道”框架的代码,表现为业务代码需要继承框架提供的类,才能很好的和框架结合,使用框架带来的便利。非侵入式则不需要业务代码引入框架代码的信息,即无需继承框架提供的类,从编写者的角度来看,察觉不到框架的存在。例如:使用struts的时候,我们需要继承一些struts的类,这时struts侵入到了我的业务代码里。使用spring编写一些业务类的时候不需要继承spring特定的类,通过配置完成依赖注入后就可以使用,此时,spring就没有侵入到我的代码里。侵入式让业务代码产生对框架的依赖,这些代码不能再框架外使用,不利于代码的复用。但是侵入式可以使用户和框架更好的结合,更容易更充分的利用框架提供的功能。非侵入式的代码对框架则没有过多的依赖,可以很方便的迁移到其他地方使用,代码的复用性较好。但是框架和业务代码互动的方式可能就比较复杂。总之,这两种方式各有千秋,各有利弊,主要看实际开发时的权衡选择了。

   那么非侵入式的技术体现,即允许在应用系统中自由选择和组装Spring框架的各个功能模块,并且不强制要求应用系统的类必须继承或实现Spring框架的类和接口来达到使用框架的目的。

  如何实现非侵入式:

    1.引用反射机制,通过动态调用的方式来提供各方面的功能,建立核心组件BeanFactory

    2.配合使用Spring框架中的BeanWrapper和BeanFactory组件类最终达到对象的实例创建和属性注入

  其实,非侵入式就是不需要继承框架提供的类,而是通过配置完成依赖注入后,就可以使用。允许所开发出来的应用系统能够在不同的环境中自由移植,不需要修改应用系统中的核心代码。

总结一下:

1.轻量:Spring是轻量的,基本的版本大约为2MB;

2.控制反转:Spring通过控制反转实现了松散耦合,对象给出它们的依赖,而不是创建或查找依赖的对象们;

3.面向切面编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开;

4.容器:Spring包含并管理应用中对象的生命周期和配置;

5.MVC框架:Spring的web框架是个精心设计的框架,是web框架的一个很好的替代品;

6.事务管理:Spring提供了持续的事务管理接口,可以扩展到上至本地事务,下至全局事务(JTA);

7.异常处理:Spring提供方便的API把具体技术相关的异常(比如由JDBC、Hibernate或者JDO抛出的)转化为一致的unchecked异常。

二、Spring的核心模块

Spring核心容器:该层基本上是Spring Framework的核心。它包含一下模块:

Spring Core

Spring Bean

SPEL(SpringExpression Language)

Spring Context

数据访问/集成 — 该层提供与数据库交互的支持。它包含一下模块:

JDBC(Java DataBase Connectivity)

ORM(Object Relational Mapping)

OXM(Object XML Mappers)

JMS(Java Messaging Service)

Transction

Web — 该层提供了创建Web应用程序的支持。它包含以下模块:

Web

Web — Servlet

Web — Socket

Web — Portlet

AOP

该层支持面向切面编程

Instrumentation

该层为类检测和类加载器实现提供支持。

Test

该层为使用JUnit和TestNG进行测试提供支持。

几个复杂模块:

Messaging — 该模块为STOMP提供支持。它还支持注解编程模型,该模型用于从WebSocket客户端路由和处理STOMP消息。

Aspects — 该模块为与AspectJ的集成提供支持。

Spring从入门到精通(一)_第3张图片

三、Spring的发展史

介绍一个东西,如果没有起源,就谈不上发展,更谈不上未来。下面我们简单介绍一下Spring的发展史,也就是Sring的版本更迭。

简述:

  • 2004 年 03 月,1.0 版发布。
  • 2006 年 10 月,2.0 版发布。
  • 2007 年 11 月,更名为 SpringSource,同时发布了 Spring 2.5。
  • 2009 年 12 月,Spring 3.0 发布。
  • 2013 年 12 月,Pivotal 宣布发布 Spring 框架 4.0。
  • 2017 年 09 月,Spring 5.0 发布。
  • 目前:5.2.8 CURRENT GA,也是目前的稳定版,截至2020年08月10日

关于GA、PRE、SNAPSHOT的区别:

GA:General Availability,正式发布的版本,官方推荐使用此版本。在国外都是用GA来说明release版本的;

PRE:预览版,内部测试版.,主要是给开发人员和测试人员测试和找BUG用的,不建议使用;

SNAPSHOT: 快照版,可以稳定使用,且仍在继续改进版本。

下面的资料来源:

https://www.cnblogs.com/yugb/p/9537446.html

1.Sping 1.0,发布时间:2004年3月24 

在Sping 1.X 时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在Java类和xml文件中切换。2004年的jdk1.5都还没推出,我们知道注解是jdk1.5开始支持的。也就是当时jdk都还没支持注解,所以那时spring不支持注解也就不奇怪了。为了解决bean的配置越来越多的情况下减轻xml文件的处理.spring2.0就诞生了。

2.Sping 2.0,发布时间:2006年10月3日,Sping 2.5 发布时间:2007年11月19

随着jdk1.5带来的注解支持,Spring2.x可以使用注解对bean进行申明和注入,大大的减少了xml配置,简化了项目的开发,但是并没语完全解决xml冗余的问题。

最佳的配置方法:

1.应用的基本配置用xml,如数据源、资源文件等;

 2.业务开发用注解,如service中注入bean等。

3.Sping 3.0 发布时间:2009年12月16日

在spring3.x版本的时候开始提供了Java配置方式,使用Java配置方式可以更好的理解你配置的Bean,使用spring提供的java注解来取代曾经xml配置,spring变得前所未有的简单。主要区别spring2.x的地方如下:

  1. 核心API更新到JAVA5.0,即采用了泛型;

  2. Spring表达式语言SpEl(Express Language);



    
    

3.可通过Java类提供IOC配置信息

XML配置方式,基于注解的配置方式,Spring3.0提供了基于Java类的配置方式。而最新基于Java类的配置方式非常灵活。

4. 通用类型转换系统和属性格式化系统;

5.数据访问层新增oxm(Object to xml,对象xml映射):通过元数据对象和xml转化的映射;

6.web层的增强:2.5版本中的注解如:@Controller,@Request Mapping等。新增了@CookieValue,@RequestHeaders

4.Spring 4.0  发布时间:2013年11月1日

4.X 时代我们甚至连xml配置文件都不需要了,完全使用java源码级别的配置与spring提供的注解就能快速的开发spring应用程序,但仍然无法改变Java Web应用程序的运行模式,我们仍然需要将war部署到Web Server 上,才能对外提供服务。能否运行一个简单的main()方法就能启动一个Web Server 呢?Spring Boot满足了我们的这种需求。

Spring4.X主要提供了对WebSocket编程的支持。鉴于WebSocket提供了一种低层次的API,急需高层次的抽象,因此Spring4.0在WebSocket之上提供了一个 高层次的面向消息的编程模型,该模型基于SockJS,并且包含了对STOMP协议的支持。从spring4.x和springboot都推荐使用Java配置方式。

在实际开发中我们可以看到,如果是一些传统行业,比如银行之类的项目,如果还在使用Spring的话,依然会有很多xml配置文件。实际上xml配置文件也有很多优势,尤其是对于一些不怎么会变化的资源。总结起来就是:

应用的基本配置等使用xml,比如:数据源、连接池、Redis配置、Kafka配置、Zookpeer配置等;

业务相关的bean可以使用注解,比如我们最常使用的就是:@Service、@Autowired等。

5.Spring 5.0 发布时间:2017年9月28日

Spring Framework 5.0的最大特点之一是响应式编程(Reactive Programming)。 响应式编程核心功能和对响应式endpoints的支持可通过Spring Framework 5.0中获得。Spring Framework 5.0遵守JDK 8和Java EE 7规范。 基本上,这意味着以前的JDK和Java EE版本不再受支持了。

  • 常规升级
  • 对JDK 9运行时兼容性
  • 在Spring Framework代码中使用JDK 8特性
  • 响应式编程支持
  • 函数式Web框架
  • Jigsaw的Java模块化
  • 对Kotlin支持
  • 舍弃的特性

5.X详细介绍请参考:https://www.jianshu.com/p/cebc3cf0bec0

完整介绍请参考:Spring版本时间(更新)

或者访问官网,使用:https://spring.io/blog/,并在后面加上年月日,比如:https://spring.io/blog/2017/09/28,英文不好的可以的朋友可以使用浏览器自带的翻译功能。

至此,Spring的基本介绍就结束了,欢迎阅读下一篇。

你可能感兴趣的:(Java,spring,java)