Spring Framework基础学习

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)的依赖,因为:

  1. 唯一的一个强制性外部依赖(mandatory external dependency)
  2. 每个人都希望能从他们的使用中输出一些信息
  3. 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应用程序可以登录到控制台,这很重要。

时间: 09-10

Spring Framework基础学习的相关文章

Spring注解基础学习总结

1.依赖注入注解: @Component:Bean注入到Spring容器组件(通用) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE):Bean作用域( SCOPE_PROTOTYPE:每次注入bean就是一个新的Bean SCOPE_SINGLETON:单例 ) @Repository:标记该类为Dao数据访问层 @Service:标记该类为Service业务逻辑层 @Controller:标记该类为Controller控制访问层 @Autowir

spring mvc 基础学习

springmvc 框架原理 : 前端控制器.处理器映射器.处理器适配器.视图解析器 springmvc 入门: spring 和 ibatis 整合 springmvc 注解开发 常用注解学习 参数绑定(简单类型.pojo.集合类型) 自定义参数绑定* 数据回显 1.1 springmvc 框架 springmvc 是 spring 框架的一个模块,无需中间整合层进行整合,是基于mvc的web框架 1.2 什么是mvc mvc 是一个设计模式 1.3 springmvc框架

spring boot 基础学习

构建微服务:Spring boot 入门篇 http://www.cnblogs.com/ityouknow/p/5662753.html SpringBoot入门系列:第一篇 Hello World http://blog.csdn.net/lxhjh/article/details/51711148 Spring Boot 快速入门 http://blog.csdn.net/xiaoyu411502/article/details/47864969 Spring Boot 官方文档学习(一)

Spring MVC基础学习

SpringMVC是Spring框架的一个模块,无需通过中间层整合在一起.SpringMVC是一个基于MVC设计模式web框架,MVC-model-view-controller:MVC将服务器端分为M.V.C三个组件,各模块负责各自的业务,实现了数据.业务逻辑和视图显示的分离.使软件模块化.model处理数据属于业务逻辑,controller完成数据和业务的调度,view完成视图显示. SpringMVC的几个重要组件:DispatcherServlet:前端控制器,主要是接收前端数据,通过H

[Spring Framework]学习笔记--@Component等stereotype的基础

在继续讲解Spring MVC之前,需要说一下常用的几个用来标记stereotype的annotation. @Component,@Controller,@Repository,@Service. 这四个都在org.springframework.stereotype包下面,后面3个都属于@Component. 可以理解为@Component是@Controller,@Repository,@Service的基类. @Component是用来标记任何被Spring管理的组件. @Control

CgLib动态代理学习【Spring AOP基础之一】

如果不了解JDK中proxy动态代理机制的可以先查看上篇文章的内容:Java动态代理学习[Spring AOP基础之一] 由于Java动态代理Proxy.newProxyInstance()的时候会发现其参数类型是ClassLoader classLoader, Class<?>[] interface, InvocationHandler handler, 只支持根据接口实现代理类,如果所有代码都是自己掌控,当然没有问题.所有的业务逻辑均抽象出接口,然后所有的业务类实现接口,这样所有的业务类

Spring Framework------&gt;version4.3.5.RELAESE-----&gt;Reference Documentation学习心得-----&gt;Spring Framework中的spring web MVC模块

spring framework中的spring web MVC模块 1.概述 spring web mvc是spring框架中的一个模块 spring web mvc实现了web的MVC架构模式,可以被用于开发web网站 spring web mvc 实现web网站的原理,如下图: 2.使用spring web mvc开发web应用的步骤 step1:在自己的工程中引入spring web mvc模块 step2:配置spring web mvc模块 中的DispatcherServlet,告

Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion

前言 在Spring Framework官方文档中,这三者是放到一起讲的,但没有解释为什么放到一起.大概是默认了读者都是有相关经验的人,但事实并非如此,例如我.好在闷着头看了一遍,又查资料又敲代码,总算明白了. 其实说穿了一文不值,我们用一个例子来解释: 假定,现有一个app,功能是接收你输入的生日,然后显示你的年龄.看起来app只要用当前日期减去你输入的日期就是年龄,应该很简单对吧?可惜事实不是这样的. 这里面有三个问题: 问题一:我们输入的永远是字符串,字符串需要转成日期格式才能被我们的ap

Spring:(一)入门基础学习

前述 因为前几日刚刚学完Spring的基础,因此写一篇博客整理一下相关的基础知识. 什么是Spring? Spring 是一个轻量级的 DI / IoC 和 AOP 容器的开源框架,帮助分离项目组件之间的依赖关系.,来源于 Rod Johnson 在其著作<Expert one on one J2EE design and development>中阐述的部分理念和原型衍生而来. Spring:SE/EE开发的一站式框架. 一站式框架:有EE开发的每一层解决方案. WEB层