天天看點

Spring概述

spring 是什麼

spring是一個開源的輕量級java se(java 标準版本)/java ee(java 企業版本)開發應用架構,其目的是用于簡化企業級應用程式開發。應用程式是由一組互相協作的對象組成。而在傳統應用程式開發中,一個完整的應用是由一組互相協作的對象組成。是以開發一個應用除了要開發業務邏輯之外,最多的是關注如何使這些對象協作來完成所需功能,而且要低耦合、高内聚。業務邏輯開發是不可避免的,那如果有個架構出來幫我們來建立對象及管理這些對象之間的依賴關系。可能有人說了,比如“抽象工廠、工廠方法設計模式”不也可以幫我們建立對象,“生成器模式”幫我們處理對象間的依賴關系,不也能完成這些功能嗎?可是這些又需要我們建立另一些工廠類、生成器類,我們又要另外管理這些類,增加了我們的負擔,如果能通過配置方式來建立對象,管理對象之間依賴關系,我們不需要通過工廠和生成器來建立及管理對象之間的依賴關系,這樣我們是不是減少了許多工作,加速了開發,能節省出很多時間來幹其他事。spring架構剛出來時主要就是來完成這個功能。

spring架構除了幫我們管理對象及其依賴關系,還提供像通用日志記錄、性能統計、安全控制、異常處理等面向切面的能力,還能幫我們管理最頭疼的資料庫事務,它本身提供了一套簡單的jdbc通路實作,還能與第三方資料庫通路架構內建(如hibernate、jpa),與各種java ee技術整合(如java mail、任務排程等等),提供一套自己的web層架構spring mvc、而且還能非常簡單的與第三方web架構內建。從這裡我們可以認為spring是一個超級粘合平台,除了自己提供功能外,還提供粘合其他技術和架構的能力,進而使我們可以更自由的選擇到底使用什麼技術進行開發。而且不管是java se(c/s架構)應用程式還是java ee(b/s架構)應用程式都可以使用這個平台進行開發。讓我們來深入看一下spring到底能幫我們做些什麼?

2、 spring 能幫我們做什麼

spring除了不能幫我們寫業務邏輯,其餘的幾乎什麼都能幫助我們簡化開發:

傳統程式開發,建立對象及組裝對象間依賴關系由我們在程式内部進行控制,這樣會加大各個對象間的耦合,如果我們要修改對象間的依賴關系就必須修改源代碼,重新編譯、部署;而如果采用spring,則由spring根據配置檔案來進行建立及組裝對象間依賴關系,隻需要改配置檔案即可,無需重新編譯。是以,spring能幫我們根據配置檔案建立及組裝對象之間的依賴關系。

當我們要進行一些日志記錄、權限控制、性能統計等時,在傳統應用程式當中我們可能在需要的對象或方法中進行,而且比如權限控制、性能統計大部分是重複的,這樣代碼中就存在大量重複代碼,即使有人說我把通用部分提取出來,那必然存在調用還是存在重複,像性能統計我們可能隻是在必要時才進行,在診斷完畢後要删除這些代碼;還有日志記錄,比如記錄一些方法通路日志、資料通路日志等等,這些都會滲透到各個通路方法中;還有權限控制,必須在方法執行開始進行稽核,想想這些是多麼可怕而且是多麼無聊的工作。如果采用spring,這些日志記錄、權限控制、性能統計從業務邏輯中分離出來,通過spring支援的面向切面程式設計,在需要這些功能的地方動态添加這些功能,無需滲透到各個需要的方法或對象中;有人可能說了,我們可以使用“代理設計模式”或“包裝器設計模式”,你可以使用這些,但還是需要通過程式設計方式來建立代理對象,還是要耦合這些代理對象,而采用spring 面向切面程式設計能提供一種更好的方式來完成上述功能,一般通過配置方式,而且不需要在現有代碼中添加任何額外代碼,現有代碼專注業務邏輯。是以,spring 面向切面程式設計能幫助我們無耦合的實作日志記錄,性能統計,安全控制。

在傳統應用程式當中,我們如何來完成資料庫事務管理?需要一系列“擷取連接配接,執行sql,送出或復原事務,關閉連接配接”,而且還要保證在最後一定要關閉連接配接,多麼可怕的事情,而且也很無聊;如果采用spring,我們隻需擷取連接配接,執行sql,其他的都交給spring來管理了,簡單吧。是以,spring能非常簡單的幫我們管理資料庫事務。

spring還能與第三方資料庫通路架構(如hibernate、jpa)無縫內建,而且自己也提供了一套jdbc通路模闆,來友善資料庫通路。

spring還能與第三方web(如struts、jsf)架構無縫內建,而且自己也提供了一套spring mvc架構,來友善web層搭建。

spring能友善的與java ee(如java mail、任務排程)整合,與更多技術整合(比如緩存架構)。

spring能幫我們做這麼多事情,提供這麼多功能和與那麼多主流技術整合,而且是幫我們做了開發中比較頭疼和困難的事情,那可能有人會問,難道隻有spring這一個架構,沒有其他選擇?當然有,比如ejb需要依賴應用伺服器、開發效率低、在開發中小型項目是宰雞拿牛刀,雖然發展到現在,ejb已經比較好用了,但還是比較笨重還需要依賴應用伺服器等。那為何需要使用spring,而不是其他架構呢?讓我們接着往下看。

