Spring-CheatSheet

Spring CheatSheet | Spring概念、使用与实践

Spring的设计目标是为我们提供一个一站式的轻量级应用开发平台,抽象了应用开发中遇到的共性问题。作为平台,它考虑到了企业应用资源的使用,比如数据的持久化、数据集成、事务处理、消息中间件、分布式式计算等高效可靠处理企业数据方法的技术抽象。开发过程中的共性问题,Spring封装成了各种组件,而且Spring通过社区,形成了一个开放的生态系统,比如Spring Security就是来源于一个社区贡献。

使用Spring进行开发,对开发人员比较轻量,可以使用POJOJavaBean的开发方式,使应用面向接口开发,充分支持了面向对象的设计方法。通过IOC容器减少了直接耦合,通过AOP以动态和非侵入的方式增加了服务的功能,为灵活选取不同的服务实现提供了基础,这也是Spring的核心。轻量级是相对于传统J2EE而言的,传统的J2EE开发,需要依赖按照J2EE规范实现的J2EE应用服务器,设计和实现时,需要遵循一系列的接口标准,这种开发方式耦合性高,使应用在可测试性和部署上都有影响,对技术的理解和要求相对较高。

架构与生态圈

image

Java Web关键技术

Java Servlet(Java服务器小程序)是一个基于Java技术的Web组件,运行在服务器端,它由Servlet容器所管理,用于生成动态的内容。Servlet是平台独立的Java类,编写一个Servlet,实际上就是按照Servlet规范编写一个Java类。Servlet被编译为平台独立 的字节码,可以被动态地加载到支持Java技术的Web服务器中运行。

Servlet容器也叫做Servlet引擎,是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于MIME的请求,格式化基于MIME的响应。Servlet没有main方法,不能独立运行,它必须被部署到Servlet容器中,由容器来实例化和调用Servlet的方法(如doGet()doPost()Servlet容器在Servlet的生命周期内包容和管理Servlet。在JSP技术 推出后,管理和运行Servlet/JSP的容器也称为Web容器。

有了Servlet之后,用户通过单击某个链接或者直接在浏览器的地址栏中输入URL来访问ServletWeb服务器接收到该请求后,并不是将 请求直接交给Servlet,而是交给Servlet容器。Servlet容器实例化Servlet,调用Servlet的一个特定方法对请求进行处理,并产生一个响应。这个响应由Servlet容器返回给Web服务器,Web服务器包装这个响应,以HTTP响应的形式发送给Web浏览器。

Servlet容器

  • 通信支持:利用容器提供的方法,你能轻松的让servletweb服务器对话,而不用自己建立serversocket、监听某个端口、创建流等 等。容器知道自己与web服务器之间的协议,所以你的servlet不用担心web服务器(如Apache)和你自己的web代码之间的API,只需要考 虑如何在servlet中实现业务逻辑(如处理一个订单

  • 生命周期管理:servlet容器控制着servlet的生与死,它负责加载类、实例化和初始化servlet,调用servlet方法,以及使servlet实例被垃圾回收,有了servlet容器,你不需要太多的考虑资源管理。

  • 多线程支持:容器会自动为它所接收的每个servlet请求创建一个新的java线程。针对用户的请求,如果servlet已经运行完相应的http服务方法,这个线程就会结束。这并不是说你不需要考虑线程安全性,其实你还会遇到同步问题,不过这样能使你少做很多工作。

  • 声明方式实现安全:利用servlet容器,你可以使用xml部署描述文件来配置和修改安全性,而不必将其硬编码写到servlet类代码中。

  • JSP支持:servlet容器负责将jsp代码翻译为真正的java代码。

根据Servlet容器工作模式的不同,可以将Servlet容器分为以下三类:

1)独立的Servlet容器

当我们使用基于Java技术的Web服务器时,Servlet容器作为构成Web服务器的一部分而存在。然而大多数的Web服务器并非基于Java,因此,就有了下面两种Servlet容器的工作模式。

2)进程内的Servlet容器

Servlet容器由Web服务器插件和Java容器两部分的实现组成。Web服务器插件在某个Web服务器内部地址空间中打开一个JVMJava虚拟机,使得Java容器可以在此JVM中加载并运行Servlet。如有客户端调用Servlet的请求到来,插件取得对此请求的控 制并将它传递(使用JNI技术)给Java容器,然后由Java容器将此请求交由Servlet进行处理。进程内的Servlet容器对于单进程、多线程 的服务器非常适合,提供了较高的运行速度,但伸缩性有所不足。

3)进程外的Servlet容器

