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應用程序能夠登陸到控制檯,這很重要。