zoukankan      html  css  js  c++  java
  • Spring技术内幕:设计理念和整体架构概述(转)

    程序员都很崇拜技术大神,很大一部分是因为他们发现和解决问题的能力,特别是线上出现紧急问题时,总是能够快速定位和解决。

    一方面,他们有深厚的技术基础,对应用的技术知其所以然,另一方面,在采坑的过程中不断总结,积累了很多经验。

    相信大家都使用过Spring,有些人了解它的核心:IOC和AOP,但只是了解它们的基本概念、使用了反射和动态代理,关于如何管理对象、代理的具体实现了解的比较浅。

    有些人使用Spring MVC,使用Spring集成数据库、事务、消息队列以简化操作,但对集成的具体设计思路和实现了解的也比较浅。

    我也这一块也比较菜,所以,后面的一段时间会梳理和总结Spring相关的技术原理,以「Spring技术内幕:深入解析Spring架构与设计原理」书籍为核心,结合自己的使用经验和疑问,以及网络上大牛的文章,来补足自己这方面的缺失。

    这本书作者是计文柯,以Spring源代码为依托,从宏观上揭示了Spring的设计思路和架构思想,从微观上剖析了Spring各功能模块的实现原理和运行机制。一方面希望读者能通过深入了解Spring的底层机制来更好地解决实际开发中遇到的各种难题,另一方面是希望读者能吸收Spring设计和实现中的优秀方法和思想。

    全书共三部分,分别阐述了Spring的核心、组件和应用。第一部分详细分析了IOC容器和AOP实现,第二部分阐述了基于Spring IOC容器和AOP的Java EE组件在Spring中的实现,第三部分讲述了一些基于Spring的典型应用的实现。

    本篇先对设计理念和整体架构做个概述,从整体上看看Spring的设计目标和架构,通过本篇,你会了解到:

    • Spring的设计目标
    • Spring的整体架构
    • Spring的各个子项目介绍

    设计目标

    简单来说,Spring的设计目标是为我们提供一个一站式的轻量级应用开发平台,抽象了应用开发中遇到的共性问题。

    作为平台,它考虑到了企业应用资源的使用,比如数据的持久化、数据集成、事务处理、消息中间件、分布式式计算等高效可靠处理企业数据方法的技术抽象。

    轻量级是相对于传统J2EE而言的,传统的J2EE开发,需要依赖按照J2EE规范实现的J2EE应用服务器,设计和实现时,需要遵循一系列的接口标准,这种开发方式耦合性高,使应用在可测试性和部署上都有影响,对技术的理解和要求相对较高。

    使用Spring进行开发,对开发人员比较轻量,可以使用POJO和JavaBean的开发方式,使应用面向接口开发,充分支持了面向对象的设计方法。通过IOC容器减少了直接耦合,通过AOP以动态和非侵入的方式增加了服务的功能,为灵活选取不同的服务实现提供了基础,这也是Spring的核心。

    开发过程中的共性问题,Spring封装成了各种组件,而且Spring通过社区,形成了一个开放的生态系统,比如Spring Security就是来源于一个社区贡献Acegi.

    整体架构

    从总体来看,Spring分为3层,最底层是核心层,包括IOC、AOP等核心模块,中间层是封装的JavaEE服务、作为中间的驱动组件,最上层是各个应用。

    下图是Spring官网的一个架构图,介绍下其组成部分:

    Spring Framework架构图

    核心容器

    由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的控制反转容器中取回对象。

    AOP和服务器工具

    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

    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 Boot

    简化新Spring应用的初始搭建以及开发过程,使用特定的方式进行配置,使开发人员不再需要定义样板化的配置,实现快速开发。

    Spring Cloud

    为分布式系统开发提供工具集,基于Spring Boot,为基于JVM的云应用开发中的配置管理、服务发现、断路器、智能路由、控制总线、全局锁、决策竞选、分布式会话、集群状态管理等操作提供了一种简单的开发方式,其下有很多子项目:

    • 分布式/版本化配置:Spring Cloud Config
    • 服务注册和发现:Netflix Eureka 或者 Spring Cloud Eureka(对前者的二次封装)
    • 路由:Spring Cloud Zuul,基于 Netflix Zuul
    • service - to - service调用:Spring Cloud Feign
    • 负载均衡:Spring Cloud Ribbon 基于 Netflix Ribbon 实现
    • 断路器:Spring Cloud Hystrix
    • 分布式消息传递:Spring Cloud Bus

    Spring Cloud Data Flow

    Data flow 是一个用于开发和执行大范围数据处理、批量运算、持续运算的统一编程模型和托管服务。

    Spring Cloud Data Flow 是基于原生云对Spring XD的重新设计,项目目标是简化大数据应用的开发。Spring XD的流处理和批处理模块的重构分别基于spring boot的stream和task/batch的微服务程序。这些程序原生的支持像 Apache YARN、Apache Mesos和Kubernetes等现代运行环境,都是自动部署单元。

    Spring Data

    数据访问模块,提供了对JDBC及ORM很好的支持,随着NOSQL和BigData的兴起,出现了越来越多的新技术,比如非关系型数据库、MapReduce框架,为了让spring开发者能更方便地使用这些新技术,通过Spring Data,开发者可以用Spring提供的相对一致的方式访问位于不同类型的数据存储中的数据。

    Spring Data

    Spring Integration

    在企业软件开发过程中,经常会遇到与外部系统集成,Spring Integration为Spring编程模型提供了一个支持企业集成模式的扩展,在应用程序中提供轻量级的消息机制,通过声明式的适配器与外部系统进行集成。

    Spring Integraton中有几个基本的概念:

    • Message:带有元数据的Java对象;
    • Channel:传递消息的管道;
    • Message Endpoint:消息的处理端,在处理端可以对消息进行转换、路由、过滤、拆分、聚合等操作;

    还可以使用Channel Adapter,这是应用程序与外界交互的地方,输入是Inbound、输出则是Outbound,可选的连接类型有很多,比如AMQP、JDBC、Web Services、FTP、JMS、XMPP、多种NoSQL数据库等等。只需通过简单的配置文件就能将所有这些东西串联在一起,实现复杂的集成工作。

    Spring Batch

    简化及优化大量数据的批处理操作,支持事务、并发、流程、监控、纵向和横向扩展,提供统一的接口管理和任务管理。

    例如它提供了很多方法来读取大型的文件(比如1GB的CSV、XML文件),在数据库中加载或更新几万甚至几十万条记录,如果直接select出所有记录,以至于拖垮整个系统,而使用了Spring Batch,框架会帮助他每次捞取一部分记录进行分页,在更新时分批进行提交。

    Spring Security

    一款Spring的认证和安全工具。其前身是Acegi,目标是为Spring应用提供一个安全服务,比如用户认证、授权等。

    它使用Servlet规范中的Filter保护Web请求并限制URL级别的访问,还能够使用Spring AOP保护方法调用——借助于对象代理和使用通知,能够确保只有具备适当权限的用户才能访问安全保护的方法。

    它非常灵活,能够基于各种数据存储来认证用户。它内置了多种常见的用户存储场景,如内存、关系型数据库以及LDAP,还可以编写并插入自定义的用户存储实现。

    Spring HATEOAS

    先来理解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提供了相关的支持。

    Spring Rest DOCS

    可以生成准确可读的RESTful Service文档,Spring 官方文档都是用Spring REST Docs生成的。

    基于单元测试生成文档片段,不会侵入到源码中,所以就不会使得源码变得越来越臃肿,支持markdown,修改一行配置代码即可支持生成 MarkDown 语法的文档片段。

    默认的,在构建的时候,会首先运行单元测试,便生成了文档片段,然后在打包时,通过添加 asciidoctor-maven-plugin 插件即可生成最终的文档,只要是规范的开发过程,文档都会随版本的每次发布而自动更新。

    Spring Social

    使用 Spring Social 的最大好处在于它已经提供了对主流社交网站的支持,只需要简单配置即可,对于一些不太常用的社交网站,也可以从社区中找到相应的组件。

    Spring AMQP

    基于Spring框架的AMQP消息解决方案,提供模板化的发送和接收消息的抽象层,提供基于消息驱动的POJO,使在Spring应用中使用AMQP消息服务器变得更为简单,SpringSource旗下的Rabbit MQ就是一个开源的基于AMQP的消息服务器。

    Spring Web Flow

    Spring Web Flow是Spring MVC 的扩展,它支持开发基于流程的应用程序。它将流程的定义与实现流程行为的类和视图分离开来,具有同时处理多个HTTP请求、管理会话状态、数据事务处理,支持AJAX来构建丰富的客户端体验,并且提供对JSF的支持。

    Spring LDAP

    Spring LDAP是一个用于操作LDAP的Java框架。它是基于Spring的JdbcTemplate模式,能够帮助开发人员简化操作。

    Spring Session

    Spring Session提供了一套创建和管理Servlet HttpSession的方案。Spring Session提供了集群Session功能,默认采用外置的Redis来存储Session数据,以此来解决Session共享的问题。

    Spring Shell

    Spring Shell提供交互式的Shell,可以让你使用简单的基于Spring的编程模型来开发命令。

    Spring Kafka

    spring for kafka对原生的kafka client consumer的封装与集成。

    Spring Statemachine

    它的主要功能是帮助开发者简化状态机的开发过程,让状态机结构更加层次化。

    Spring IO Platform

    可以认为是一个依赖维护平台,该平台将相关依赖汇聚到一起,针对每个依赖,都提供了一个版本号。

    主要是解决依赖版本冲突问题,在使用Spring的时候,经常会使用到第三方库,一般大家都是根据经验挑选一个版本号或挑选最新的,风向较大,很容易冲突。

    Spring IO Platform能很好地解决这些问题,我们在添加第三方依赖的时候,不需要写版本号,它能够自动帮我们挑选一个最优的版本。


    作者:情情说
    链接:https://juejin.im/post/5b012b00518825673564cbbe
    来源:掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    POJ 1811 Prime Test 素性测试 分解素因子
    sysbench的安装与使用
    电脑中已有VS2005和VS2010安装.NET3.5失败的解决方案
    I.MX6 show battery states in commandLine
    RPi 2B Raspbian system install
    I.MX6 bq27441 driver porting
    I.MX6 隐藏电池图标
    I.MX6 Power off register hacking
    I.MX6 Goodix GT9xx touchscreen driver porting
    busybox filesystem httpd php-5.5.31 sqlite3 webserver
  • 原文地址:https://www.cnblogs.com/jiangwz/p/9213413.html
Copyright © 2011-2022 走看看