程序员都很崇拜技术大神,很大一部分是由于他们发现和解决问题的能力,特别是线上出现紧急问题时,老是可以快速定位和解决。javascript
一方面,他们有深厚的技术基础,对应用的技术知其因此然,另外一方面,在采坑的过程当中不断总结,积累了不少经验。java
相信你们都使用过Spring,有些人了解它的核心:IOC和AOP,但只是了解它们的基本概念、使用了反射和动态代理,关于如何管理对象、代理的具体实现了解的比较浅。程序员
有些人使用Spring MVC,使用Spring集成数据库、事务、消息队列以简化操做,但对集成的具体设计思路和实现了解的也比较浅。web
我也这一块也比较菜,因此,后面的一段时间会梳理和总结Spring相关的技术原理,以「Spring技术内幕:深刻解析Spring架构与设计原理」书籍为核心,结合本身的使用经验和疑问,以及网络上大牛的文章,来补足本身这方面的缺失。spring
这本书做者是计文柯,以Spring源代码为依托,从宏观上揭示了Spring的设计思路和架构思想,从微观上剖析了Spring各功能模块的实现原理和运行机制。一方面但愿读者能经过深刻了解Spring的底层机制来更好地解决实际开发中遇到的各类难题,另外一方面是但愿读者能吸取Spring设计和实现中的优秀方法和思想。数据库
全书共三部分,分别阐述了Spring的核心、组件和应用。第一部分详细分析了IOC容器和AOP实现,第二部分阐述了基于Spring IOC容器和AOP的Java EE组件在Spring中的实现,第三部分讲述了一些基于Spring的典型应用的实现。express
本篇先对设计理念和总体架构作个概述,从总体上看看Spring的设计目标和架构,经过本篇,你会了解到:编程
简单来讲,Spring的设计目标是为咱们提供一个一站式的轻量级应用开发平台,抽象了应用开发中遇到的共性问题。api
做为平台,它考虑到了企业应用资源的使用,好比数据的持久化、数据集成、事务处理、消息中间件、分布式式计算等高效可靠处理企业数据方法的技术抽象。数组
轻量级是相对于传统J2EE而言的,传统的J2EE开发,须要依赖按照J2EE规范实现的J2EE应用服务器,设计和实现时,须要遵循一系列的接口标准,这种开发方式耦合性高,使应用在可测试性和部署上都有影响,对技术的理解和要求相对较高。
使用Spring进行开发,对开发人员比较轻量,可使用POJO和JavaBean的开发方式,使应用面向接口开发,充分支持了面向对象的设计方法。经过IOC容器减小了直接耦合,经过AOP以动态和非侵入的方式增长了服务的功能,为灵活选取不一样的服务实现提供了基础,这也是Spring的核心。
开发过程当中的共性问题,Spring封装成了各类组件,并且Spring经过社区,造成了一个开放的生态系统,好比Spring Security就是来源于一个社区贡献Acegi.
从整体来看,Spring分为3层,最底层是核心层,包括IOC、AOP等核心模块,中间层是封装的JavaEE服务、做为中间的驱动组件,最上层是各个应用。
下图是Spring官网的一个架构图,介绍下其组成部分:
由spring-core、spring-beans、spring-context、spring-context-support和spring-expression模块组成:
spring-core和spring-beans提供框架的基础部分,包括IOC功能,BeanFactory是一个复杂的工厂模式的实现,将配置和特定的依赖从实际程序逻辑中解耦。
context模块创建在core和beans模块的基础上,增长了对国际化的支持、事件广播、资源加载和建立上下文,ApplicationContext是context模块的重点。
spring-context-support提供对常见第三个库的支持,集成到spring上下文中,好比缓存(ehcache,guava)、通讯(javamail)、调度(commonj,quartz)、模板引擎等(freemarker,velocity)。
spring-expression模块提供了一个强大的表达式语言用来在运行时查询和操做对象图,这种语言支持对属性值、属性参数、方法调用、数组内容存储、集合和索引、逻辑和算数操做及命名变量,而且经过名称从spring的控制反转容器中取回对象。
spring-aop模块提供面向切面编程实现,单独的spring-aspects模块提供了aspectj的集成和适用。
spring-instrument提供一些类级的工具支持和ClassLoader级的实现,用于服务器。spring-instrument-tomcat针对tomcat的instrument实现。
spring框架4包含了spring-messaging模块,从spring集成项目中抽象出来,好比Messge、MessageChannel、MessageHandler及其余用来提供基于消息的基础服务。
数据访问和集成层由JDBC、ORM、OXM、JMS和事务模块组成。
spring-jdbc模块提供了不须要编写冗长的JDBC代码和解析数据库厂商特有的错误代码的JDBC抽象出。
spring-tx模块提供可编程和声明式事务管理。
spring-orm模块提供了领先的对象关系映射API集成层,如JPA、Hibernate等。
spring-oxm模块提供抽象层用于支持Object/XML maping的实现,如JAXB、XStream等。
spring-jms模块包含生产和消费消息的功能,从Spring4.1开始提供集成spring-messaging模块。
Web层包含spring-web、spirng-webmvc、spring-websocket和spring-webmvc-portlet模块组成。
spring-web模块提供了基本的面向web开发的集成功能,例如多文件上传、使用servert listeners和web开发应用程序上下文初始化IOC容器。也包含HTTP客户端以及spring远程访问的支持的web相关部分。
spring-webmvc包含spring的model-view-controller和REST web services 实现的Web应用程序。
spring-webmvc-portlet模块提供了MVC模式的portlet实现,protlet与Servlet的最大区别是请求的处理分为action和render阶段,在一个请求中,action阶段只执行一次,但render阶段可能因为用户的浏览器操做而被执行屡次。
spring-test模块支持经过组合Junit或TestNG来进行单元测试和集成测试,提供了连续的加载ApplicationContext而且缓存这些上下文。
从配置到安全,从web应用到大数据——不管您的应用程序须要什么样的基础设施,都有一个Spring项目来帮助您构建它,Spring是模块化的设计。
简化新Spring应用的初始搭建以及开发过程,使用特定的方式进行配置,使开发人员再也不须要定义样板化的配置,实现快速开发。
为分布式系统开发提供工具集,基于Spring Boot,为基于JVM的云应用开发中的配置管理、服务发现、断路器、智能路由、控制总线、全局锁、决策竞选、分布式会话、集群状态管理等操做提供了一种简单的开发方式,其下有不少子项目:
Data flow 是一个用于开发和执行大范围数据处理、批量运算、持续运算的统一编程模型和托管服务。
Spring Cloud Data Flow 是基于原生云对Spring XD的从新设计,项目目标是简化大数据应用的开发。Spring XD的流处理和批处理模块的重构分别基于spring boot的stream和task/batch的微服务程序。这些程序原生的支持像 Apache YARN、Apache Mesos和Kubernetes等现代运行环境,都是自动部署单元。
数据访问模块,提供了对JDBC及ORM很好的支持,随着NOSQL和BigData的兴起,出现了愈来愈多的新技术,好比非关系型数据库、MapReduce框架,为了让spring开发者能更方便地使用这些新技术,经过Spring Data,开发者能够用Spring提供的相对一致的方式访问位于不一样类型的数据存储中的数据。
在企业软件开发过程当中,常常会遇到与外部系统集成,Spring Integration为Spring编程模型提供了一个支持企业集成模式的扩展,在应用程序中提供轻量级的消息机制,经过声明式的适配器与外部系统进行集成。
Spring Integraton中有几个基本的概念:
还可使用Channel Adapter,这是应用程序与外界交互的地方,输入是Inbound、输出则是Outbound,可选的链接类型有不少,好比AMQP、JDBC、Web Services、FTP、JMS、XMPP、多种NoSQL数据库等等。只需经过简单的配置文件就能将全部这些东西串联在一块儿,实现复杂的集成工做。
简化及优化大量数据的批处理操做,支持事务、并发、流程、监控、纵向和横向扩展,提供统一的接口管理和任务管理。
例如它提供了不少方法来读取大型的文件(好比1GB的CSV、XML文件),在数据库中加载或更新几万甚至几十万条记录,若是直接select出全部记录,以致于拖垮整个系统,而使用了Spring Batch,框架会帮助他每次捞取一部分记录进行分页,在更新时分批进行提交。
一款Spring的认证和安全工具。其前身是Acegi,目标是为Spring应用提供一个安全服务,好比用户认证、受权等。
它使用Servlet规范中的Filter保护Web请求并限制URL级别的访问,还可以使用Spring AOP保护方法调用——借助于对象代理和使用通知,可以确保只有具有适当权限的用户才能访问安全保护的方法。
它很是灵活,可以基于各类数据存储来认证用户。它内置了多种常见的用户存储场景,如内存、关系型数据库以及LDAP,还能够编写并插入自定义的用户存储实现。
先来理解HATEOAS:你们都听过过REST,它的定位为「分布式超媒体应用」的架构风格,文中提到了HATEOAS(Hypermedia as the engine of application state)的概念,超媒体即应用状态引擎,即返回结果中提供连接,连向其余API方法,使得用户不查文档,也知道下一步应该作什么。
好比获取一篇文章,非HATEOAS的响应例子是:
GET /posts/1 HTTP/1.1
Connection: keep-alive
Host: blog.example.com
{
"id" : 1,
"body" : "My first blog post",
"postdate" : "2015-05-30T21:41:12.650Z"
}
复制代码
而HATEOAS的响应例子是:
{
"id" : 1,
"body" : "My first blog post",
"postdate" : "2015-05-30T21:41:12.650Z",
"links" : [
{
"rel" : "self",
"href" : http://blog.example.com/posts/1,
"method" : "GET"
}
]
}
复制代码
为了简化签入或获取超连接等操做,Spring HATEOAS提供了相关的支持。
能够生成准确可读的RESTful Service文档,Spring 官方文档都是用Spring REST Docs生成的。
基于单元测试生成文档片断,不会侵入到源码中,因此就不会使得源码变得愈来愈臃肿,支持markdown,修改一行配置代码便可支持生成 MarkDown 语法的文档片断。
默认的,在构建的时候,会首先运行单元测试,便生成了文档片断,而后在打包时,经过添加 asciidoctor-maven-plugin 插件便可生成最终的文档,只要是规范的开发过程,文档都会随版本的每次发布而自动更新。
使用 Spring Social 的最大好处在于它已经提供了对主流社交网站的支持,只须要简单配置便可,对于一些不太经常使用的社交网站,也能够从社区中找到相应的组件。
基于Spring框架的AMQP消息解决方案,提供模板化的发送和接收消息的抽象层,提供基于消息驱动的POJO,使在Spring应用中使用AMQP消息服务器变得更为简单,SpringSource旗下的Rabbit MQ就是一个开源的基于AMQP的消息服务器。
Spring Web Flow是Spring MVC 的扩展,它支持开发基于流程的应用程序。它将流程的定义与实现流程行为的类和视图分离开来,具备同时处理多个HTTP请求、管理会话状态、数据事务处理,支持AJAX来构建丰富的客户端体验,而且提供对JSF的支持。
Spring LDAP是一个用于操做LDAP的Java框架。它是基于Spring的JdbcTemplate模式,可以帮助开发人员简化操做。
Spring Session提供了一套建立和管理Servlet HttpSession的方案。Spring Session提供了集群Session功能,默认采用外置的Redis来存储Session数据,以此来解决Session共享的问题。
Spring Shell提供交互式的Shell,可让你使用简单的基于Spring的编程模型来开发命令。
spring for kafka对原生的kafka client consumer的封装与集成。
它的主要功能是帮助开发者简化状态机的开发过程,让状态机结构更加层次化。
能够认为是一个依赖维护平台,该平台将相关依赖汇聚到一块儿,针对每一个依赖,都提供了一个版本号。
主要是解决依赖版本冲突问题,在使用Spring的时候,常常会使用到第三方库,通常你们都是根据经验挑选一个版本号或挑选最新的,风向较大,很容易冲突。
Spring IO Platform能很好地解决这些问题,咱们在添加第三方依赖的时候,不须要写版本号,它可以自动帮咱们挑选一个最优的版本。
欢迎扫描下方二维码,关注个人我的微信公众号,查看更多文章 ~