Hey, Nice to meet You. 

必有过人之节.人情有所不能忍者,匹夫见辱,拔剑而起,挺身而斗,此不足为勇也,天下有大勇者,猝然临之而不惊,无故加之而不怒.此其所挟持者甚大,而其志甚远也.          ☆☆☆所谓豪杰之士,

Spring详解(一)----Spring框架介绍

1、Spring的简介

Spring的英文翻译为春天,可以说是给Java程序员带来了春天,因为它极大的简化了开发。我得出一个公式:Spring = 春天 =  Java程序员的春天 = 简化开发。最后的简化开发正是Spring框架带来的最大好处。

Spring是一个开放源代码的设计层面框架,它是于2003 年兴起的一个轻量级的Java 开发框架由Rod Johnson创建,其前身为Interface21框架,后改为了Spring并且正式发布。Spring是为了解决企业应用开发的复杂性而创建的。它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。Spring 的理念:不去重新发明轮子。其核心是控制反转(IOC)和面向切面(AOP)。

2、Spring的起源与发展

在2002年10月,由Rod Johnson 编著的书名为《Expert One-to-One J2EE Design and Development》一书中,对Java EE 系统框架臃肿、低效、脱离现实的种种现状提出了质疑,并阐述了 J2EE 使用 EJB 开发设计的优点及解决方案,他提出了一个基于普通 Java 类和依赖注入的更简单的解决方案。然后以此书为指导思想,他编写了interface21框架,这是一个力图冲破J2EE传统开发的困境,从实际需求出发,着眼于轻便、灵巧,易于开发、测试和部署的轻量级开发框架。Spring框架即以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日,发布了1.0正式版。同年他又推出了一部堪称经典的力作《Expert one-on-one J2EE Development without EJB》,该书在Java世界掀起了轩然大波,不断改变着Java开发者程序设计和开发的思考方式。在该书中,作者根据自己多年丰富的实践经验,对EJB的各种笨重臃肿的结构进行了逐一的分析和否定,并分别以简洁实用的方式替换之。至此一战功成,Rod Johnson成为一个改变Java世界的大师级人物。值得注意的是,Rod Johnson是悉尼大学的博士,然而他的专业不是计算机,而是音乐学。

Spring框架自从发布以来,就得到快速发展,经过时代的验证,现在已经是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。从2004发布的第一个Spring版本,到现在已经更新到第五个Spring版本了,我们下面来看看各个版本的变化。

image

(1) Spring 1.x

在2004年3月24日,Spring Framework 1.0 final正式发布,Spring 1.0当时只包含一个完整的项目,他把所有的功能都集中在一个项目中,其中包含了核心的IOC、AOP,同时也包含了其它的诸多功能,例如:JDBC、Mail、ORM、事务、定时任务、Spring MVC等等。由于Spring超前的眼光和博大的精神,在第一个版本的时候已经支持了很多第三方的框架,例如:Hibernate、ibatis、模板引擎等。所有自发布以来,Spring 框架迅速发展。但是此时的Spring只支持基于XML的配置。

(2) Spring 2.x

Spring 2.0 于 2006年10月发布,到那时,Spring的下载量已经超过了 100 万。Spring 2.0中新增的特性有:具有可扩展的 XML 配置功能,用于简化 XML 配置,即对注解的支持,支持了基于注解的配置,支持 Java 5,额外的 IoC 容器扩展点,支持动态语言(BeanShell)。

2007年11月Interface21公司更名为SpringSource。同时发布了Spring 2.5。 Spring 2.5中的主要新功能包括支持Java 6 和Java EE 5,支持配置注释,支持自动检测和兼容组件的类路径和OSGi兼容bundle。2007年,SpringSource从benchmark capital获得了1000万美元A轮投资。

2009年8月,SpringSource以4.2亿美元被VMWare收购,SpringSource又在几周内收购了cloud foundry,这是一家云PaaS供应商。

(3) Spring 3.x

