Spring Framework简介
作者关于此主题早期文章
起源
要谈Spring的历史,就要先谈J2EE。J2EE应用程序的广泛实现是在1999年和2000年开始的,它的出现带来了诸如事务管理之类的核心中间层概念的标准化,但是在实践中并没有获得绝对的成功,因为开发效率,开发难度和实际的性能都令人失望。
曾经使用过EJB开发J2EE应用的人,一定知道,在EJB开始的学习和应用非常的艰苦,很多东西都不能一下子就很容易的理解。EJB要严格地实现各种不同类型的接口,类似的或者重复的代码大量存在。而配置也是复杂和单调,同样使用JNDI进行对象查找的代码也是单调而枯燥。虽然有一些开发工作随着xdoclet的出现,而有所缓解,但是学习EJB的高昂代价,和极低的开发效率,极高的资源消耗,都造成了EJB的使用困难。而Spring出现的初衷就是为了解决类似的这些问题。
Spring的一个最大的目的就是使J2EE开发更加容易。同时,Spring之所以与Struts、Hibernate等单层框架不同,是因为Spring致力于提供一个以统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合揉和在一起建立一个连贯的体系。可以说Spring是一个提供了更完善开发环境的一个框架,可以为POJO(Plain Old Java Object)对象提供企业级的服务。
Spring的形成,最初来自Rod Jahnson所著的一本很有影响力的书籍《Expert One-on-One J2EE Design and Development》,就是在这本书中第一次出现了Spring的一些核心思想,该书出版于2002年。另外一本书《Expert One-on-One J2EE Development without EJB》,更进一步阐述了在不使用EJB开发J2EE企业级应用的一些设计思想和具体的做法。有时间了可以详细的研读一下。
简介
Spring Framework是一个轻量级的解决方案,也是构建企业级应用程序的潜在一站式解决方案。但是,Spring 是模块化的,开发者可以在项目中只使用其中自己需要的部分,例如,可以在任何 web 框架上使用控制反转(IoC),也可以只使用 Hibernate 集成代码或 JDBC 抽象层。它支持声明式事务管理、通过 RMI 或 web 服务实现远程访问,并可以使用多种方式持久化数据。它提供了功能全面的 MVC 框架 ,也可以透明地集成 AOP 到软件中。
Spring目标
Spring Framework是一个Java平台,为开发Java应用程序提供全面的基础架构支持。Spring处理基础架构,因此您可以专注于您的应用程序。
Spring被设计为非侵入式的,这意味着您的域逻辑代码通常不依赖于框架本身。在集成层(例如数据访问层)中,将存在对数据访问技术和Spring库的一些依赖性。但是,应该很容易将这些依赖项与其余代码库隔离开来。
Spring允许您从“普通旧Java对象”(POJO)构建应用程序,并以非侵入方式将企业服务应用于POJO。此功能适用于Java SE编程模型以及完整和部分Java EE。
作为应用程序开发人员,您可以从Spring平台中受益的示例如下:
- 使Java方法在数据库事务中执行,而不必处理事务API。
- 使本地Java方法成为HTTP端点,而无需处理Servlet API。
- 使本地Java方法成为消息处理程序,而无需处理JMS API。
- 使本地Java方法成为管理操作,而无需处理JMX API。
依赖注入和控制反转
Java应用程序 - 指从受限制的嵌入式应用程序到n层服务器端企业应用程序 - 通常由协作形成应用程序的对象组成。因此,应用程序中的对象彼此依赖。
尽管Java平台提供了丰富的应用程序开发功能,但它缺乏将基本构建块组织成一个连贯整体的方法,将该任务留给架构师和开发人员。虽然您可以使用诸如Factory,Abstract Factory,Builder,Decorator和Service Locator 之类的设计模式来构成应用程序的各种类和对象实例,但这些模式只是:给出名称的最佳实践,描述为模式的作用,应用位置,解决的问题等等。模式是必须在应用程序中实现的正式最佳实践。
Spring框架控制反转(IoC)组件通过提供一种将不同组件组合成一个可以使用的完全工作的应用程序的形式化方法来解决这一问题。Spring Framework将形式化的设计模式编码为可以集成到您自己的应用程序中的对象。国外已经有许多组织和机构以这种方式使用Spring Framework来设计健壮,可维护的应用程序。
背景
“ 问题是,控制的哪些方面是[他们]反转? ”Martin Fowler 在2004年在他的网站上提出了关于控制反转(IoC)的 问题 .Fowler建议重新命名原则,使其更加不言自明,并提出依赖注入。
框架模块
Spring Framework由19个模块组成的功能组成。可分为 Data Access/Integration、Web、AOP and Instrumentation、 Core Container以及Test 这5组,如下图所示:等,如下图所示
1.1 Core Container - 核心容器
Spring Core Container 包含 spring-core, spring-beans, spring-context, spring-context-support, 以及 spring-expression (Spring Expression Language,Spring 表达式语言,SpEL)模块。
它们之间的完整依赖关系
其中,core 和 beans 模块提供了 Spring 框架的基础功能,包括控制反转(IoC)和依赖注入。BeanFactory 是工厂模式的一种复杂而精致的实现,它使开发者不再需要使用编码式单例(programmatic singletons),并可将配置和依赖从实际编码逻辑中解耦。
context 模块使得由 Core 和 Beans 提供的基础功能真正构建成坚实的基础:这意味着Spring 工程能以框架模式访问对象,类似于JNDI注册表。Context 模块继承了Beans 模块的特性并增加了对国际化(例如资源绑定)、事件传播、资源加载和context 透明化(例如 Servlet container)。同时,也支持JAVA EE 特性,例如 EJB、 JMX 和 基本的远程访问。Context 模块的关键是 ApplicationContext 接口。
下图是Spring工作原理的高级视图。您的应用程序类与配置元数据相结合,以便在ApplicationContext
创建和初始化之后,您拥有完全配置且可执行的系统或应用程序。
1.2 Data Access/Integration - 数据访问与集成
数据访问与集成层包含 JDBC、ORM、OXM、JMS和TX模块。
它们之间的完整依赖关系
数据访问与集成层包含 JDBC、ORM、OXM、JMS和事务模块。
spring-jdbc 模块提供了 JDBC抽象层,它消除了冗长的 JDBC 编码和对数据库供应商特定错误代码的解析。
spring-tx 模块支持编程式事务和声明式事务,可用于实现了特定接口的类和所有的 POJO 对象。编程式事务需要自己写beginTransaction()、commit()、rollback()等事务管理方法,声明式事务是通过注解或配置由 spring 自动处理,编程式事务粒度更细。
spring-orm 模块提供了对流行的对象关系映射 API的集成,包括 JPA、JDO 和 Hibernate 等。通过此模块可以让这些 ORM 框架和 spring 的其它功能整。
spring-oxm 模块提供了对 OXM 实现的支持,比如JAXB、XML Beans等。
spring-jms 模块包含生产(produce)和消费(consume)消息的功能
1.3 AOP
aop 模块提供了面向切面编程(AOP)的实现,可以定义诸如方法拦截器和切入点等,从而使实现功能的代码彻底的解耦。aspects 模块提供了对 AspectJ 的集成。
1.4 Instrumentation
instrument 模块提供了对检测类的支持和用于特定的应用服务器的类加载器的实现。
1.5 Web
Web 层包括 spring-web、spring-webmvc、spring-webmvc-portlet 等模块。
它们之间的完整依赖关系
spring-web 模块提供面向 web 的基本功能和面向 web 的应用上下文,比如 multipart 文件上传功能、使用 Servlet 监听器初始化 IoC 容器等。它还包括 HTTP 客户端以及 Spring 远程调用中与 web 相关的部分。
spring-webmvc 模块(即 Web-Servlet 模块)为 web 应用提供了模型视图控制(MVC)和 REST Web 服务的实现。Spring 的 MVC 框架可以使领域模型代码和 web 表单完全地分离,且可以与 Spring 框架的其它所有功能进行集成。
spring-webmvc-portlet 模块(即Web-Portlet模块)提供了用于 Portlet 环境的 MVC 实现,并反映了 pring-webmvc 模块的功能。
spring-test
模块通过 JUnit 和 TestNG 组件支持单元测试和集成测试。它提供了一致性地加载和缓存 Spring 上下文,也提供了用于单独测试代码的模拟对象(mock object)。
Spring Framework简介的更多相关文章
- Spring Framework 简介
Spring Framework 依赖注入.事务管理.Web应用程序.数据访问.消息传递.测试和更多的核心支持. Tips: Spring 官网:https://spring.io/ spring f ...
- Spring Boot 简介
作者其他Spring系列文章 Spring Framework简介 Spring框架快速入门 Spring Boot愿景 Spring Boot愿景就是让我们创建可运行的.独立的.基于Spring的 ...
- Spring框架简介 Spring Framework Introduction
Introduction The Spring Framework provides a comprehensive programming and configuration model for m ...
- Spring Framework体系结构简介
说明:以下转自Spring官方文档,用的版本为4.3.11版本. 一.引用官方文档 2.2.1核心集装箱 所述核心容器由以下部分组成spring-core, spring-beans,spring-c ...
- Spring Framework 5.0.0.M3中文文档 翻译记录 Part I. Spring框架概览1-2.2
Part I. Spring框架概览 The Spring Framework is a lightweight solution and a potential one-stop-shop for ...
- Spring Boot简介
Spring Boot简介 Spring Boot是为了简化Spring开发而生,从Spring 3.x开始,Spring社区的发展方向就是弱化xml配置文件而加大注解的戏份.最近召开的SpringO ...
- Spring系列(零) Spring Framework 文档中文翻译
Spring 框架文档(核心篇1和2) Version 5.1.3.RELEASE 最新的, 更新的笔记, 支持的版本和其他主题,独立的发布版本等, 是在Github Wiki 项目维护的. 总览 历 ...
- Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion
本篇太乱,请移步: Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 写了删删了写,反复几次,对自己的描述很不 ...
- Spring生态简介
目录 概述 项目说明 主要项目 社区项目 保留项目 最后总结 概述 做Java开发的人一提起Spring,首先在脑海中浮现出的就是"IoC","AOP",&qu ...
随机推荐
- ABP框架 配置权限、本地语言文件、左侧菜单项
1.Framework.Core>Authorization>PermissionNames.cs 这里新增权限项 namespace Framework.Authorization { ...
- Python开发——基础
注释 单行注释 # 被注释的内容 多行注释 """ 被注释的内容 """ 解释器路径 #!/usr/bin/env python # 用于L ...
- PyCharm默认文件头部的设置
PyCharm的设置 1.设置默认的文件头: 找到该路径并添加以下信息 File->settings->Editor->File and Code Templates->Pyt ...
- Paper | Batch Normalization
目录 1. PROBLEM 1.1. Introduction 1.2. Analysis 2. SOLUTION 2.1. Batch Normalization 及其问题 2.2. 梯度修正及其问 ...
- 甲方安全建设之office365邮箱弱口令检测
甲方安全建设之office365邮箱弱口令检测 信息收集 资产范围 资产列表总数是521 抓包后发现只有102 一番测试之后发现控制Response的关键在于MaxEntriesReturned字段, ...
- bzoj3514(主席树+lct)
把边的编号看成边权,维护每个状态对应的最大生成树,得到一个数组a[i],表示第i条边在这个过程中替换的是那条边,询问时看一下a[l,r]内啊有多少个小于l的算一下答案就好:代码参考:http://bl ...
- 第二周Access课总结
一.问;这节课你学到了什么知识? 答:回忆上周主要学了关于Access的基础知识和基本操作,一转眼,这周也学到了很多,主要学Access的数据类型的表的建立和管理相关的操作! 收获多少在于学了多少,正 ...
- Codeforces Round #512 (Div. 2) D. Vasya and Triangle
参考了别人的思路:https://blog.csdn.net/qq_41608020/article/details/82827632 http://www.cnblogs.com/qywhy/p/9 ...
- CentOS 7安装新版RabbitMQ解决Erlang 19.3版本依赖
通过yum等软件仓库都可以直接安装RabbitMQ,但版本一般都较为保守. RabbitMQ官网提供了新版的rpm包(http://www.rabbitmq.com/download.html),但是 ...
- ES6-字符串扩展-padStart(),padEnd()
ES6 引入了字符串补全长度的功能,如果某个字符串不够指定长度,会在头部活尾部补全. padStart() 用于头部补全: padEnd() 用于尾部补全. 上面代码中,padStart 和 padE ...