Spring是什么?它是怎么诞生的?有哪些次要的组件和外围性能呢? 本文通过这几个问题帮忙你构筑Spring和Spring Framework的整体认知。@pdai
Spring框架系列(1) - Spring和Spring框架组成
什么是Spring?
- Spring的起源
- Spring的个性和劣势
Spring有哪些组件?
- Core Container(Spring的外围容器)
- Data Access/Integration(数据拜访/集成)
- Web模块
- AOP、Aspects、Instrumentation和Messaging
- Test模块
- 为什么用Spring?
学习Spring时参考哪些材料呢?
- Spring 的官网我的项目和教程
- Spring 的归档文档
- Spring 的官网Github
- 更多文章
什么是Spring?
首先,Spring是什么?它是怎么诞生的?它的诞生是为了解决什么问题?@pdai
Spring的起源
百度百科中对于Spring的起源介绍如下:
要谈Spring的历史,就要先谈J2EE。J2EE应用程序的宽泛实现是在1999年和2000年开始的,它的呈现带来了诸如事务管理之类的外围中间层概念的标准化,然而在实践中并没有取得相对的胜利,因为开发效率,开发难度和理论的性能都令人悲观。
已经应用过EJB开发JAVA EE利用的人,肯定晓得,在EJB开始的学习和利用十分的艰辛,很多货色都不能一下子就很容易的了解。EJB要严格地实现各种不同类型的接口,相似的或者反复的代码大量存在。而配置也是简单和枯燥,同样应用JNDI进行对象查找的代码也是枯燥而干燥。尽管有一些开发工作随着xdoclet的呈现,而有所缓解,然而学习EJB的昂扬代价,和极低的开发效率,极高的资源耗费,都造成了EJB的应用艰难。而Spring呈现的初衷就是为了解决相似的这些问题。
Spring的一个最大的目标就是使JAVA EE开发更加容易。同时,Spring之所以与Struts、Hibernate等单层框架不同,是因为Spring致力于提供一个以对立的、高效的形式结构整个利用,并且能够将单层框架以最佳的组合揉和在一起建设一个连贯的体系。能够说Spring是一个提供了更欠缺开发环境的一个框架,能够为POJO(Plain Ordinary Java Object)对象提供企业级的服务。
Spring的造成,最后来自Rod Jahnson所著的一本很有影响力的书籍《Expert One-on-One J2EE Design and Development》,就是在这本书中第一次呈现了Spring的一些核心思想,该书出版于2002年。
Spring的个性和劣势
Spring Framework有哪些个性,用了这个框架对开发而言有什么益处呢?
从Spring 框架的个性来看:
- 非侵入式:基于Spring开发的利用中的对象能够不依赖于Spring的API
- 管制反转:IOC——Inversion of Control,指的是将对象的创立权交给 Spring 去创立。应用 Spring 之前,对象的创立都是由咱们本人在代码中new创立。而应用 Spring 之后。对象的创立都是给了 Spring 框架。
- 依赖注入:DI——Dependency Injection,是指依赖的对象不须要手动调用 setXX 办法去设置,而是通过配置赋值。
- 面向切面编程:Aspect Oriented Programming——AOP
- 容器:Spring 是一个容器,因为它蕴含并且治理利用对象的生命周期
- 组件化:Spring 实现了应用简略的组件配置组合成一个简单的利用。在 Spring 中能够应用XML和Java注解组合这些对象。
- 一站式:在 IOC 和 AOP 的根底上能够整合各种企业应用的开源框架和优良的第三方类库(实际上 Spring 本身也提供了体现层的 SpringMVC 和长久层的 Spring JDBC)
从应用Spring 框架的益处看:
- Spring 能够使开发人员应用 POJOs 开发企业级的应用程序。只应用 POJOs 的益处是你不须要一个 EJB 容器产品,比方一个应用程序服务器,然而你能够抉择应用一个强壮的 servlet 容器,比方 Tomcat 或者一些商业产品。
- Spring 在一个单元模式中是有组织的。即便包和类的数量十分大,你只有放心你须要的,而其它的就能够疏忽了。
- Spring 不会让你白费力气做反复工作,它真正的利用了一些现有的技术,像 ORM 框架、日志框架、JEE、Quartz 和 JDK 计时器,其余视图技术。
- 测试一个用 Spring 编写的应用程序很容易,因为环境相干的代码被挪动到这个框架中。此外,通过应用 JavaBean-style POJOs,它在应用依赖注入注入测试数据时变得更容易。
- Spring 的 web 框架是一个设计良好的 web MVC 框架,它为比方 Structs 或者其余工程上的或者不怎么受欢迎的 web 框架提供了一个很好的供代替的抉择。MVC 模式导致应用程序的不同方面(输出逻辑,业务逻辑和UI逻辑)拆散,同时提供这些元素之间的涣散耦合。模型(Model)封装了应用程序数据,通常它们将由 POJO 类组成。视图(View)负责渲染模型数据,一般来说它生成客户端浏览器能够解释 HTML 输入。控制器(Controller)负责解决用户申请并构建适当的模型,并将其传递给视图进行渲染。
- Spring 对 JavaEE 开发中十分难用的一些 API(JDBC、JavaMail、近程调用等),都提供了封装,使这些API利用难度大大降低。
- 轻量级的 IOC 容器往往是轻量级的,例如,特地是当与 EJB 容器相比的时候。这有利于在内存和 CPU 资源无限的计算机上开发和部署应用程序。
- Spring 提供了统一的事务管理接口,可向下扩大到(应用一个繁多的数据库,例如)本地事务并扩大到全局事务(例如,应用 JTA)
Spring有哪些组件?
Spring Framework有哪些组件呢?
下图来自,官网文档 Spring-framework 5.0;须要留神的是,尽管这个图来源于Spring Framwork5.0 M4 版本,然而它仍然是V4版本的图,比方Spring 5版本中的web模块曾经去掉了Portlet模块,新增了WebFlux模块等。
上图中蕴含了 Spring 框架的所有模块,这些模块能够满足所有企业级利用开发的需要,在开发过程中能够依据需要有选择性地应用所须要的模块。上面别离对这些模块的作用进行简略介绍(并且联合SpringFramework5.x源码模块帮忙你对应好各模块关系)。
Core Container(Spring的外围容器)
Spring 的外围容器是其余模块建设的根底,由 Beans 模块、Core 外围模块、Context 上下文模块和 SpEL 表达式语言模块组成,没有这些外围容器,也不可能有 AOP、Web 等下层的性能。具体介绍如下。
- Beans 模块:提供了框架的根底局部,包含管制反转和依赖注入。
- Core 外围模块:封装了 Spring 框架的底层局部,包含资源拜访、类型转换及一些常用工具类。
- Context 上下文模块:建设在 Core 和 Beans 模块的根底之上,集成 Beans 模块性能并增加资源绑定、数据验证、国际化、Java EE 反对、容器生命周期、事件流传等。ApplicationContext 接口是上下文模块的焦点。
- SpEL 模块:提供了弱小的表达式语言反对,反对拜访和批改属性值,办法调用,反对拜访及批改数组、容器和索引器,命名变量,反对算数和逻辑运算,反对从 Spring 容器获取 Bean,它也反对列表投影、抉择和个别的列表聚合等。
对应的源码模块如下:
Data Access/Integration(数据拜访/集成)
数据拜访/集成层包含 JDBC、ORM、OXM、JMS 和 Transactions 模块,具体介绍如下。
- JDBC 模块:提供了一个 JBDC 的样例模板,应用这些模板能打消传统简短的 JDBC 编码还有必须的事务管制,而且能享受到 Spring 治理事务的益处。
- ORM 模块:提供与风行的“对象-关系”映射框架无缝集成的 API,包含 JPA、JDO、Hibernate 和 MyBatis 等。而且还能够应用 Spring 事务管理,无需额定管制事务。
- OXM 模块:提供了一个反对 Object /XML 映射的形象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。将 Java 对象映射成 XML 数据,或者将XML 数据映射成 Java 对象。
- JMS 模块:指 Java 音讯服务,提供一套 “音讯生产者、音讯消费者”模板用于更加简略的应用 JMS,JMS 用于用于在两个应用程序之间,或分布式系统中发送音讯,进行异步通信。
- Transactions 事务模块:反对编程和申明式事务管理。
对应的源码模块如下:
Web模块
Spring 的 Web 层包含 Web、Servlet、WebSocket 和 Webflux 组件,具体介绍如下。
- Web 模块:提供了根本的 Web 开发集成个性,例如多文件上传性能、应用的 Servlet 监听器的 IOC 容器初始化以及 Web 利用上下文。
- Servlet 模块:提供了一个 Spring MVC Web 框架实现。Spring MVC 框架提供了基于注解的申请资源注入、更简略的数据绑定、数据验证等及一套十分易用的 JSP 标签,齐全无缝与 Spring 其余技术协作。
- WebSocket 模块:提供了简略的接口,用户只有实现响应的接口就能够疾速的搭建 WebSocket Server,从而实现双向通信。
- Webflux 模块: Spring WebFlux 是 Spring Framework 5.x中引入的新的响应式web框架。与Spring MVC不同,它不须要Servlet API,是齐全异步且非阻塞的,并且通过Reactor我的项目实现了Reactive Streams标准。Spring WebFlux 用于创立基于事件循环执行模型的齐全异步且非阻塞的应用程序。
此外Spring4.x中还有Portlet 模块,在Spring 5.x中曾经移除
- Portlet 模块:提供了在 Portlet 环境中应用 MVC 实现,相似 Web-Servlet 模块的性能。
对应的源码模块如下:
AOP、Aspects、Instrumentation和Messaging
在 Core Container 之上是 AOP、Aspects 等模块,具体介绍如下:
- AOP 模块:提供了面向切面编程实现,提供比方日志记录、权限管制、性能统计等通用性能和业务逻辑拆散的技术,并且能动静的把这些性能增加到须要的代码中,这样各司其职,升高业务逻辑和通用性能的耦合。
- Aspects 模块:提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。
- Instrumentation 模块:提供了类工具的反对和类加载器的实现,能够在特定的应用服务器中应用。
- messaging 模块:Spring 4.0 当前新增了音讯(Spring-messaging)模块,该模块提供了对消息传递体系结构和协定的反对。
- jcl 模块: Spring 5.x中新增了日志框架集成的模块。
对应的源码模块如下:
Test模块
Test 模块:Spring 反对 Junit 和 TestNG 测试框架,而且还额定提供了一些基于 Spring 的测试性能,比方在测试 Web 框架时,模仿 Http 申请的性能。
蕴含Mock Objects, TestContext Framework, Spring MVC Test, WebTestClient。
对应的源码模块如下:
为什么用Spring?
那么为什么用Spring呢?来看看官网对这个问题的答复
最重要的体现在它能做什么,这是Spring的外围所在
且官网对此专门对此做了具体介绍,感兴趣能够看下
学习Spring时参考哪些材料呢?
十分负责任的通知你,最好最全的材料在Spring的官网,Spring能成为最次要的企业开发框架,文档和生态体系也做的很好;这里介绍下如何获取官网的学习资源。@pdai
Spring 的官网我的项目和教程
官网的我的项目和教程,地址在这里,在学习Spring时,肯定要把它当做生态体系,而是不是一个简略的开发框架。
Spring 的归档文档
官网提供了系统性的文档的FTP,你能够在这里找到所有历史版本的PDF/HTML版本。
能够看到很多系统性的文档,包含下面援用的图,
Spring 的官网Github
Spring官网的GitHub在这里,它蕴含着Spring-framework的源码,如果你感兴趣,能够从这里clone代码进行浏览。
更多文章
首先, 从Spring框架的整体架构和组成对整体框架有个认知。
Spring根底 - Spring和Spring框架组成
- Spring是什么?它是怎么诞生的?有哪些次要的组件和外围性能呢? 本文通过这几个问题帮忙你构筑Spring和Spring Framework的整体认知。
其次,通过案例引出Spring的外围(IoC和AOP),同时对IoC和AOP进行案例应用剖析。
Spring根底 - Spring简略例子引入Spring的外围
- 上文中咱们简略介绍了Spring和Spring Framework的组件,那么这些Spring Framework组件是如何配合工作的呢?本文次要承接上文,向你展现Spring Framework组件的典型利用场景和基于这个场景设计出的简略案例,并以此引出Spring的外围要点,比方IOC和AOP等;在此基础上还引入了不同的配置形式, 如XML,Java配置和注解形式的差别。
Spring根底 - Spring外围之管制反转(IOC)
- 在Spring根底 - Spring简略例子引入Spring的外围中向你展现了IoC的根底含意,同时以此发散了一些IoC相干知识点; 本节将在此基础上进一步解读IOC的含意以及IOC的应用形式
Spring根底 - Spring外围之面向切面编程(AOP)
- 在Spring根底 - Spring简略例子引入Spring的外围中向你展现了AOP的根底含意,同时以此发散了一些AOP相干知识点; 本节将在此基础上进一步解读AOP的含意以及AOP的应用形式。
基于Spring框架和IOC,AOP的根底,为构建下层web利用,须要进一步学习SpringMVC。
Spring根底 - SpringMVC申请流程和案例
- 前文咱们介绍了Spring框架和Spring框架中最为重要的两个技术点(IOC和AOP),那咱们如何更好的构建下层的利用呢(比方web 利用),这便是SpringMVC;Spring MVC是Spring在Spring Container Core和AOP等技术根底上,遵循上述Web MVC的标准推出的web开发框架,目标是为了简化Java栈的web开发。 本文次要介绍SpringMVC的申请流程和根底案例的编写和运行。
Spring进阶 - IoC,AOP以及SpringMVC的源码剖析
Spring进阶 - Spring IOC实现原理详解之IOC体系结构设计
- 在对IoC有了初步的认知后,咱们开始对IOC的实现原理进行深刻了解。本文将帮忙你站在设计者的角度去看IOC最顶层的结构设计
Spring进阶 - Spring IOC实现原理详解之IOC初始化流程
- 上文,咱们看了IOC设计要点和设计构造;紧接着这篇,咱们能够看下源码的实现了:Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的
Spring进阶 - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等)
- 上文,咱们看了IOC设计要点和设计构造;以及Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的;容器中寄存的是Bean的定义即BeanDefinition放到beanDefinitionMap中,实质上是一个
ConcurrentHashMap<String, Object>
;并且BeanDefinition接口中蕴含了这个类的Class信息以及是否是单例等。那么如何从BeanDefinition中实例化Bean对象呢,这是本文次要钻研的内容?
- 上文,咱们看了IOC设计要点和设计构造;以及Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的;容器中寄存的是Bean的定义即BeanDefinition放到beanDefinitionMap中,实质上是一个
Spring进阶 - Spring AOP实现原理详解之切面实现
- 前文,咱们剖析了Spring IOC的初始化过程和Bean的生命周期等,而Spring AOP也是基于IOC的Bean加载来实现的。本文次要介绍Spring AOP原理解析的切面实现过程(将切面类的所有切面办法依据应用的注解生成对应Advice,并将Advice连同切入点匹配器和切面类等信息一并封装到Advisor,为后续交给代理加强实现做筹备的过程)。
Spring进阶 - Spring AOP实现原理详解之AOP代理
- 上文咱们介绍了Spring AOP原理解析的切面实现过程(将切面类的所有切面办法依据应用的注解生成对应Advice,并将Advice连同切入点匹配器和切面类等信息一并封装到Advisor)。本文在此基础上持续介绍,代理(cglib代理和JDK代理)的实现过程。
Spring进阶 - Spring AOP实现原理详解之Cglib代理实现
- 咱们在前文中曾经介绍了SpringAOP的切面实现和创立动静代理的过程,那么动静代理是如何工作的呢?本文次要介绍Cglib动静代理的案例和SpringAOP实现的原理。
Spring进阶 - Spring AOP实现原理详解之JDK代理实现
- 上文咱们学习了SpringAOP Cglib动静代理的实现,本文次要是SpringAOP JDK动静代理的案例和实现局部。
Spring进阶 - SpringMVC实现原理之DispatcherServlet初始化的过程
- 前文咱们有了IOC的源码根底以及SpringMVC的根底,咱们便能够进一步深刻了解SpringMVC次要实现原理,蕴含DispatcherServlet的初始化过程和DispatcherServlet解决申请的过程的源码解析。本文是第一篇:DispatcherServlet的初始化过程的源码解析。
Spring进阶 - SpringMVC实现原理之DispatcherServlet解决申请的过程
- 前文咱们有了IOC的源码根底以及SpringMVC的根底,咱们便能够进一步深刻了解SpringMVC次要实现原理,蕴含DispatcherServlet的初始化过程和DispatcherServlet解决申请的过程的源码解析。本文是第二篇:DispatcherServlet解决申请的过程的源码解析。