本篇内容包括:Spring/SpringFrame 概述、Spring IOC 和 AOP 概述、Spring 全家桶内容概述(包括:Spring Boot、Spring Cloud、Spring Cloud data flow …)等内容!
Spring 是一个生态体系(也可以说是技术体系),是集大成者,它包含了 Spring Framework、Spring Boot、Spring Cloud 等(还包括Spring Cloud data flow、spring data、spring integration、spring batch、spring security、spring hateoas),我们常提到的 IOC、AOP 等概念实际上是来源于 Spring Framework。
Spring Framewor 框架是 Java 平台的一个开源的全栈(full-stack)应用程序框架和控制反转容器实现,一般也被直接称为 Spring。该框架的一些核心功能理论上可用于任何 Java 应用,但 Spring Framewor 还为基于 Java 企业版平台构建的 Web 应用提供了大量的拓展支持。Spring Framewor 没有直接实现任何的编程模型,但它已经在 Java 社区中广为流行,基本上完全代替了企业级 JavaBeans(EJB)模型。
Spring Framewor 框架以 Apache License 2.0 开源许可协议的形式发布,该框架最初由 Rod Johnson 以及 Juergen Hoeller 等人开发。
Spring 官方对 Spring Framework 简短描述:为依赖注入、事务管理、WEB应用、数据访问等提供了核心的支持。Spring Framework 专注于企业级应用程序的“管道”,以便开发团队可以专注于应用程序的业务逻辑。
Ps:千万不要把 Spring 和 Spring Framework 搞混淆了,很多文章都错误的定义了 spring:spring 是一个一站式的轻量级的 Java开发框架,核心是控制反转(IoC)和面向切面(AOP),针对于开发的 Web层(springMVC)、业务层(IoC)、持久层等都提供了多种配置解决方案。这是 Spring Framework 的定义,至于 Spring,是整个生态。
IoC(Inversion of control )即“控制反转”,它是一种设计思想而非一个技术实现。描述了 Java 开发领域对象的创建以及管理的问题。通过 Spring 来管理对象的创建、配置和生命周期,这样相当于把控制权交给了 Spring,不需要人工来管理对象之间复杂的依赖关系,这样做的好处就是解耦。
从以上两种开发方式的对比来看:我们 “丧失了一个权力” (创建、管理对象的权力),从而也得到了一个好处(不用再考虑对象的创建、管理等一系列的事情)
AOP(Aspect oriented programming),即面向切面编程,它是一个编程范式,是 OOP(面向对象编程)的一种延续,目的就是提高代码的模块性。
Spring AOP 基于动态代理的方式实现,如果是实现了接口的话就会使用 JDK 动态代理,反之则使用 CGLIB 代理,Spring中 AOP 的应用主要体现在 事务、日志、异常处理等方面,通过在代码的前后做一些增强处理,可以实现对业务逻辑的隔离,提高代码的模块化能力,同时也是解耦。Spring主要提供了 Aspect 切面、JoinPoint 连接点、PointCut 切入点、Advice 增强等实现方式。
但是,无论 Spring Framework 接口如何简化,设计如何优美,始终无法摆脱被动的境况:由于它自身并非容器,所以基本上不得不随 JavaEE 容器启动而装载,例如 Tomcat、Jetty、JBoss 等。然而 Spring Boot 的出现,改变了 Spring Framework 甚至整个 Spring 技术体系的现状(摘自小马哥的《SpringBoot编程思想》)。
Spring Boot 这家伙简直就是对 Java 企业级应用开发进行了一场浩浩荡荡的革命。如果稍微有几年工作经验的老油条,应该都记得以前的 Java Web 开发模式:Tomcat + WAR包。WEB项目基于spring framework,项目目录一定要是标准的 WEB-INF + classes + lib,而且大量的 xml 配置。如果说,以前搭建一个 SSH 架构的Web项目需要 1 个小时,那么现在应该 10 分钟就可以了。
Spring Boot 能够让你非常容易的创建一个单机版本、生产级别的基于 spring framework 的应用。然后,"just run"即可。Spring Boot 默认集成了很多第三方包,以便你能以最小的代价开始一个项目。
官方对 Spring Boot 的定义:
Spring Boot is designed to get you up and running as quickly as possible, with minimal upfront configuration of Spring. Spring Boot takes an opinionated view of building production-ready applications.
即 Spring Boot 为快速启动且最小化配置的 Spring 应用而设计,并且它具有用于构建生产级别应用的一套固化的视图。这里的固化的视图,笔者认为可以理解成 Spring Boot 的约定,因为Spring Boot 的设计是约定大于实现的。
Spring Cloud 事实上是一整套基于 Spring Boot 的微服务解决方案。它为开发者提供了很多工具,用于快速构建分布式系统的一些通用模式,例如:配置管理、注册中心、服务发现、限流、网关、链路追踪等。
Data flow 是一个用于开发和执行大范围数据处理其模式包括ETL,批量运算和持续运算的统一编程模型和托管服务。对于在现代运行环境中可组合的微服务程序来说,spring cloud data flow是一个原生云可编配的服务。
使用 spring cloud data flow,开发者可以为像数据抽取,实时分析,和数据导入/导出这种常见用例创建和编配数据通道 (data pipelines)。
Spring cloud data flow 是基于原生云对 spring XD的重新设计,该项目目标是简化大数据应用的开发。
Spring XD 的流处理和批处理模块的重构分别是基于 spring boot的stream 和 task/batch 的微服务程序。这些程序现在都是自动部署单元而且他们原生的支持像 Cloud Foundry、Apache YARN、Apache Mesos和Kubernetes 等现代运行环境。
Spring cloud data flow 为基于微服务的分布式流处理和批处理数据通道提供了一系列模型和最佳实践。
Spring Data 是Spring 的一个子项目, 旨在统一和简化对各类型持久化存储, 而不拘泥于是关系型数据库还是NoSQL 数据存储。无论是哪种持久化存储, 数据访问对象(或称作为DAO,即Data Access Objects)通常都会提供对单一域对象的CRUD (创建、读取、更新、删除)操作、查询方法、排序和分页方法等。Spring Data 则提供了基于这些层面的统一接口(CrudRepository,PagingAndSortingRepository)以及对持久化存储的实现。
Spring Integration 在基于 Spring 的应用程序中实现轻量级消息传递,并支持通过声明适配器与外部系统集成。 Spring Integration的主要目标是提供一个简单的模型来构建企业集成解决方案,同时保持关注点的分离,这对于生成可维护,可测试的代码至关重要。Spring Framework鼓励开发人员使用接口进行编码,并使用依赖注入(DI)为普通旧Java对象(POJO)提供执行其任务所需的依赖项。 Spring Integration 将这一概念更进一步,其中POJO使用消息传递范例连接在一起,并且各个组件可能不了解应用程序中的其他组件。这种应用程序是通过组装细粒度可重用组件来构建的,以形成更高级别的功能。通过精心设计,这些流程可以模块化,并在更高的层次上重复使用。
Spring Batch 是一个轻量级的、完善的批处理框架,旨在帮助企业建立健壮、高效的批处理应用。Spring Batch 是 Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使得已经使用 Spring 框架的开发者或者企业更容易访问和利用企业服务。
Spring Batch 提供了大量可重用的组件,包括了日志、追踪、事务、任务作业统计、任务重启、跳过、重复、资源管理。对于大数据量和高性能的批处理任务,Spring Batch 同样提供了高级功能和特性来支持,比如分区功能、远程功能。总之,通过 Spring Batch 能够支持简单的、复杂的和大数据量的批处理作业。
Spring Security 是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在 Spring 应用上下文中配置的 Bean,充分利用了 Spring IoC,DI(控制反转 Inversion of Control ,DI:Dependency Injection 依赖注入)和 AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。