文档地址: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#overview-getting-started-with-spring ##1.启动 spring框架是一个轻量级的问题方案,可以为你的企业级应用搭建提供一站式服务;而且,spring还是模块化的,允许你只使用你需要哪些部分,而不必全部引用.你可以在任何web框架之上使用ioc容器,不过你也可以只是用hibernate聚合部分和jdbc抽象层.spring框架还支声明式的事务管理,允许你通过RMI或webservice来访问你的业务逻辑层,并提供各种数据持久化技术(jpa,hibernate,mongodb,Gemfire).他提供了一个完全特性的mvc框架,并允许你透明地将aop聚合到你的软件中; spring是非侵入型设计,意味着你的领域业务代码基本上不会依赖于框架本身;在你的聚合层(例如数据访问层),一些数据访问技术的依赖和一些spring类库还是存在的;然而,这些可以轻易的从你代码库分离; 你可以使用start.spring.io来产生一个简单的项目或通过使用 "Getting Started" 网页中的 "Getting Started Building a RESTful Web Service "这一章节;为了便于你消化,这些指导都是任务专注型的,并且他们大部分都是基于spring-boot;他可能还包含一些其他的可以帮助你解决特定问题的项目; ##2.介绍spring架构 spring框架是一个为java项目提供广泛基础设施(基层服务)支撑的java平台;spring处理了这些基层服务,所以你可以集中到你的应用上; spring允许你通过pojos(简单java对象)来创建项目,并将企业服务非侵入式的注入到pojo中;它适用于完全的javase编程模式,部分或全部javaEE; 下面是一些你可以使用spring平台开发受益的例子;
- 1.可以使一个方法在数据库事务中执行而不必关注java事务APIS
- 2.可以使java本地方法包装成远程过程,不必处理远程APIs
- 3.使java本地方法成为管理操作器而不必处理JMX api;
- 4.使本地方法成为消息处理器;不必处理JMS apis;
###2.1依赖注入和控制反转(DI and IOC) 一个java应用,是一个有着各种限制,嵌入了N层一个术语概念;服务端的java企业应用,典型由各种对象以合适的方式组成;这些对象通常都相互依赖,耦合严重; 尽管java平台提供了各种应用开发的便利功能,但它无力将这些基础组件有机整合,这些任务留给里架构师和开发者;尽管你可以使用各种设计模式,比如工厂模式(Factory),抽象工厂模式(Abstract Factory),构造者模式(builder),装饰器模式(Decorator),服务定位器模式(Service Locator)等来处理各种类和java对象实例来组装到应用中;然迄今为止,这些模式大都如此:给一个符合定义的最好实践,描述好模式的怎么工作,在哪里调用,在哪些问题中可以使用它;模式只是形式化的最好做法,然你还得在应用中实现它;
spring ioc解决了这个困扰---通过提供了正式的方式去把各个独立的组件聚合到一个将要使用它们去工作的应用中;spring战胜了形式化的设计模式,使她成为了聚合应用的首选项;各种组织和机构使用spring的ioc来构建健壮的,可维护的应用; 背景: '问题在于,控制模块要注入呢'这个是关于控制反转的问题,后来重新定义了这个原则使其更加具有自适性,并带来了依赖注入;
###2.2模块 spring由20多个模块组成;这些模块被分组成核心容器,数据访问/整合,web,aop,基础设施,通信,测试等部分,图如下;
data Access/Integration:jdbc,orm,oxm,jms,transcations;
web:websocket,servlet,web,Portlet
独立层组:aop,aspects,instrumentation,messaging
核心容器(Core Container):Beans,core,context,SpEL,
Test;
```
列表中的提供的许多可获得的模块插件(根据其名称提供不同的建议);在依赖管理工具中这些插件通过插件id进行管理;
###2.2.1核心容器
核心容器有spring-core,spring-beans(spring beans管理器),spring-context-support(spring上下文支持),spring-context,spring-expression(spring表达式语言)等模块;
spring-core and spring-beans提供了架构的基础,包括了控制反转(IOC)和依赖注入特性;beanFactory是工厂模式的精妙实现;它去掉了单例编程,并使你在实际的编程逻辑中解耦这些依赖的配置和说明;
上下文模块基于spring core and beans 模块提供的坚强的基础:提供了一种像JNDI(java naming definition Interface 命名目录接口)注册的方式来访问对象的方法.上下文模块继承了beans模块的功能,并对国际化(internationalization ),事件传播(Event propagation),资源加载并且通过上下文显式创建,例如,一个servlet容器.上下文模块也支持java EE特性,比如EJB,JMX,基础远程.应用上下文接口是上下文模块的焦点;spring上下文支持模块可以支持聚合一些第三方类库;比如缓存(Ehcache,Guava,JCache),通信(JavaMail),定时任务(Quartz,CommonJ)和模板引擎(FreeMarker,JasperReports,Velocity);
这个spring-expressin模块提供了一个强有力的语言在运行时来操作对象图;它是jsp2.1的EL语言的扩展;该语言支持获取和设置属性值,属性分配,方法调用;访问数组,集合,索引器的内容;逻辑和算数操作,命名变量,ioc容器中变量命名检索;它还支持列表投影(projection jpa的)和选择,以及常见的列表聚合;
###2.2.2 AOP和探针(instrument,也有叫仪器的)
spring-aop模块提供了一个联盟标准的面向切面编程的实现;例如,它可以让你定义方法拦截器和切入点,以便使其清晰的和你的功能代码解耦;使用资源级别的元数据的功能,你可以将动作信息像操作.Net的属性一样合并到你的代码中.
独立的spring-aspects模块提供了AspectJ的聚合;
spring-instrument模块提供了特定应用容器的类聚合支持和加载器实现;
###2.2.3 通信
spring-massaging是spring集成项目的关键抽象,包括消息,消息频道,消息处理器,以及其他的作为消息相关应用的基础;该模块有一个大堆的方法级消息注解,就如同springmvc注解一样
###2.2.4 数据访问和聚合
有jdbc,ORM,OXM,JMS和事务模块;
Spring JDBC模块提供了一个抽象层,不需要进行繁琐的JDBC编码和数据库供应商特定错误代码解析;
spring-tx模块对实现特定接口的类和所有的pojos提供了编程的和申明式的事务管理;
spring-orm模块提供了对ORM数据库APIs的映射,包括JPA,JDO,和Hibernate.通过spring-orm模块你可以使用这些spring提供的ORM框架的所有特性;例如上文提过的简单的申明式事务管理;
spring-oxm模块提供了实现Object/XML mapping的框架,比如JAXB,Castor,XMLBeans,JiBx and XStream;
spring-JMS提供的功能为生成和消费消息;spring4.1以后,它提供了对spring消息模块的聚合;
###2.2.5 web
web层包括spring-web,spring-webmvc,spring-websocket,spring-webmvc-portlet;
spring-web模块提供了基本的web方向编程的功能,比如上传复合文件,通过servlet监听器来启动ioc容器,提供了一个面向web的应用上下文;
spring-webmvc模块包含了spring的mvc以及对web应用rest服务的实现;spring的mvc实现了领域模型代码和web表单的清晰隔离,并可以聚合了其他所有的spring功能
spring-webmvc-portlet模块(也被称为web-portlet模块)提供了在Portlet环境中mvc的实现并反射调用spring-mvc模块的功能;
###2.2.6 Test
spring测试模块通过Junit和TestNG提供了单元测试和spring组件集成测试;他提供了稳定的spring上下文的加载和存储;它还提供了模拟对象,你可单独的测试你的代码;
###2.3使用场景(Usage scenarios)
上文描述的功能块是的spring在许多场景成为一个合理的选择;从在资源受限的设备上运行的嵌入式应用,到完全成熟的使用了spring事务管理和web框架聚合的企业级应用;
- 金手指1:Typical full-fledged Spring web application 典型的成熟的spring web 应用
![输入图片说明](http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/images/overview-full.png "典型的成熟的spring web 应用")
spring 声明式的事务管理使web应用更具有事务性;就像你使用EJB的容器事务管理一样;你的所有客户端业务逻辑可以通过简单的java bean来实现,并通过ioc容器来管理.其他的服务包括邮件发送和验证是独立于web层的,web层会让你选择在哪执行验证规则.spring orm 支持集成了jpa,hibernate,jdo.例如,当你使用hibernate时,你可以继续使用已经存在的映射文件和标准的bibernate事务工厂配置.表单控制器无缝将领域模型和web层集成,无需ActionForm类或其他类将http请求参数翻译成你的领域模型对象;
###金手指2:spring middle-tier using a third-party web framework(spring整合第三方框架)
![输入图片说明](http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/images/overview-thirdparty-web.png "在这里输入图片标题")
一些情况下不允许你完全转向另一种架构.spring不会强迫你使用它的所有东西,它不是一个全有或全无的方案.已存在的前端可以通过struts,Tapestry,JSF或者其他ui框架创建的并被spring整合;spring作为中间层可以使用它的事务处理功能.你只需要通过上下文(ApplicationContext)连接你的业务逻辑,并通过web上下文(WebApplicationContext)整合你的web层;
- 金手指3:远程使用场景 Remoting usage scenario
![输入图片说明](http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/images/overview-remoting.png "在这里输入图片标题")
当你需要通过web service来访问已存在代码时,你可以使用spring的Hessian-,Burlap-,Rmi-或者JaxRpcProxyFactory等类;它们使远程访问不那么困难;
- 金手指4: EJBs-包装已存在的pojos(Wrapping existing POJOs)
![输入图片说明](http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/images/overview-ejb.png "在这里输入图片标题")
spring 为企业bean提供了一个抽象访问层;允许你重用现有的pojo并将它们包装在无状态的会话中,这样你就可以在可扩展的,自动安全的web应用中使用他,虽然这些应用可能需要声明式安全;
###2.3.1 依赖管理和命名约束
依赖管理和依赖注入是两码事.为了使spring的这些强大功能加入到你的应用(像依赖注入以这样),你需要集成所有必要的类库,并在运行将它们加入到类路径,有的要求在编译期.这些依赖并不是要注入的虚拟组件,而是文件系统中的真实资源(即jar包).依赖管理的过程包含了资源定位,存储它们并将他们添加到路径中.依赖包括直接依赖(如 对spring的依赖),或者非直接的(如被你的项目依赖的commons-dbcp依赖的commons-pool一样).这些非直接的依赖又被称为传递依赖,而且这些依赖非常难以识别和管理;
如果你打算使用spring,你需要复制一份包含你需要的spring部分的jar类库.由于spring尽可能的按模块来打包分割依赖,所以这会很简单;比如你不必在一个非web应用中引入web模块;在这份手册中我们所指的是缩写命名规则,如spring-*,spring-*.jar,这里的*表示模块的缩写(如spring-core,spring-webmvc,spring-jms);
真实的你使用的jar文件命名一般是模块+版本号;
每个发布的spring发布版会有以下改变
- maven 中心 maven默认查询仓库,它不需要做任何特别的配置;大量的公共类库可以从Maven中心获取,而且大量的spring社区使用maven作为依赖管理,所以这对spring很适用.
这些jar的名字像spring-*-<version>.jar,并且maven的组织id是org.springframework
- maven仓库, 有个特定面向spring的maven仓库;处理最终版的发布
,这个仓库还有承载开发快照和里程碑.这些jar包和maven中心里的一样;所以这个地方可以获得部署到仓库中心中的spring的其他开发版本;这个版本还包含了集合的发布zip包,包含了所以的spring jars文件,并容易下载;
首先,确定用什么来管理依赖,我们推荐用自动化的工具如maven,Gradle,或者lvy;不过你也可以手动下载管理它们;
下面有个jar包描述列表;
spring-aop 基础的AOP代理支持 spring-aspects 基于AspectJ 的aspects(面向切面编程) spring-beans beans支持,包括Groovy(基于java的编程语言); spring-context 应用上下文运行,包括定时和远程抽象层 spring-context-support 支持将第三方类库加入到spring上下文中 spring-core 核心功能,被许多spring模块使用 spring-expression Spring表达语言 spring-instrument jvm启动集成代理 spring-instrument-tomcat tomcat集成代理 spring-jdbc jdbc支持包,包括数据源安装和jdbc访问支持 spring-jms JMS支持包,包括各种发送,接受JMS消息的协助类 spring-orm 对象关系映射,包括JPA和hibernate的支持 spring-oxm 对象/xml 映射 spring-tx 事务组件,包括对DAO(数据访问对象)类支持和JCA集成 spring-web web支持包,包括客户端和web远程 spring-webmvc Restful的web服务,web应用的模型视图控制器 spring-webmvc-portlet 在portlet环境中mvc实现 spring-websocket WebSocket和SocketJS的实现,包括STOMP支持 ```
- spring依赖和依赖spring 虽然spring提供了很多企业及其他外部工具的集成和支持;但它故意保持其强制依赖在最小值;你不必为了一个简单的用意去定位和下载大量的jar包,通常可以实现自动.对于基本的依赖注入, 接下来我们说下配置应用需要的spring的基本步骤:首先是maven,其次是Gradle,最后是lvy.通常,如果事情都很明确,查看你的依赖的管理系统的文档,或者查看一些简单的代码,spring自己在运行时用Gradle来管理依赖,我们的小例子大部分也用Gradle或Maven;
- maven依赖管理 如果你使用maven管理依赖,你甚至可以不用提供loggging依赖.例如:创建一个应用上下文,并使用依赖注入进行配置;你的maven依赖应该这样:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.0.RELEASE</version>
<scope>runtime</scope>
</dependency>
</dependencies>
就是这样,如果你不需要编译通过spring APIs,可以把作用域标志为运行时;这是典型的基本的依赖注入的使用情况; 这个例子使用maven 中心仓库工作.要使用maven中心仓库,你需要在maven配置中指明仓库的地址;如下所示:
<repositories>
<repository>
<id>io.spring.repo.maven.release</id>
<url>http://repo.spring.io/release/</url>
<snapshots><enabled>false</enabled></snapshots>
</repository>
</repositories>
使用里程碑:
<repositories>
<repository>
<id>io.spring.repo.maven.milestone</id>
<url>http://repo.spring.io/milestone/</url>
<snapshots><enabled>false</enabled></snapshots>
</repository>
</repositories>
使用开发快照:
<repositories>
<repository>
<id>io.spring.repo.maven.snapshot</id>
<url>http://repo.spring.io/snapshot/</url>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
-
maven依赖清单 (maven "Bill Of Materials" Dependency) 在使用maven时可能混合着不同的spring jar版本;例如:你要引用第三方的类库,或其他spring项目的文件,会有一个旧版本的传递依赖.如果你没有明确指出该直接依赖,那么项目就会出现各种意想不到的问题. 为了解决这些问题,maven提出了"材料清单"依赖的概念;你可以在你的依赖管理模块中引入spring-framework-bom,就可以保证所有的spring依赖都是一个版本
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>4.3.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies>
</dependencyManagement>```
- 使用BOM的另一个好处是你无需指定每个spring框架产品的版本属性;
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependencies>```
Gradle Dependency Management(Gradle 依赖管理)
要在Gradle系统中使用Spring 仓库,包括在仓库部分合适的url:
```repositories {
mavenCentral()
// and optionally...
maven { url "http://repo.spring.io/release" }
}```
- 你可以将路径从/release更改为/milestone或者/snapshot;一旦你确定了仓库,你可以使用Gradle常用的方式申明依赖
dependencies { compile("org.springframework:spring-context:4.3.0.RELEASE") testCompile("org.springframework:spring-test:4.3.0.RELEASE") }
- Ivy 依赖管理
如果你选择使用Ivy来管理依赖,那么他们与相同的配置选项;
将以下的spring仓库加入到你的ivysettings.xml文件中
``` <resolvers>
<ibiblio name="io.spring.repo.maven.release"
m2compatible="true"
root="http://repo.spring.io/release/"/>
</resolvers>```
你可以将路径从/release更改为/milestone或者/snapshot.一旦配置完,你可以用正常的方式添加依赖;
<dependency org="org.springframework" name="spring-core" rev="4.3.0.RELEASE" conf="compile->runtime"/>
- 分散zip文件
尽管使用构造系统精细依赖管理是一个比较常用的使用spring框架的方式,但你仍可能下载一个分发包;
分散包都在spring maven 仓库中发布(这是为了照顾你的个人爱好,你不需要用maven或其他工具来下载他们);
-要下载一个分布包,你需要在web浏览器打开地址 [spring maven仓库](http://repo.spring.io/release/org/springframework/spring),然后选择你要下载的子包的合适版本.分散的files以dist.zip结尾,例如spring-framework-{spring-version}-release-dist.zip.发散包同样会发布里程碑和快照;