3、 為何需要 spring

(1)首先闡述幾個概念

應用程式:是能完成我們所需要功能的成品,比如購物網站、oa系統。

架構:是能完成一定功能的半成品,比如我們可以使用架構進行購物網站開發;架構做一部分功能,我們自己做一部分功能,這樣應用程式就建立出來了。而且架構規定了你在開發應用程式時的整體架構,提供了一些基礎功能,還規定了類和對象的如何建立、如何協作等,進而簡化我們開發,讓我們專注于業務邏輯開發。

非侵入式設計:從架構角度可以這樣了解,無需繼承架構提供的類,這種設計就可以看作是非侵入式設計,如果繼承了這些架構類,就是侵入設計,如果以後想更換架構,之前寫過的代碼幾乎無法重用,如果非侵入式設計則之前寫過的代碼仍然可以繼續使用。

輕量級及重量級:輕量級是相對于重量級而言的,輕量級一般就是非入侵性的、所依賴的東西非常少、資源占用非常少、部署簡單等等,其實就是比較容易使用,而重量級正好相反。

pojo:pojo(plain old java objects)簡單的java對象,它可以包含業務邏輯或持久化邏輯,但不擔當任何特殊角色且不繼承或不實作任何其它java架構的類或接口。

容器:在日常生活中容器就是一種盛放東西的器具,從程式設計角度看就是裝對象的的對象,因為存在放入、拿出等操作,是以容器還要管理對象的生命周期。

控制反轉:即inversion of control,縮寫為ioc,控制反轉還有一個名字叫做依賴注入(dependency injection),就是由容器控制程式之間的關系,而非傳統實作中,由程式代碼直接操控。

bean:一般指容器管理對象,在spring中指spring ioc容器管理對象。

(2)為什麼需要 spring 及 spring 的優點

非常輕量級的容器:以集中的、自動化的方式進行應用程式對象建立和裝配,負責對象建立和裝配,管理對象生命周期,能組合成複雜的應用程式。spring容器是非侵入式的(不需要依賴任何spring特定類),而且完全采用pojos進行開發,使應用程式更容易測試、更容易管理。而且核心jar包非常小,spring3.0.5不到1m,而且不需要依賴任何應用伺服器,可以部署在任何環境(java se或java ee)。

aop:aop是aspect oriented programming的縮寫,意思是面向切面程式設計,提供從另一個角度來考慮程式結構以完善面向對象程式設計(相對于oop),即可以通過在編譯期間、裝載期間或運作期間實作在不修改源代碼的情況下給程式動态添加功能的一種技術。通俗點說就是把可重用的功能提取出來,然後将這些通用功能在合适的時候織入到應用程式中;比如安全,日志記錄,這些都是通用的功能,我們可以把它們提取出來,然後在程式執行的合适地方織入這些代碼并執行它們,進而完成需要的功能并複用了這些功能。

簡單的資料庫事務管理:在使用資料庫的應用程式當中,自己管理資料庫事務是一項很讓人頭疼的事,而且很容易出現錯誤,spring支援可插入的事務管理支援,而且無需javaee環境支援,通過spring管理事務可以把我們從事務管理中解放出來來專注業務邏輯。

jdbc抽象及orm架構支援:spring使jdbc更加容易使用;提供dao(資料通路對象)支援,非常友善內建第三方orm架構,比如hibernate等;并且完全支援spring事務和使用spring提供的一緻的異常體系。

靈活的web層支援:spring本身提供一套非常強大的mvc架構,而且可以非常容易的與第三方mvc架構內建,比如struts等。

簡化各種技術內建:提供對java mail、任務排程、jmx、jms、jndi、ejb、動态語言、遠端通路、web service等的內建。

spring能幫助我們簡化應用程式開發,幫助我們建立群組裝對象,為我們管理事務,簡單的mvc架構,可以把spring看作是一個超級粘合平台,能把很多技術整合在一起,形成一個整體,使系統結構更優良、性能更出衆,進而加速我們程式開發,有如上優點,我們沒有理由不考慮使用它。

4、 如何學好 spring

要學好spring,首先要明确spring是個什麼東西,能幫我們做些什麼事情,知道了這些然後做個簡單的例子,這樣就基本知道怎麼使用spring了。spring核心是ioc容器,是以一定要透徹了解什麼是ioc容器,以及如何配置及使用容器,其他所有技術都是基于容器實作的;了解好ioc後,接下來是面向切面程式設計,首先還是明确概念,基本配置,最後是實作原理,接下來就是資料庫事務管理,其實spring管理事務是通過面向切面程式設計實作的,是以基礎很重要,ioc容器和面向切面程式設計搞定後,其餘都是基于這倆東西的實作,學起來就更加輕松了。要學好spring不能急,一定要把基礎打牢,基礎牢固了,學起來就會很快,這就是磨刀不誤砍柴工。

上一篇: Maven入門
下一篇: Spring基礎