Servlet容器运行于Web服务器之外的地址空间,它也是由Web服务器插件和Java容器两部分的实现组成的。Web服务器插件和Java容 器(在外部JVM中运行)使用IPC机制(通常是TCP/IP)进行通信。当一个调用Servlet的请求到达时,插件取得对此请求的控制并将其传递(使 用IPC机制)给Java容器。进程外Servlet容器对客户请求的响应速度不如进程内的Servlet容器,但进程外容器具有更好的伸缩性和稳定性。

内建模块

核心容器由spring-core、spring-beans、spring-context、spring-context-supportspring-expression模块组成:

  • spring-corespring-beans提供框架的基础部分,包括IOC功能,BeanFactory是一个复杂的工厂模式的实现,将配置和特定的依赖从实际程序逻辑中解耦。

  • context模块建立在corebeans模块的基础上,增加了对国际化的支持、事件广播、资源加载和创建上下文,ApplicationContextcontext模块的重点。

  • 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针对tomcatinstrument实现。

消息组件

  • Spring 4包含了spring-messaging模块,从spring集成项目中抽象出来,比如Messge、MessageChannel、MessageHandler及其他用来提供基于消息的基础服务。

数据访问和集成层由JDBC、ORM、OXM、JMS和事务模块组成。

  • spring-jdbc模块提供了不需要编写冗长的JDBC代码和解析数据库厂商特有的错误代码的JDBC抽象出。

  • spring-tx模块提供可编程和声明式事务管理。

  • spring-orm模块提供了领先的对象关系映射API集成层,如JPAHibernate等。

  • spring-oxm模块提供抽象层用于支持Object/XML maping的实现,如JAXBXStream等。

  • spring-jms模块包含生产和消费消息的功能,从Spring4.1开始提供集成spring-messaging模块。

Web层包含spring-web、spirng-webmvc、spring-websocketspring-webmvc-portlet等模块。

  • spring-web模块提供了基本的面向web开发的集成功能,例如多文件上传、使用servert listenersweb开发应用程序上下文初始化IOC容器。也包含HTTP客户端以及spring远程访问的支持的web相关部分。

  • spring-webmvc包含springmodel-view-controllerREST web services实现的Web应用程序。

  • spring-webmvc-portlet模块提供了MVC模式的portlet实现,protletServlet的最大区别是请求的处理分为actionrender阶段,在一个请求中,action阶段只执行一次,但render阶段可能由于用户的浏览器操作而被执行多次。

传统的Spring MVC基于Servlet API构建,使用单请求单线程处理的同步阻塞型模型;而Spring WebFlux则是Reactive Stack,能够充分利用现代多核处理器的特性,从底层机制上保证了对于海量并发请求处理的能力。WebFlux使用Netty, Servlet 3.1+ Containers替代传统的Servlet Containers,使用Reactive Stream Adapters替代Servlet API,使用Spring Security Reactive替代Spring Security,使用Spring Data Reactive Repositories替代Spring Data Repositories

spring-test模块支持通过组合JunitTestNG来进行单元测试和集成测试,提供了连续的加载ApplicationContext并且缓存这些上下文。

生态圈

Spring Boot简化新Spring应用的初始搭建以及开发过程,使用特定的方式进行配置,使开发人员不再需要定义样板化的配置,实现快速开发。数据访问模块,提供了对JDBCORM很好的支持,随着NOSQLBigData的兴起,出现了越来越多的新技术,比如非关系型数据库、MapReduce框架,为了让spring开发者能更方便地使用这些新技术,通过Spring Data,开发者可以用Spring提供的相对一致的方式访问位于不同类型的数据存储中的数据。Spring Cloud Data Flow是基于原生云对Spring XD的重新设计,项目目标是简化大数据应用的开发。Spring XD的流处理和批处理模块的重构分别基于spring bootstreamtask/batch的微服务程序。这些程序原生的支持像Apache YARNApache MesosKubernetes等现代运行环境,都是自动部署单元。

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 Batch简化及优化大量数据的批处理操作,支持事务、并发、流程、监控、纵向和横向扩展,提供统一的接口管理和任务管理。例如它提供了很多方法来读取大型的文件(比如1GBCSVXML文件,在数据库中加载或更新几万甚至几十万条记录,如果直接select出所有记录,以至于拖垮整个系统,而使用了Spring Batch,框架会帮助他每次捞取一部分记录进行分页,在更新时分批进行提交。

Spring Security是一款Spring的认证和安全工具。其前身是Acegi,目标是为Spring应用提供一个安全服务,比如用户认证、授权等。它使用Servlet规范中的Filter保护Web请求并限制URL级别的访问,还能够使用Spring AOP保护方法调用——借助于对象代理和使用通知,能够确保只有具备适当权限的用户才能访问安全保护的方法。它非常灵活,能够基于各种数据存储来认证用户。它内置了多种常见的用户存储场景,如内存、关系型数据库以及LDAP,还可以编写并插入自定义的用户存储实现。

上一页
下一页