Spring 3.0 于2009 年 12 月发布,此时的Spring正式托管到GitHub上,我们可以GitHub的网站查看:https://github.com/spring-projects/spring-framework,Spring 3.0 增加许多重要特性,如重组模块系统,支持 Spring 表达式语言,基于 Java 的 bean 配置(JavaConfig),支持嵌入式数据库(如 HSQL,H2 和 Derby),模型验证/ REST 支持和对 Java EE 的支持。

2011年和2012年发布了许多3.x系列的小版本。2012年7月,Rod Johnson离开了Spring团队。2013年4月,VMware和EMC通过GE投资创建了一家名为Pivotal的合资企业。所有的Spring项目都转移到了Pivotal。

(4) Spring 4.x

2013年12 月,Pivotal 宣布发布Spring框架4.0。Spring 4.0 是 Spring 框架的一大进步,它包含了对Java 8 的全面支持,支持Lambda表达式的使用,更高的第三方库依赖性(groovy 1.8+,ehcache 2.1+,hibernate 3.6+等),提供了对@Scheduled和@PropertySource重复注解的支持,提供了空指针终结者Optional,对核心容器进行增加:支持泛型的依赖注入、Map的依赖注入、Lazy延迟依赖的注入、List注入、Condition条件注解注入、对CGLib动态代理类进行了增强,对groovy DSL for bean 定义支持,Spring MVC基于Servlet 3.0 开发,并且为了方便Restful开发,引入了新的RestController注解器注解,同时还增加了一个AsyncRestTemplate支持Rest客户端的异步无阻塞请求,对 websockets 的支持以及对泛型类型的支持作为注入 bean 的限定符。

2014 年至 2017 年期间发布了许多 Spring 框架 4.xx 系列版本。

(5) Spring 5.x

Spring 5.0于 2017年 9月28日发布了通用版本 (GA)。Spring 5.0开始支持Java EE 7,同时兼容JDK9,但是Spring 5的运行环境最低要求是Java8以上,全面支持Servlet 3.1。其中新增的响应式编程是 SpringFramework5.0 最重要的特性之一、WebFlux框架(全新的模块Spring WebFlux用于替代老的 Spring-webmvc)、对Kotlin也有了更好的支持等等。

