[Spring] 概述

不知不觉已经捣鼓了小半年的 Java 了,主要一直在使用 Spring boot 来开发,但是由于 Spring boot 使用起来太过简单了,虽然做了这么久但是对 Spring 框架、工作原理等还是一头雾水,很多东西不理解也不知道,所以决定从头开始看 Spring,从最基础最简单的 Spring 开始学习。本篇先来从概念的层面了解一下 Spring。

Spring

Spring Framework 是一个提供完善的基础设施用来支持来开发 Java 应用程序的 Java 平台。Spring 负责基础设施功能,使程序员可以专注于应用的开发。

简单的来说 Spring 是一个轻量级的 Java 开发框架。通过启用基于 POJO 编程模型来促进良好的编程实践。

Spring 为了减轻 Java 开发的复杂性,采用一下四种核心策略:

  • 基于 POJO 的轻量级和最小侵入式编程;
  • 通过依赖注入和面向接口编程实现松耦合;
  • 基于切面和惯例进行声明式编程;
  • 通过切面和模板减少样板式代码。

使用 Spring 的好处:

  • 使 Java 方法可以执行数据库事务而不用去处理事务 API。
  • 使本地 Java 方法可以执行远程过程而不用去处理远程 API。
  • 使本地 Java 方法可以拥有管理操作而不用去处理 JMX API。
  • 使本地 Java 方法可以执行消息处理而不用去处理 JMS API。

Spring 核心功能

Spring 的核心功能有两个

  • Spring容器作为超级大工厂,负责创建、管理所有的Java对象,这些Java对象被称为Bean。
  • Spring容器管理容器中Bean之间的依赖关系,Spring使用一种被称为”依赖注入”的方式来管理Bean之间的依赖关系。

Spring 核心特性

  • 依赖注入(DI)
  • 面向切面编程(AOP)

POJO

POJO 是 Plain Old Java Object 的简称,POJO 和 JavaBean、EJB 一样是 Java 编程规范中的一种规范,并不是指一个特定的对象或者什么。POJO 的最原始的出处是《POJOs in Action》里面:

The term was coined while Rebecca Parsons, Josh MacKenzie and I were preparing for a talk at a conference in September 2000. In the talk we were pointing out the many benefits of encoding business logic into regular java objects rather than using Entity Beans. We wondered why people were so against using regular objects in their systems and concluded that it was because simple objects lacked a fancy name. So we gave them one, and it’s caught on very nicely.

大概的意思就是要将业务逻辑编码为常规java对象而不是使用实体Bean,并给这个常规的 Java 对象起了一个名字——POJO。

一个 POJO 应该是一个正规的 Java 对象,不但当任何特殊角色,也不实现任何 Java 框架指定的接口。它可以包含一些业务处理或持久化逻辑等。

Spring 的强大之处就是非侵入式的使用 POJO 从而使 POJO 发挥更大的功能。这样的好处是显而易见的,非侵入就意味着这个类在任何场所都可以使用。Spring 使用 POJO 的方式之一就是通过依赖注入来装配他们。

依赖注入

首先什么是依赖,在一个工程中,相互协作的类就叫做相互依赖。举个例子,类 A 中有一个成员变量 B,则可以说 A 依赖 B。传统的编程中,需要自己管理与依赖的对象,比如 New 一个,或者销毁等等,这样必然带来高度的耦合以及增加测试难度。依赖注入能很好的解决这些问题。

依赖注入(Dependency Injection,简称DI)可以看做是一个负责协调各对象的第三方组件,对象的依赖关系由这个第三方组件在创建对象的时候设定,它会将锁的关系自动交给目标对象,对象无需自己创建或者管理它们的依赖关系。

依赖注入能够让相互协作的软件组件保持松耦合。

面向切面编程

面向切面编程(Aspect-oriented Programming,简称AOP)允许把遍布在应用软件各处的功能分离出来形成可重用的组件。

切面可以理解为横贯整个应用程序过程的一些功能,比如打印日志,缓存数据等等。

最常见的通用功能实现技术是继承和委托,但是整个应用都使用相同的基类会使耦合度太高而且系统很脆弱,而委托可能需要对委托的对象进行复杂的调用。而面向切面就是将横贯整个应用的一些功能模块化为特殊的类,这些类就被成为切面(aspect)。

而 Spring 提供了四种对 AOP 的支持:

  • 基于代理的经典 Spring AOP;
  • 纯 POJO 切面;
  • @AspectJ 注解驱动的切面;
  • 注入式 AspectJ 切面。

Spring AOP 的构建是建立在动态代理基础上的。

个人理解: DI 是帮助 Spring 组件间即应用对象间的解耦,而 AOP 则更注重的是功能间的解耦,即业务逻辑与横贯应用的通用功能间的解耦。

Spring 模块

Spring 框架包含20个不同的模块,在开发中可以根据不同需求选择不同的模块。

  • Spring 核心容器

    容器是 Spring 框架最核心的部分,它管理着 Spring 应用中 bean 的创建、配置和管理。还包括了 Spring bean 工厂、Spring 应用上下文、一些企业服务等。

  • 面向切面编程

    在 AOP 模块中,Spring 对面向切面编程提供的支持就是基于该模块的。

  • 数据访问与集成

    该模块提供了抽象了 JDBC 和 DAO 等的样板代码,使数据库连接服务变得简单,而且不用不关心数据库的关闭等操作。ORM 模块是对较为流行的 ORM 框架的集成, Hibernate、Java Data Object等。还包括消息服务,以及基于 AOP 模块的事务管理服务。

  • Web 与远程调用

    该模块提供了一个强大的 MVC 框架,同时还提供了一些其他远程调用框架 HTTP invoker,还提供了对 REST API 的支持。

  • Instrumentation

    提供了为 JVM 添加代理的功能,具体讲就是为 Tomcat 添加一个代理能够为 Tomcat 传递类文件。

  • 测试

    Spring 专门提供了对 Spring 应用测试的支持,比如为单元测试提供 mock 对象的实现等。

结语

通过上面的整理以及一些自己的理解,总算对 Spring 在整体上有一个理解,简单来说 Spring 是一个致力于让 Java 开发变得简单的框架,它的核心在于 DI 和 AOP,通过 DI 和 AOP 来实现代码以及功能模块间的松耦合。因此理解 DI 和 AOP 至关重要。

DI 是组装 Spring 组件的一种方式,在运行期赋予一个对象所依赖的对象。

AOP 能够将一些通用的功能模块化即切面。当 Spring 装配 bean 的时候,这些切面能够在运行期应用到目标对象。