spring 简介(译)

文档地址: 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平台开发受益的例子;html

  • 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,基础设施,通讯,测试等部分,图以下; 输入图片说明java

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进行管理;ios

###2.2.1核心容器web

核心容器有spring-core,spring-beans(spring beans管理器),spring-context-support(spring上下文支持),spring-context,spring-expression(spring表达式语言)等模块;spring

spring-core and spring-beans提供了架构的基础,包括了控制反转(IOC)和依赖注入特性;beanFactory是工厂模式的精妙实现;它去掉了单例编程,并使你在实际的编程逻辑中解耦这些依赖的配置和说明;mongodb

上下文模块基于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,也有叫仪器的)express

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 应用 输入图片说明

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整合第三方框架) 输入图片说明 一些状况下不容许你彻底转向另外一种架构.spring不会强迫你使用它的全部东西,它不是一个全有或全无的方案.已存在的前端能够经过struts,Tapestry,JSF或者其余ui框架建立的并被spring整合;spring做为中间层可使用它的事务处理功能.你只须要经过上下文(ApplicationContext)链接你的业务逻辑,并经过web上下文(WebApplicationContext)整合你的web层;

  • 金手指3:远程使用场景 Remoting usage scenario

输入图片说明

当你须要经过web service来访问已存在代码时,你可使用spring的Hessian-,Burlap-,Rmi-或者JaxRpcProxyFactory等类;它们使远程访问不那么困难;

  • 金手指4: EJBs-包装已存在的pojos(Wrapping existing POJOs)

    输入图片说明

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.发散包一样会发布里程碑和快照;
相关文章
相关标签/搜索