Spring中文文档-第一部分
一、 Spring 框架概述
Spring是为了构建企业应用的轻量级框架。然而,Spring是模块化的,允许你只是使用其中的一部分,不需要引入其他的。你可以在任何web框架上使用IoC容器,也可以只使用Hibernate集成代码或JDBC抽象层。Spring框架支持声明式事务管理、通过RMI远程访问、WebService和持久化数据。它还提供全功能的MVC框架,和将AOP应用到你的系统上。
Spring设计为非侵入式的,意味着你的逻辑代码不依赖与框架本身。
1. 开始使用Spring
学习Spring看这个文档就没错。
注意JDK版本要求:
- JDK 6+ for Spring Framework 4.x
- JDK 5+ for Spring Framework 3.x
2. Spring框架介绍
Spring是应用于Java平台的,使用它可以让你更专注于你的代码。
做为一个程序员,你可以在Spring中获得以下好处:
- 不使用事务APIs写代码就让一个方法有事务处理功能
- 不使用remote APIs就可以让本地方法访问远程程序
- 不使用JMX APIs就可以让一个本地方法管理操作
- 不使用JMS APIs就可以让本地代码处理消息
2.1 依赖注入和控制反转(IoC)
一个Java应用程序,对象间往往是相互依赖的。
Spring框架的控制反转(Inversion of Control)就是为了解决这个问题的。
2.2 各模块
Spring大约分为20个模块,这些模块分为核心容器、数据访问/集成、Web、AOP、Instrumentation、消息和测试,如下图所示:
2.2.1 核心容器
核心容器由spring-core
、spring-beans
、spring-context
、spring-context
和spring-expression
5个模块构成。
spring-core
和spring-beans
模块为框架提供最基本的功能,包括IoC和依赖注入。BeanFactory
是一个工厂的实现类。它可以免除用户手动创建单例类并且对象之间解耦。
context(spring-core
)模块基于spring-beans
和BeanFactory
两个模块,允许以框架方式访问对象,这类似于JNDI。Context模块继承了Beans模块,并支持国际化、事件传播、资源加载等。Context模块支持Java EE特性,如EJB、JMX、远程访问。spring-context
接口是Contet模块的重点。spring-context-support
提供将第三方库集成到Spring的功能,如缓存(EhCache,JCache)和任务调度(CommonJ,Quartz)等。
spring-expression
模块提供强有力的在运行时查询和操作对象的语言。这种语言支持获取和设置属性、方法执行、获取数组或集合中的对象、逻辑计算、命名变量,在Spring的IoC容器中获得对象。
2.2.2 AOP 和 Instrumentation
spring-aop
模块提供切面编程的实现。可以自定义方法拦截和切入点。
spring-aspects
模块提供与AspectJ的集成。
spring-instrument
模块为特定的服务器提供类加载服务。spring-instrument
模块是集成了Tomcat。
2.2.3 消息
Spring4提供了spring-messaging
模块,主要类有Message
,MessageChannel
,MessageHandler
。这个模块还包含一些映射消息到方法的注解,类似于Spring MVC基于编程模式的注解。
2.2.4 数据访问/集成
这一层由JDBC、ORM、OXM、JMS、和事物模块组成。
spring-jdbc
模块,主要为了解决数据库繁多的问题,应用此可不需要关注使用的数据库。
spring-tx
模块提供编程式或声明式事务处理。
spring-orm
模块提供流行的对象关系映射的APIs,包含JPA和Hibernate.
spring-oxm
模块提供对Object/XML映射的支持,例如JAXB,Castor,JiBX和XStream。
spring-jms
模块(Java消息服务)包含生成和消费消息的功能。在Spring4.1以后,它集成了spring-messaging
模块。
2.2.5 Web
Web层包含spring-web
、spring-webmvc
和spring-websocket
3个模块。
spring-web
模块提供面向Web方法的集成特性,例如多部分文件上传、通过监听初始化IoC容器和面向Web的Context,还包含HTTP客户端和对远程的支持。
spring-webmvc
模块(也被称作Web-Servlet模块)包含Spring MVC框架。
spring-websocket
模块提供对socket的全面支持。
2.2.6 测试
spring-test
模块通过JUnit或者TestNG来对Spring的模块进行单元测试和集成测试。它提供一致的Spring 的ApplicationContexts
和context的缓存。它还提供mock对象让你测试你的代码。
2.3 使用场景
Spring可以应用在大部分场景和各种企业级应用。
2.3.1 依赖管理和命名约定
依赖管理和依赖注入是不同的东西。为了应用好的特性(比如依赖注入)到你的程序中,你需要添加所有必须的jar包。依赖关系可以是直接的或者是间接的(例如我的应用依赖于commons-dbcp
,而它又依赖于ApplicationContexts
)。间接依赖是传递的,所以非常难以管理。
为了方便的使用Spring,Spring已经尽量的减少依赖和进行模块化,如果你不打算写一个Web应用那么就不需要引入spring-web模块。为了方便代表Spring的jar包,以后使用spring-*
或spring-*.jar
来代替,*
为不同的模块(例如,spring-core
,spring-webmvc
,spring-jms
),但是实际的jar包会有相应的版本信息(例如,spring-core-5.0.0.BUILD-SNAPSHOT.jar
)。
每一个版本的Spring将发布在Maven中心,格式为spring-*-<version>.jar
,Maven的坐标为org.springframework。
所以首先你应该决定怎么去管理你的依赖,我们建议使用自动化管理工具例如Maven,Gradle或者Ivy,当然你也可以下载后手动管理。
以下是Spring的所有jar包。
GroupId | ArtifactId | 描述 |
---|---|---|
org.springframework |
spring-aop |
基于代理的AOP支持 |
org.springframework |
spring-aspects |
基于AspectJ 的切面编程 |
org.springframework |
spring-beans |
Beans的支持, 包括 Groovy |
org.springframework |
spring-context |
应用程序运行时上下文,包括调度和远程抽象 |
org.springframework |
spring-context-support |
提供第三方库到Spring的支持 |
org.springframework |
spring-core |
核心工具类,被其他模块使用 |
org.springframework |
spring-expression |
Spring 表达式语言 (SpEL) |
org.springframework |
spring-instrument |
代理JVM相关的 |
org.springframework |
spring-instrument-tomcat |
Tomcat的插件 |
org.springframework |
spring-jdbc |
提供jdbc的支持,包括数据源和JDBC访问 |
org.springframework |
spring-jms |
JMS支持包,包括接收和发送消息类的支持 |
org.springframework |
spring-messaging |
对消息传递体系结构和协议的支持 |
org.springframework |
spring-orm |
对象/关系 映射, 拨快对JPA 和 Hibernate的支持 |
org.springframework |
spring-oxm |
对象/XML 映射的支持 |
org.springframework |
spring-test |
对Spring组件单元测试和集成测试的支持 |
org.springframework |
spring-tx |
事物支持,包块DAO支持和JCA集成 |
org.springframework |
spring-web |
Web 支持,包括客户端和Web访问 |
org.springframework |
spring-webmvc |
一个MVC框架 |
org.springframework |
spring-websocket |
WebSocket 和SockJS 的实现,包括对STOMP的支持 |
一个Maven的依赖如下:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.0.BUILD-SNAPSHOT</version>
<scope>runtime</scope>
</dependency>
</dependencies>
如果你不需要编译Spring APIs可以声明作用域为runtime。
+提示
Maven坐标查询可以在http://mvnrepository.com/网站查询到。
最新稳定版为4.3.3.RELEASE
,建议使用这个版本。
上面是用的Maven仓库,当然也可以使用Spring的Maven仓库,只需要指定仓库地址即可,如下:
<repositories>
<repository>
<id>io.spring.repo.maven.release</id>
<url>http://repo.spring.io/release/</url>
<snapshots><enabled>false</enabled></snapshots>
</repository>
</repositories>
为了防止下载不同版本的Spring,可以引入spring-framework-bom
到你的dependencyManagement
中,这可以确保你的所有Spring会使用同一个版本。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>5.0.0.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
那么以后增加Spring模块的时候就不需要再指定<version>
标签了:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependencies>
2.3.2 日志记录
日志是非常重要的。因为现在日志框架特别多,所以选择变得很困难。
在Spring中强制使用的是Jakarta Commons Logging API (JCL),在Spring中也显示的使用了JCL。对有所有的模块使用相同的日志框架是非常重要的,Spring是这么做的,让spring-core
模块显示的依赖commons-logging
,而其他模块则是在编译时依赖。
2.3.2.1 不使用Commons Logging
如果不想使用commons-logging
而想使用其他日志门面(例如slf4j),可以这么做:
- 在
spring-core
模块中排除对commons-logging
的依赖(只有这个模块明确依赖commons-logging
) - 依赖一个特殊的日志门面框架
排除指定的日志框架如下:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.0.BUILD-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
现在应用程序应该不能正常工作了,因为没有指定一个日志框架,下面将使用slf4j来代替。
2.3.2.2 使用slf4j
slf4j是一个好的日志门面框架,比commons-logging
性能要高。并且是在编译时绑定。
下面的例子展示了使用slf4j日志门面框架,并使用log4j具体日志框架的例子:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.0.BUILD-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.5.8</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.8</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.8</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
</dependencies>
2.3.2.3 使用log4j
如果你就想使用log4j,也不需要上面那么负责的依赖,可以简单的使用如下例子即可:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.0.BUILD-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
</dependencies>
再给出一个简单的log4j.properties例子:
log4j.rootCategory=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n
log4j.category.org.springframework.beans.factory=DEBUG
+附言
文档目录详见:http://www.cnblogs.com/yiwangzhibujian/p/5893219.html
这是翻译的Spring文档的第一部分,如果看过原文应该可以看出这个翻译是很简略的,尤其是在大段文本的翻译上,但是重点部分还是不会省略的,我这么做的目的是不想把时间和精力放在那些文本语言的推敲上,而是以程序员的思维提取重点部分,就像文档一开始的JDK版本要求,就是随意加上的,原文没有,但是我觉得比较重要。这样会比较相对快一点翻译完这个文档,等以后有时间在慢慢做修补工作。
Spring中文文档-第一部分的更多相关文章
- Spring中文文档
前一段时间翻译了Jetty的一部分文档,感觉对阅读英文没有大的提高(*^-^*),毕竟Jetty的受众面还是比较小的,而且翻译过程中发现Jetty的文档写的不是很好,所以呢翻译的兴趣慢慢就不大了,只能 ...
- Django 1.10中文文档-第一个应用Part2-模型和管理站点
本教程继续Part1.我们将设置数据库,创建您的第一个模型,并快速介绍Django的自动生成的管理网站. 数据库设置 现在,编辑mysite/settings.py.它是一个用模块级别变量表示Djan ...
- Django 1.10中文文档-第一个应用Part7-自定义管理站点
开发第一个Django应用,Part7 本教程上接Part6.将继续完成这个投票应用,本节将着重讲解如果用Django自动生成后台管理网站. 自定义管理表单 通过admin.site.register ...
- Django 1.10中文文档-第一个应用Part6-静态文件
本教程上接Part5 .前面已经建立一个网页投票应用并且测试通过,现在主要讲述如何添加样式表和图片. 除由服务器生成的HTML文件外,网页应用一般还需要提供其它必要的文件——比如图片.JavaScri ...
- Django 1.10中文文档-第一个应用Part5-测试
本教程上接教程Part4. 前面已经建立一个网页投票应用,现在将为它创建一些自动化测试. 自动化测试简介 什么是自动化测试 测试是检查你的代码是否正常运行的行为.测试也分为不同的级别.有些测试可能是用 ...
- Django 1.10中文文档-第一个应用Part4-表单和通用视图
本教程接Part3开始.继续网页投票应用程序,并将重点介绍简单的表单处理和精简代码. 一个简单表单 更新一下在上一个教程中编写的投票详细页面的模板polls/detail.html,让它包含一个HTM ...
- Django 1.10中文文档-第一个应用Part3-视图和模板
本教程上接Django 1.10中文文档-第一个应用Part2-模型和管理站点.我们将继续开发网页投票这个应用,主要讲如何创建一个对用户开放的界面. 概览 视图是Django应用中的一“类”网页,它通 ...
- Django 1.10中文文档-第一个应用Part1-请求与响应
在本教程中,我们将引导您完成一个投票应用程序的创建,它包含下面两部分: 一个可以进行投票和查看结果的公开站点: 一个可以进行增删改查的后台admin管理界面: 我们假设你已经安装了Django.您可以 ...
- Solidity 中文文档 —— 第一章:Introduction to Smart Contracts
第一章:智能合约简介 粗略地翻译了 Ethereum 的智能合约开发语言的文档:Solidity.欢迎转载,注明出处. 有任何问题请联系我,本人微信:wx1076869692,更多详情见文末. 我是 ...
随机推荐
- C#-和时间有关的计算代码、时间相减 得到天数、小时、分钟、秒差
asp.net(C#)时间相减 得到天数.小时.分钟.秒差 asp.net(C#)时间相减 得到天数.小时.分钟.秒差 DateTime dtone = Convert.ToDateTime( ...
- vim2
一.光标控制命令 命令 移动 k 向上移一行 j 向下移一行 h ...
- angular指令深度学习篇
angular指令深度学习-过滤器 limitTo ... <body ng-app="app" > <div ng-controller="myCtr ...
- POJ2417 Discrete Logging
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- Python Day2
一.列表 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 新建一个列表 name = ['ShaoLin','Tom','Kimi','Rain','A ...
- C#+ AE 注意问题汇总(不断更新)
1.AE的COM对象释放问题尤其是IFeatureCursor 建议用 ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(pObj); 或者 int iRefs ...
- [Nhibernate]二级缓存(一)
目录 写在前面 文档与系列文章 二级缓存 Nhibernate二级缓存提供程序 一个例子 总结 写在前面 上篇文章介绍了nhibernate中一级缓存的相关内容,一级缓存过期时间和ISession对象 ...
- HTML5+CSS3 - 代码简写篇
有话先说:我是一只菜鸟,还是一只刚步入前端这个领域的小菜年,在不断的进阶,理解最深刻的还是代码,既爱又恨却不知如何去感悟. background属性简写: background-position属性组 ...
- redis集群之REDIS CLUSTER
redis集群之REDIS CLUSTER 时间 2016-04-11 17:05:00 NoSQL_博客园 原文 http://www.cnblogs.com/zhanchenjin/p/537 ...
- css pre标签
浏览器:firfox49.0.2 在使用<pre>标签输出格式化文本的时候,遇到了一个小问题. 要在页面的底部输出两行文本,但是最后一行的文字总是距离屏幕的底部太大.下面图中的样子: 相关 ...