「Java学习」Spring框架简介

新的一年伊始,由于公司内部组织架构调整,本来是做Android方面开发的,近来要转做下发接口开发,不可避免就要去学习Java服务端开发。不能因为不是自己想做的岗位,就跳槽换工作吧,要适应变化,况且现在外面Android岗位面临饱和,倒是招聘Java程序员的需求一直没变,同时,程序员强大的学习能力此刻就能体现出来,熟悉下服务端的开发框架和流程,不管最新的技术如何演变,经典得始终是不变的,况且IOC和AOP一直是经典中的经典。因为要学习,就需要记录、沉淀、积累,所以就以写笔记的方式来见证学习的成长。

那么这篇文章主要介绍的是Spring整体框架,你要学习的内容,刚开始肯定要有一个大局观,要有一个整体的概念,我学的是什么,有什么作用,能给我带来什么,帮助我做什么,它背后实现的原理又是如何,这样才能在用的时候知其然而所以然。

那么就从以下几个方面开始介绍:

  • Spring是什么
  • Spring带来了什么
  • Spring有什么好处
  • Spring结构图
  • Spring应用场景
  • 小结

Spring是什么

从官网文档看:

The Spring Framework is a lightweight solution and a potential one-stop-shop for building your enterprise-ready applications. However, Spring is modular, allowing you to use only those parts that you need, without having to bring in the rest. You can use the IoC container, with any web framework on top, but you can also use only theHibernate integration code or the JDBC abstraction layer. The Spring Framework supports declarative transaction management, remote access to your logic through RMI or web services, and various options for persisting your data. It offers a full-featured MVC framework, and enables you to integrate AOP transparently into your software.

Spring is designed to be non-intrusive, meaning that your domain logic code generally has no dependencies on the framework itself. In your integration layer (such as the data access layer), some dependencies on the data access technology and the Spring libraries will exist. However, it should be easy to isolate these dependencies from the rest of your code base.

一句话,Spring是一个开发应用框架,什么样的框架呢,有这么几个标签:轻量级非侵入式一站式模块化,其目的是用于简化企业级应用程序开发。我们知道应用程序是由一组相互协作的对象组成,而在传统应用程序开发中,一个完整的应用是由一组相互协作的对象组成。所以开发一个应用除了要开发业务逻辑之外,最多的是关注如何使这些对象协作来完成所需功能,而且要低耦合、高内聚。业务逻辑开发是不可避免的,那如果有个框架出来帮我们来创建对象及管理这些对象之间的依赖关系。当然,我们也可以通过自我能力,利用前人总结出来的设计模式来进行我们的架构设计,比如常见的「工厂模式」、「代理模式」等,总共有23种模式,利用别人总结的轮子来进行我们自己轮子建造,但如何这些轮子建造专门交给一个叫做Spring的人去帮你做,你只需要专心你的业务逻辑,是不是省心很多,同时这个叫Spring干的又专业又稳定,何乐而不为呢。

从这里我们可以认为Spring是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力,从而使我们可以更自由的选择到底使用什么技术进行开发。

Spring带来了什么

Spring除了不能帮我们写业务逻辑,却能帮助我们简化开发,有以下几点:

  1. Spring能帮我们根据配置文件创建及组装对象之间的依赖关系。
  2. Spring面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。
  3. Spring能非常简单的帮我们管理数据库事务。
  4. Spring还提供了与第三方数据访问框架(如Hibernate、JPA)无缝集成,而且自己也提供了一套JDBC访问模板,来方便数据库访问。
  5. Spring还提供与第三方Web(如Struts、JSF)框架无缝集成,而且自己也提供了一套Spring MVC框架,来方便web层搭建。
  6. Spring能方便的与Java EE(如Java Mail、任务调度)整合,与更多技术整合(比如缓存框架)。

Spring有什么好处

