Spring Framework基础学习html
Core support for dependency injection,transaction management,web applications,data access,messaging,testing and more前端
推荐的官方文章:http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/index.htmljava
一.Instroduction(介绍)ios
1.引言(Instroduction)web
Spring Framework提供了一个全面的程序和配置模型基于现代Java企业级应用程序,一个部署平台,Spring的关键链接是基础设施,支持于应用层面:Spring关注于企业级应用程序,因此一个团队能够关注于应用层面的业务逻辑,不须要注意特定的部署环境算法
Spring enables you to build applications from "plain old Java objects" (POJOs) and to apply enterprise services non-invasively to POJOs.spring
2.特色(Features)数据库
Spring 框架是一个分层架构,由20多个模块组成,核心容器(Core Container)定义了建立、配置和管理 bean 的方式,组成 Spring 框架的每一个模块(Module)均可独立,express
3.Core Container编程
The Core Container consists of the {spring-core, spring-beans,spring-context,spring-context-support and spring-expression (Spring Expression Language)} modules
Core Container 由{Spring-core, Spring-beans,Spring-context,Spring-context-support and Spring-expression (Spring Expression Language)}模块组成.
Spring-core和Spring-beans模块提供了框架的基础部分,包括IOC(控制反转)和DI(依赖注入)特色,而BeanFactory是复杂的实现了工厂模式(factory pattern),它消除了程序化单例和容许依赖关系的配置和规范与实际程序逻辑分离。
而上下文(Context),Spring-context模块是构建一个结实的基础,经过Core和Beans模块实现,实现的手段(it is a means to):相似于JNDI注册表的以框架式样式(framework-style)访问对象
这个上下文模块(Spring-context)从Beans模块中继承特征和功能,而且增长了国际化(internationalization),好比使用了资源绑定(Resouce bundles),事件传播(Event propagation),资源加载(Resource loading)和透明地建立上下文(The transparent creation of contexts),好比,一个Serlvet container,这个上下文也提供了JAVA EE功能像EJB(企业级JavaBean),JMS(Java消息服务),和基本远程
ApplicationContext接口是上下文(Context)模块的焦点
Spring-context-support给Spring application Context提供了集成通用的第三方类库,好比caching(EnCache,Guava,JCache),mailing(JavaMail),scheduling(CommonJ,Quartz)和template engines(FreeMarker,JasperReports,Velocity)等
Spring-expression模块提供了强大的表达式语言(Expression Language)为运行时查询和操做对象图,是JSP 2.1规范中,统一表达式语言(Unified expression language ,Unified EL)的扩展(extension),这个语言提供了设置和获取属性值,属性获取,方法调用,访问数组内容,集合和索引,逻辑算术运算操做,命名变量,和在Spring'IOC容器中经过名字进行检索对象,它还支持列表投影和选择以及常见列表聚合
4.AOP 和仪表(Instrumentation)
这个Spring-aop模块提供一个AOP Alliance-compliant(不知道怎么翻译) aspect-oriented programming (面向切面的编程语言),运行你去定义,好比方法拦截和切点隔离实现应该分离的功能的代码,使用了源级元功能(Sourcelevel metadata functionality),您还能够以相似.NET属性的方式将行为信息合并到代码中。
单独的spring-aspects模块提供了与AspectJ的集成
spring-instrument模块提供了类仪表(Instrumentation)支持和类加载实现来用于某些应用服务器
spring-instrument-tomcat模块包含为Tomcat 的Spring's 仪表代理
5.Messaging
Spring Framework 4包括一个Spring-messaging模块,其中包括来自Spring 集成(Integration)项目的的关键抽象,好比Message,MessageChannel,MessageHandler,和其余做为服务消息传递的应用程序的基础,这个模块也包含一组注解为映射消息方法,相似于Spring MVC的基于注释的编程模型。
6.Data Access/Integration
Data Access/Integration 由JDBC,ORM,OXM,JMS,和事务模型
Spring-jdbc模块提供了JDBC-抽象层,这消除了对编码和解析数据库供应商特定错误代码的繁琐的JDBC编码的须要。
Spirng-tx模块支持程序化和声明式事务管理为实现特殊接口和全部POJO(普通Java对象)的类。
Spring-orm模块提供了集成层为流行的对象关系映射API,包括JPA,JDO和Hibernate,使用Spring-orm模块,你能够结合使用全部O/R映射框架,用Spring提供的全部其余特色,像以前说的声明式事务管理特色
Spring-oxm模块提供了抽象层支持Object/XML映射实现好比JAXB,Castor.XMLBeans,JiBX和XStream
Spring-jms模块(Java Messaging Service)包含生成和消费消息特色,自Spring Framework 4.1以来,它提供了与Spring-messaging模块的集成
7.Web
Web 层由spring-web,spring-webmvc,spring-websocket和spring-webmvc-portlet模块组成
spring-web模块提供了基础面向web集成的特色像好比多文件上传和使用Servlet监听器初始化IOC容器和面向web应用程序上下文,也包含了一个HTTP客户端和Spring的远程支持的web相关部分。
spring-webmvc模块(也叫Web-Servlet 模块)包含Spring model-view-controller(MVC)和REST风格的Web 服务(Service)实现web应用程序,Spring
MVC框架提供了一个域模型(domain model)代码和Web表单之间的清晰分隔,并与Spring Framework的全部其余功能集成。
spring-webmvc-portlet模块(也叫Web-Portlet 模块)提供实现MVC来使用Porlet(Portlet是基于Java的Web组件,由Portlet容器管理,并由容器处理请求,生产动态内容)环境并反映了基于Servlet的spring-webmvc模块的功能。
8.Test
spring-test模块用JUnit或TestNG为Spring的 组件(components)提供了单元测试(unit testing)和集成测试(integration testing),支持Spring ApplicationContexts的一致加载和这些上下文的缓存,还提供了可用于独立于测试代码的模拟对象。
二.Usage scenarios(使用场景)
首先,以前所描述的Spring提供的功能使得它可用于许多场景(Scenarios),从运行资源受限的嵌入式应用程序到使用Spring的事务管理功能和Web框架的成熟(full-fledged)的企业级应用程序
典型的成熟的Spring web应用程序
Spring的声明式管理特色使得Web应用程序彻底事务性,就像使用EJB容器管理的事务同样,全部的你自定义的逻辑能够用简单的POJO实现,和经过Spring IOC容器管理,另外的服务包括支持了发送电子邮件和独立于Web层的验证(Validation),可以让你选择执行验证规则,Spring ORM提供用JPA,Hibernate和JDO实现集成,好比当你使用Hibernate时,你能够继续使用额外的映射文件和标准的Hibernate SessionFactory配置(configuration),表单控制器将网络层与域模型无缝集成,消除了对ActionForms或将HTTP参数转换为域模型值时的对其余类的需求。
Spring 中间层(middle-tier)使用第三方(third-party)web 框架
有时候你不能彻底切换到不一样的框架,那么Spring Framework也不会强制你使用,不是一个没有任何解决的方案。若是现有的前端采用Struts构建,Tapestry,JSF或其余UI框架也能够与基于Spring的中间层集成,这容许您使用Spring事务功能,你只须要使用ApplicationContext(应用程序上下文)链接你的业务逻辑,并使用WebApplicationContext(Web 应用程序上下文)来集成你的Web层。
远程使用场景
当你须要经过web 服务(service)访问已经存在的代码,你能够Spring的Hessian-Burlap,Rmi-或JaxRpcProxyFactory类,启用对现有应用程序的远程访问就变得并不困难了
三.依赖管理和命名约定
依赖管理和依赖注入是不一样的东西,想在你的应用程序(Application)中增长这些Spring的功能,你须要加入全部须要的类库(jar files)和在运行时或编译时导入到你的类路径中(classpath),这些依赖关系不是被注入的虚拟组件,而是文件系统中的物理资源(一般)
依赖管理的过程涉及(involves)定位这些资源,存储它们并将它们添加到类路径中,能够是直接的(好比,个人应用程序在运行时依赖于Spring),也能够是间接的(好比个人应用程序依赖于commons-dbcp,,它取决于commons-pool),这种间接的依赖也叫作"传递性(transitive)"
若是你想使用Spring,你须要拷贝这些构成您所须要的Spring 类库,为了使这更容易,Spring被打包成一组模块,尽量多地分离依赖关系,所以,例如,若是您不想编写Web应用程序,则不须要Spring-web 模块,在指南中参考Spring 类库的模型,咱们使用了简单的命名约定spring-*或spirng-*.jar,这里的*表明模块的一个简短的名字(好比Spring-core,Spring-webmvc,spring-jms等),这些实际jar文件名一般是与版本号链接的模块名称(例如spring-core-4.3.10.RELEASE.jar)。
Spring Framework的每一个版本都会将工件发布到如下位置:
Maven Central,Maven获取的默认仓库,Spring依赖的许多常见的库也能够从Maven Central得到,Spring社区的大部分使用Maven进行依赖管理,
这里的jar的名字是spring - * - <version> .jar,而Maven groupId就是org.springframework。
因此你须要决定的第一件事是如何管理你的依赖关系:咱们一般建议使用像Maven,Gradle或Ivy这样的自动化系统,但你也能够经过本身下载全部的jar来手动执行。
如下你可发现一组Spring artifacts,想获取更详细的模块描述,see Section 2.2, “Framework Modules”.
尽管Spring提供了集成和支持为普遍的企业和其余外部工具,它有意地将其强制性依赖性保持在绝对最小值:你不须要定位和下载(甚至自动)大量的jar库,使用Spring进行简单的用例,对于基本依赖注入,只有一个强制性的外部依赖关系,也就是用于日志记录(有关日志记录选项的更详细描述,请参阅下文)
若是你使用Maven进行依赖关系管理,甚至不须要显式提供记录依赖关系。例如,要建立应用程序上下文并使用依赖注入来配置应用程序,您的Maven依赖项将以下所示:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.10.RELEASE</version> <scope>runtime</scope> </dependency> </dependencies>
而已,注意这个scope可被声明为runtime,若是你不须要编译Spring APIs,一般状况下这是基本依赖注入用例的状况
以上例子使用的是Maven Central repository,若是要使用Spring Maven repository,须要在年的Maven配置中指定仓库地址:
<repositories> <repository> <id>io.spring.repo.maven.release</id> <url>http://repo.spring.io/release/</url> <snapshots><enabled>false</enabled></snapshots> </repository> </repositories>
使用Maven时,可能会发生混杂着不一样版本的Spring JARs,例如,你可能会发现第三方库或另外一个Spring项目会将旧的版本的依赖关系传递给旧版本。若是你忘记本身明确声明直接依赖,可能会出现各类意外问题。
克服这些问题,Maven提供了一个"bill of materials(BOM)"概念,你能够导入(import)spring-framework-bom在你的dependencyManagement中确保Spring 依赖(直接和间接)是相同的版本.
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>4.3.10.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
使用BOM的优势是你不须要冗长的指定<version>属性,当指定Spring Framework artifacts依赖
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> <dependencies>
2.Logging
Loggind在Spring中是很是重要(important)的依赖,由于:
开发Application 中一个很是重要的目标就是在中心位置使用统一的Logging配置全部的Application,包括全部外部组件
这比之前有更多的困难,由于有这么多的日志框架选择。
在Spring中的强制性日志依赖关系是Jakarta Commons Logging API(JCL),咱们针对JCL进行编译,咱们还使JCL Log对象可见于扩展Spring Framework的类。
对于用户而言,全部版本的Spring都使用相同的日志库很重要:迁移很容易,由于即便延伸Spring的应用程序仍然保留向后兼容性,咱们这样作的方法是使Spring中的一个模块明确地依赖于commons-logging(JCL的规范实现),让它们编译全部的其余模块在编译时依赖它,例如,若是你使用Maven,而且想知道在哪里能够获取对commons-logging的依赖,那么它来自Spring,特别是来自名为spring-core的中央模块。
使用commons-logging的好处是你不须要任何其余操做来使你的应用程序正常工做,它具备运行时发现算法,能够在类路径中的众所周知的地方查找其余日志记录框架,并使用它认为合适的方法,或者你告诉它,若是没有其余可用的,你能够从JDK(简称java.util.logging或JUL)得到日志。
您应该发现,在大多数状况下,您的Spring应用程序能够登陆到控制台,这很重要。