目前最新的版本如下(https://spring.io/projects/spring-framework#learn):

image

由于Spring一直在保持更新,而更新的内容都是做一些优化或者是新增一些特性,之前版本的特性基本都会保留,所以我们完全可以直接使用最新版本,本系列文章都使用的是Spring5。

3、Spring的组成模块

Spring框架包含的功能大约由20个小模块组成。这些模块按组可分为核心容器(Core Container)、数据访问/集成(Data Access/Integration)、Web、面向切面编程(AOP和Aspects)、设备(Instrumentation)、消息(Messaging)和测试(Test)。如下图所示:

image

下面对各个模块进行详细介绍:(这些模块我们也可以在Spring的GitHub上查看到:https://github.com/spring-projects/spring-framework)

(1) 核心容器(Core Container)——Beans、Core、Context、Expression

该层由4个模块组成:spring-beans  spring-core  spring-context  spring-expression(spring expression Language,SpEl) 。它们对应的jar包如下:

  1. spring-core:该模块是依赖注入IoC与DI的最基本实现。
  2. spring-beans:该模块是Bean工厂与bean的装配。
  3. spring-context:该模块构架于核心模块之上,它扩展了 BeanFactory,为它添加了 Bean 生命周期控制、框架事件体系以及资源加载透明化等功能。ApplicationContext 是该模块的核心接口,它的超类是 BeanFactory。与BeanFactory 不同,ApplicationContext 容器实例化后会自动对所有的单实例 Bean 进行实例化与依赖关系的装配,使之处于待用状态。
  4. spring-context-indexer:该模块是 Spring 的类管理组件和 Classpath 扫描。
  5. spring-context-support:该模块是对 Spring IOC 容器的扩展支持,以及 IOC 子容器。
  6. spring-expression:该模块是Spring表达式语言块是统一表达式语言(EL)的扩展模块,可以查询、管理运行中的对象,同时也方便的可以调用对象方法、操作数组、集合等。

(2) 数据访问与集成(Data Access/Integration)——Jdbc、Orm、Oxm、Jms、Transactions

该层由spring-jdbc、spring-tx、spring-orm、spring-jms 和 spring-oxm 5 个模块组成。它们对应的jar包如下:

  1. spring-jdbc:该模块提供了 JDBC抽象层,它消除了冗长的 JDBC 编码和对数据库供应商特定错误代码的解析。
  2. spring-tx:该模块支持编程式事务和声明式事务,可用于实现了特定接口的类和所有的 POJO 对象。编程式事务需要自己写beginTransaction()、commit()、rollback()等事务管理方法,声明式事务是通过注解或配置由 spring 自动处理,编程式事务粒度更细。
  3. spring-orm:该模块提供了对流行的对象关系映射 API的集成,包括 JPA、JDO 和 Hibernate 等。通过此模块可以让这些 ORM 框架和 spring 的其它功能整合,比如前面提及的事务管理。
  4. spring-oxm:该模块提供了对 OXM 实现的支持,比如JAXB、Castor、XML Beans、JiBX、XStream等。
  5. spring-jms:该模块包含生产(produce)和消费(consume)消息的功能。从Spring 4.1开始,集成了 spring-messaging 模块。

(3) Web——Web、Webmvc、WebFlux、Websocket

该层由 spring-web、spring-webmvc、spring-websocket 和 spring-webflux 4 个模块组成。它们对应的jar包如下:

  1. spring-web:该模块为 Spring 提供了最基础 Web 支持,主要建立于核心容器之上,通过 Servlet 或者 Listeners 来初始化 IOC 容器,也包含一些与 Web 相关的支持。
  2. spring-webmvc:该模块众所周知是一个的 Web-Servlet 模块,实现了 Spring MVC(model-view-Controller)的 Web 应用。
  3. spring-websocket:该模块主要是与 Web 前端的全双工通讯的协议。
  4. spring-webflux:该模块是一个新的非堵塞函数式 Reactive Web 框架,可以用来建立异步的,非阻塞,事件驱动的服务,并且扩展性非常好。

(4) 面向切面编程——AOP,Aspects

该层由spring-aop和spring-aspects 2个模块组成。它们对应的jar包如下:

  1. spring-aop:该模块是Spring的另一个核心模块,是 AOP 主要的实现模块
  2. spring-aspects:该模块提供了对 AspectJ 的集成,主要是为 Spring AOP提供多种 AOP 实现方法,如前置方法后置方法等。

(5) 设备(Instrumentation)——Instrmentation

spring-instrument:该模块是基于JAVA SE 中的"java.lang.instrument"进行设计的,应该算是 AOP的一个支援模块,主要作用是在 JVM 启用时,生成一个代理类,程序员通过代理类在运行时修改类的字节,从而改变一个类的功能,实现 AOP 的功能。

(6) 消息(Messaging)——Messaging

spring-messaging:该模块是从 Spring4 开始新加入的一个模块,主要职责是为 Spring 框架集成一些基础的报文传送应用。

(7) 测试(Test)——Test

spring-test:该模块主要为测试提供支持的,通过 JUnit 和 TestNG 组件支持单元测试和集成测试。它提供了一致性地加载和缓存 Spring 上下文,也提供了用于单独测试代码的模拟对象(mock object)。

4、Spring的下载

下载地址:https://repo.spring.io/libs-release-local/org/springframework/spring/

进入后可选择下载的版本,选择版本后,进入目录结构。

其中dist是最终发布版本,包含开发所需lib和源码。docs是开发文档。schema是一些约束文件。

image

不过大部分人都会选择使用Maven或者Gradle来下载Spring的jar,因为它们更加方便。

Maven和Gradle通用地址:https://mvnrepository.com/

5、Spring的核心

在前面部分就一直强调Spring的最核心部分是控制反转(IoC)和面向切面编程(AOP),那么它们到底是什么东西?,下面我们来简单介绍一下:

注意:有的人认为 控制反转 应该包含 IoC 和 DI,而实质上它们二者是一样的,控制反转(IOC)和依赖注入(DI)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖注入的方式,实现对象之间的解耦。其中IOC是个更宽泛的概念,而DI是更具体的概念。

(1) IOC(Inversion of Control 控制反转) 或DI (Dependency Injection依赖注入)

  • IOC (控制反转):说简单点就是当我们使用对象调用一个方法或者类时,不再由我们主动去创建这个类的对象,控制权交给spring框架。说复杂点就是资源(组件)不再由使用资源双方进行管理,而是由不使用资源的第三方统一管理,这样带来的好处。第一,资源的集中管理,实现资源的可配置和易管理。第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度
  • DI (依赖注入):由spring框架主动创建被调用类的对象,然后把这个对象注入到我们自己的类中,使得我们可以直接使用它。

(2) AOP(Aspect Oriented Programming面向切面编程)

AOP(Aspect Oriented Programming面向切面编程):说简单点就是我们可以在不修改源代码的情况下,对程序的方法进行增强。说复杂点就是将涉及多业务流程的通用功能抽取并单独封装,形成独立的切面,在合适的时机将这些切面横向切入到业务流程指定的位置中。即系统级的服务从代码中解耦出来。例如:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来。允许你把遍布应用各处的功能分离出来形成可重用组件。提高程序的可重用性,同时提高了开发的效率。

这两个核心非常非常非常重要,在后面会详细介绍。

6、Spring优缺点

--优点:

  1. 方便解耦,简化开发:通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
  2. AOP编程的支持:通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
  3. 声明式事务的支持:在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
  4. 方便程序的测试:可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。
  5. 方便集成各种优秀框架:Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
  6. 轻量级的框架:从大小与开销两方面而言Spring都是轻量的。现在完整的Spring5框架只有82MB。并且Spring所需的处理开销也是微不足道的。
  7. 非入侵式的框架:Spring框架是一个非入侵式的框架,就是我们的系统使用了Spring,但系统完全不依赖于Spring的特定类。
  8. 降低Java EE API的使用难度:Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。
  9. Java 源码是经典学习范例:Spring的源码设计精妙、结构清晰、匠心独运,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。

既然Spring有这么多优点你告诉你凭什么不用它?

826dc52efcdf577b5b83844639b027f7

那么再好的框架,肯定也是有缺点的。

--缺点

  1. 不易拆分:spring框架整合其它框架都是黏在一起,后面拆分的话就不容易拆分了。
  2. 有更好的替代品:对比新出的springboot,他已经逐渐占领了市场。
  3. 配置繁琐:随着系统工程的增大,系统与第三方的配置文件会大量增加,这也是Spring最致命的地方,人称:“配置地狱”。

7、Spring的拓展

Spring框架经过这么多年的发展,它已经衍生出了一个非常庞大的体系,有SpringBoot、SpringCloud等等。如下图所示:

image

  • SpringBoot的设计目的是用来简化 Spring 应用的开发过程。现在大部分企业都在使用SpringBoot进行快速开发,Springboot内部集成了很多第三方库的配置,所以它开箱即用。而且能够快速整合第三方框架,无需配置繁琐的文件,解决了Spring的弊端。基于Spring Boot可以快速的开发单个微服务。 SpringBoot的约定大于配置!

约定优于配置(Convention Over Configuration),也称作按约定编程是一种软件设计范式。目的在于减少软件开发人员所需要做出的决定的数量,从而获得简单的好处,而又不失去其中的灵活性。

  • Spring Cloud 是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务。

微服务:就是把一个单体项目,拆分为多个微服务,每个微服务可以独立技术选型,独立开发,独立部署,独立运维.并且多个服务相互协调,相互配合,最终完成用户的价值.

  

其中Spring Boot 是基于 Spring Framework 来构建的,Spring Cloud 是构建 Spring Boot 分布式环境。所以Spring Boot 是中流砥柱,起到承上启下的作用:

但是注意:正是因为SpringBoot简化了开发,开箱即用,所以很多人都跳过了Spring的学习,学到后面这个注解那个类是什么都不知道。所以学习SpringBoot的前提是需要完全掌握Spring以及SpringMVC的知识的,不要急于求成,必须要一步一步扎实基础。

image

Spring框架介绍大概就讲这么多了,拜拜,有什么问题在下面留言!!!

posted @ 2020-07-21 22:01  唐浩荣  阅读(24439)  评论(2编辑  收藏  举报