在看Spring的好处之前,先来理解以下几个专业名词:

  • 应用程序:是能完成我们所需要功能的成品,比如购物网站、OA系统、ERP系统。
  • 框架:是能完成一定功能的半成品,比如我们可以使用框架进行购物网站开发;框架做一部分功能,我们自己做一部分功能,这样应用程序就创建出来了。而且框架规定了你在开发应用程序时的整体架构,提供了一些基础功能,还规定了类和对象的如何创建、如何协作等,从而简化我们开发,让我们专注于业务逻辑开发。
  • 非侵入式设计:从框架角度可以这样理解,无需继承框架提供的类,这种设计就可以看作是非侵入式设计,如果继承了这些框架类,就是侵入设计,如果以后想更换框架之前写过的代码几乎无法重用,如果非侵入式设计则之前写过的代码仍然可以继续使用。
  • 轻量级&重量级:轻量级是相对于重量级而言的,轻量级一般就是非入侵性的、所依赖的东西非常少、资源占用非常少、部署简单等等,其实就是比较容易使用,而重量级正好相反。
  • POJO:POJO(Plain Old Java Objects)简单的Java对象,它可以包含业务逻辑或持久化逻辑,但不担当任何特殊角色且不继承或不实现任何其它Java框架的类或接口。
  • 容器:在日常生活中容器就是一种盛放东西的器具,从程序设计角度看就是装对象的的对象,因为存在放入、拿出等操作,所以容器还要管理对象的生命周期。
  • 控制反转:即Inversion of Control,缩写为IoC,控制反转还有一个名字叫做依赖注入(Dependency Injection),就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。
  • Bean:一般指容器管理对象,在Spring中指Spring IoC容器管理对象。

那么用Spring框架到底有什么好处呢?好处如下:

  • 非常轻量级的容器:以集中的、自动化的方式进行应用程序对象创建和装配,负责对象创建和装配,管理对象生命周期,能组合成复杂的应用程序。Spring容器是非侵入式的(不需要依赖任何Spring特定类),而且完全采用POJOs进行开发,使应用程序更容易测试、更容易管理。而且核心JAR包非常小,Spring3.0.5不到1M,而且不需要依赖任何应用服务器,可以部署在任何环境(Java SE或Java EE)。
  • AOP:AOP是Aspect Oriented Programming的缩写,意思是面向切面编程,提供从另一个角度来考虑程序结构以完善面向对象编程(相对于OOP),即可以通过在编译期间、装载期间或运行期间实现在不修改源代码的情况下给程序动态添加功能的一种技术。通俗点说就是把可重用的功能提取出来,然后将这些通用功能在合适的时候织入到应用程序中;比如安全,日记记录,这些都是通用的功能,我们可以把它们提取出来,然后在程序执行的合适地方织入这些代码并执行它们,从而完成需要的功能并复用了这些功能。
  • 简单的数据库事务管理:在使用数据库的应用程序当中,自己管理数据库事务是一项很让人头疼的事,而且很容易出现错误,Spring支持可插入的事务管理支持,而且无需JEE环境支持,通过Spring管理事务可以把我们从事务管理中解放出来来专注业务逻辑。
  • JDBC抽象及ORM框架支持:Spring使JDBC更加容易使用;提供DAO(数据访问对象)支持,非常方便集成第三方ORM框架,比如Hibernate等;并且完全支持Spring事务和使用Spring提供的一致的异常体系。
  • 灵活的Web层支持:Spring本身提供一套非常强大的MVC框架,而且可以非常容易的与第三方MVC框架集成,比如Struts等。
  • 简化各种技术集成:提供对Java Mail、任务调度、JMX、JMS、JNDI、EJB、动态语言、远程访问、Web Service等的集成。

Spring结构图

spring概述图

从中可以看到Spring Framework差不多有20个模块组成,这些模块分为核心容器,数据访问/集成,Web,AOP(面向方面的编程),Instrumentation,消息传递和测试,如上图所示。

