Spring Framework基础学习
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.html
一.Instroduction(介绍)
1.引言(Instroduction)
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.
2.特点(Features)
- 依赖注入(Dependency Injection,DI)
- 面向切面的编程(Aspect-Oriented Programming)包括 Spring式的声明式事务管理(Spring‘s declarative transaction management)
- Spring MVC web应用程序(Spring MVC web application) 和 RESTful web 服务框架(RESTfulweb service framework)
- 对JDBC,JPA,JMS的基础支持(Foundational support)
Spring 框架是一个分层架构,由20多个模块组成,核心容器(Core Container)定义了创建、配置和管理 bean 的方式,组成 Spring 框架的每个模块(Module)都可独立,
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 Dependencies and Depending on Spring
尽管Spring提供了集成和支持为广泛的企业和其他外部工具,它有意地将其强制性依赖性保持在绝对最小值:你不需要定位和下载(甚至自动)大量的jar库,使用Spring进行简单的用例,对于基本依赖注入,只有一个强制性的外部依赖关系,也就是用于日志记录(有关日志记录选项的更详细描述,请参阅下文)
Maven Dependency Management
如果你使用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 "Bill Of Materials" Dependency
使用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)的依赖,因为:
- 唯一的一个强制性外部依赖(mandatory external dependency)
- 每个人都希望能从他们的使用中输出一些信息
- Spring集成用许多其他工具,也可以选择的logging依赖(dependency)
开发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应用程序可以登录到控制台,这很重要。