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)的依賴,因為:
- 唯一的一個強制性外部依賴(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應用程序可以登錄到控制臺,這很重要。
Spring Framework基礎學習