Core Container模块,包含spring-beans、spring-core、spring-context、spring-expression四个方面。

  • spring-core和spring-beans:提供了框架的基础部分,包括反转控制和依赖注入功能。其中Bean Factory是容器核心,本质是“工厂设计模式”的实现,而且无需编程实现“单例设计模式”,单例完全由容器控制,而且提倡面向接口编程,而非面向实现编程;所有应用程序对象及对象间关系由框架管理,从而真正把你从程序逻辑中把维护对象之间的依赖关系提取出来,所有这些依赖关系都由BeanFactory来维护。
  • spring-context:这个模块建立在core和bean模块提供坚实的基础上,集成Beans模块功能并添加资源绑定、数据验证、国际化Java EE支持、容器生命周期、事件传播等;核心接口是ApplicationContext。
  • spring-expression:提供强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从Spring 容器获取Bean,它也支持列表投影、选择和一般的列表聚合等。

AOP and Instrumentation模块,包含spring-aop、spring-instrument两个方面。

  • spring-aop:Spring AOP模块提供了符合 AOP Alliance规范的面向方面的编程(aspect-oriented programming)实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中;这样各专其职,降低业务逻辑和通用功能的耦合。
  • spring-instrument:在特定的应用程序服务器中支持类和类加载器的实现,比如Tomcat。

Messaging,从Spring Framework  4开始集成了MessageChannel, MessageHandler等,用于消息传递的基础。

Data Access/Integration,包括了JDBC、ORM、OXM、JMS和事务管理。

事务模块:该模块用于Spring管理事务,只要是Spring管理对象都能得到Spring管理事务的好处,无需在代码中进行事务控制了,而且支持编程和声明性的事物管理。

spring-jdbc: 提供了一个JBDC的样例模板,使用这些模板能消除传统冗长的JDBC编码还有必须的事务控制,而且能享受到Spring管理事务的好处。

spring-orm: 提供与流行的“对象-关系”映射框架的无缝集成,包括Hibernate、JPA、Ibatiss等。而且可以使用Spring事务管理,无需额外控制事务。

spring-oxm: 提供了一个对Object/XML映射实现,将java对象映射成XML数据,或者将XML数据映射成java对象,Object/XML映射实现包括JAXB、Castor、XMLBeans和XStream。

spring-jms: 用于JMS(Java Messaging Service),提供一套 “消息生产者、消息消费者”模板用于更加简单的使用JMS,JMS用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

Web,包含了spring-web, spring-webmvc, spring-websocket, and spring-webmvc-portlet几个模块。

spring-web 提供了基础的web功能。例如多文件上传、集成IoC容器、远程过程访问(RMI、Hessian、Burlap)以及Web Service支持,并提供一个RestTemplate类来提供方便的Restful services访问。

spring-webmvc: 提供了一个Spring MVC Web框架和REST Web服务的实现。Spring的MVC框架提供了领域模型代码和Web表单之间分离,并与Spring框架的所有其他功能集成。

spring-webmvc-portlet: 提供了在Portlet环境中使用MVC实现,并且反映了spring-webmvc模块的功能。

 

Spring应用场景

典型Web应用程序应用场景

典型应用

Spring的声明式事务管理功能让web应用程序完全是事务性的,就像如果你使用EJB容器管理的事务。你所有的自定义的业务逻辑可以通过简单的pojo实现和由Spring的IoC容器。服务包括支持发送电子邮件和web层的独立验证,可以让你选择在哪里执行验证规则。

远程访问应用场景

远程服务

Spring能非常方便的提供暴露RMI服务,远程访问服务如Hessian、Burlap等,实现非常简单只需通过在Spring中配置相应的地址及需要暴露的服务即可轻松实现。

小结

首先要明确Spring是个什么东西,能帮我们做些什么事情,知道了这些然后做个简单的例子,这样就基本知道怎么使用Spring了。Spring核心是IoC容器,所以一定要透彻理解什么是IoC容器,以及如何配置及使用容器,其他所有技术都是基于容器实现的;理解好IoC后,接下来是面向切面编程,首先还是明确概念,基本配置,最后是实现原理,接下来就是数据库事务管理,其实Spring管理事务是通过面向切面编程实现的,所以基础很重要,IoC容器和面向切面编程搞定后,其余都是基于这俩东西的实现,学起来就更加轻松了。要学好Spring不能急,一定要把基础打牢,基础牢固了,这就是磨刀不误砍柴工。

参考地址:

  1. https://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#spring-introduction
  2. http://sishuok.com/forum/blogPost/list/2426.html#7018
,