Spring详解(⼀)----Spring框架介绍
1
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
在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版本了,我们下⾯来看看各个版本的变化。
(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的⽹站查看:,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也有了更好的⽀持等等。
⽬前最新的版本如下():
由于Spring⼀直在保持更新,⽽更新的内容都是做⼀些优化或者是新增⼀些特性,之前版本的特性基本都会保留,所以我们完全可以直接使⽤最新版本,本系列⽂章都使⽤的是Spring5。
3、Spring的组成模块
Spring框架包含的功能⼤约由20个⼩模块组成。这些模块按组可分为核⼼容器(Core Container)、数据访问/集成(Data Access/Integration)、Web、⾯向切⾯编程(AOP和Aspects)、设备(Instrumentation)、消息(Messaging)和测试(Test)。如下图所⽰:
下⾯对各个模块进⾏详细介绍:(这些模块我们也可以在Spring的GitHub上查看到:)
(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
下载地址:
进⼊后可选择下载的版本,选择版本后,进⼊⽬录结构。
其中dist是最终发布版本,包含开发所需lib和源码。docs是开发⽂档。schema是⼀些约束⽂件。
不过⼤部分⼈都会选择使⽤Maven或者Gradle来下载Spring的jar,因为它们更加⽅便。
Maven和Gradle通⽤地址:。
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提供了对各种优秀框架(如
spring ioc注解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有这么多优点你告诉你凭什么不⽤它?
那么再好的框架,肯定也是有缺点的。
--缺点
1. 不易拆分:spring框架整合其它框架都是黏在⼀起,后⾯拆分的话就不容易拆分了。
2. 有更好的替代品:对⽐新出的springboot,他已经逐渐占领了市场。
3. 配置繁琐:随着系统⼯程的增⼤,系统与第三⽅的配置⽂件会⼤量增加,这也是Spring最致命的地⽅,⼈称:“配置地狱”。
7Spring的拓展
Spring框架经过这么多年的发展,它已经衍⽣出了⼀个⾮常庞⼤的体系,有SpringBoot、SpringCloud等等。如下图所⽰:
SpringBoot的设计⽬的是⽤来简化Spring 应⽤的开发过程。现在⼤部分企业都在使⽤SpringBoot进⾏快速开发,Springboot内部集成了很多第三⽅库的配置,所以它开箱即⽤。⽽且能够快速整合第三⽅框架,⽆需配置繁琐的⽂件,解决了Spring的弊端。基于Spring Boot可以快速的开发单个微服务。SpringBoot的约定⼤于配置!
约定优于配置(Convention Over Configuration),也称作按约定编程是⼀种软件设计范式。⽬的在于减少软件开发⼈员所需要做出的决定的数量,从⽽获得简单的好处,⽽⼜不失去其中的灵活性。
Spring Cloud 是⼀个基于Spring Boot实现的服务治理⼯具包,在微服务架构中⽤于管理和协调服务。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论