Spring简介
Spring官方主页(http://spring.io)有两句话:
Let’s build a better Enterprise.
我们共同来构建更好的企业应用。
Spring helps development teams everywhere build simple, portable, fast and flexible JVM-based systems and applications.
Spring帮助全世界的开发团队构建简单、便携、快速和灵活的基于JVM的系统和应用。
Spring 的主要作用就是为代码“解耦”,降低代码间的耦合度。
根据功能的不同,可以将一个系统中的代码分为主业务逻辑与系统级业务逻辑两类。它们各自具有鲜明的特点:主业务代码间逻辑联系紧密,有具体的专业业务应用场景,复用性相对较低;系统级业务相对功能独立,没有具体的专业业务应用场景,主要是为主业务提供系统级服务,如日志、安全、事务等,复用性强。
Spring 根据代码的功能特点,将降低耦合度的方式分为了两类:IoC 与 AOP。IoC 使得主业务在相互调用过程中,不用再自己维护关系了,即不用再自己创建要使用的对象了。而是由 Spring 容器统一管理,自动“注入”。而 AOP 使得系统级服务得到了最大复用,且不用再由程序员手工将系统级服务“混杂”到主业务逻辑中了,而是由 Spring 容器统一完成“织入”。
Spring帮助全世界的开发团队构建简单、便携、快速和灵活的基于JVM的系统和应用。这两句话已经足以说明Spring的目标,它针对的领域是企业应用,这套框架构建的应用有着简单、便携、快速和灵活的特点。与EJB(Enterprise JavaBean,一个基于Java平台的服务端组件框架)相比,它是一个轻量级的应用开发平台。
Spring 4.x 是Spring在积蓄4年后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。Spring 4.0引入了众多Java开发者翘首以盼的基于Groovy Bean的配置、HTML 5/WebSocket支持等新功能,全面支持Java 8.0,最低要求是Java 6.0。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是Java Web应用开发的难度,同时有效提升应用开发的优雅性。
尽管JDK提供了丰富的开发功能,但是它很难将一些基础的组件块构建成一个完整的框架,它把这个任务交给了开发者和工程师。尽管开发人员可以利用工厂、抽象工厂、创建者、装饰器等设计模式将这些组件组合起来,但是其中的工作量是相当巨大的,特别是对于中小企业来说,根本没有那么多资源来做这件事情。而Spring框架已经帮我们做好了这一切,Spring框架的控制反转(IoC, Inversion of Control)组件以标准化的方式将这些分散的组件组合到一起,Spring使用了规范的设计模式,很容易将它集成到应用系统中。当前,大量的企业和机构在使用Spring框架。
Spring4 体系结构
Data Access/Integration(数据访问与集成)
部分包含5个模块
- jdbc:jdbc的支持
- orm:对象关系映射,集成orm框架
- oxm:对象xml映射
- jms:java消息服务
- spring-tx:事务控制
JDBC:是Spring对JDBC数据访问的封装,提供了一个JDBC抽象层,消除了冗长的JDBC代码。
ORM:提供对对象关系映射框架的支持。
OXM:提供了对Object/XML映射实现的抽象层。
O/X映射器这个概念并不新鲜,O代表Object,X代表XML。它的目的是在Java对象(几乎总是一个plainoldJavaobject,或简写为POJO)和XML文档之间来回转换。
(可参考:https://www.jb51.net/article/131713.htm)
JMS:Java消息服务:
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持(百度百科给出的概述)。我们可以简单的理解:两个应用程序之间需要进行通信,我们使用一个JMS服务,进行中间的转发,通过JMS 的使用,我们可以解除两个程序之间的耦合。
Transaction:支持编程和声明性事务管理: - 事务:一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)
- 一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成
- 事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同
Web - spring-web:基础web功能,如文件上传
- spring-webmvc:mvc实现 3. spring-webmvc-portlet:基于portlet的mvc实现
- spring-websocket:为web应用提供的高效通信工具
Web:提供了基础的web功能。如文件上传、使用servlet listeners初始化IoC容器等
Servlet:即SpringMVC 框架,它是一个全功能的构建 Web 应用程序的 MVC 实现,对Servlet进行了封装。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
Portlet:提供了基于Porlet的MVC实现。
WebSocket:提供了一个在Web应用中高效、双向的通信工具。
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
Portlet是基于Java的Web组件,由Portlet容器管理,并由容器处理请求,生产动态内容。Portals使用Portlets作为可插拔用户接口组件,提供信息系统的表示层。作为利用Servlets进行Web应用编程的下一步,Portlets实现了Web应用的模块化和用户中心化。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
aop
aop部分包含5个模块
-
spring-aop:面向切面编程
-
spring-aspects:集成AspectJ
-
spring-instrument:提供一些类级的工具支持和ClassLoader级的实现,用于服务器
-
spring-instrument-tomcat:针对tomcat的instrument实现
-
spring-messaging:用于构建基于消息的应用程序
AOP:提供了面向切面编程的实现,让你可以定义方法拦截器和切点,从而将逻辑代码分开,降低代码间的耦合性。
Aspects:提供了对AspectJ的集成支持,这是一个功能强大且成熟的面向方面编程(AOP)框架。
messaging:为集成messaging api和消息协议提供支持
Instrumentation:提供了在特定的应用服务器中使用类工具的支持和类加载器实现。
使用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义。有了这样的功能,开发者就可以实现更为灵活的运行时虚拟机监控和 Java 类操作了,这样的特性实际上提供了一种虚拟机级别支持的 AOP 实现方式,使得开发者无需对 JDK 做任何升级和改动,就可以实现某些 AOP 的功能了。
core
core部分包含4个模块: -
spring-core:依赖注入IoC与DI的最基本实现
-
spring-beans:Bean工厂与bean的装配
-
spring-context:spring的context上下文即IoC容器
-
spring-expression:spring表达式语言
Core:
包含了Spring框架基本的核心工具类,Core模块是其他组件的基本核心。
Beans:
是所有应用都要用到的模块,它包含访问配置文件、创建和管理bean、进行IoC和DI相关操作的所有类。其最主要的组件BeanFactory,它的提供了对工厂模式的经典实现来消除对程序性单例模式的需要,并真正允许你从程序逻辑中分离出依赖关系和配置。
Context:
构建于Core和Beans模块基础之上,扩展了BeanFactory的功能,为Spring提供了大量扩展,如对i18n国际化、Bean生命周期控制、框架事件体系、资源加载、事件传播的支持;该模块还提供了许多企业级服务的支持,例如邮件、任务调度、JNDI获取、EJB集成、远程访问等。ApplicationContext接口是Context模块的关键。
SpEL:
提供了一个强大的表达式语言用于在运行时查询和操纵对象。
Test:
支持使用JUnit和TestNG对Spring组件进行测试。
test部分只有一个模块,我将spring-context-support也放在这吧 -
spring-test:spring测试,提供junit与mock测试功能
-
spring-context-support:spring额外支持包,比如邮件服务、视图解析等
spring对于容器可以设置子容器,子容器可以访问父容器的bean,反过来就不行。成功案例:spring创建springmvc子容器,在业务层和数据层创建一个父容器,这样前端可以访问后端的父容器,而后端不能访问前端容器的bean。
总结
Spring的IOC和AOP两大核心功能可以大大降低应用系统的耦合性、简化开发流程。
Spring框架技术可在不同层次上起作用,比如IOC管理普通的POJO对象、AOP增强了系统服务和其它组件(事务、MVC、JDBC、ORM和远程调用等)。Spring的一大特点就是基于接口编程,它是非侵入式的服务。用户端绑定接口使用JAVA EE服务,而非直接绑定服务,而且应用也可以使用不同的服务(Hibernate、MyBatis等)。我们可以根据自己的需要,使用Spring的一部分服务,而不必使用完整的Spring系列项目。