Spring介紹

spring的好處:
1.低侵入式設計,代碼污染極低。 
2.獨立於各種應用服務器,可以真正實現Write Once,Run Anywhere的承諾。
3.Spring的DI機制降低了業務對象替換的複雜性。
4.Spring並不完全依賴於Spring,開發者可自由選用Spring框架的部分或全部。


  spring的特點:
1.輕量級的------從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可
  以在一個大小隻有1MB多的JAR文件裏發佈。並 且Spring所需的處理開銷也是
  微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的對象不依賴於Spring的特定類.
2.控制反轉------Spring通過一種稱作控制反轉(IoC)的技術促進了鬆耦 合。當應
  用了IoC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個
  對象自己創建或者查找依賴對象。你可以認爲IoC與JNDI相反------不 是對象從容
  器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。
3.面向切面  Spring提供了面向切面編程的豐富支持,允許通過分離應用的 業務
  邏輯與系統級服務(例如審計(auditing)和事務()管理)進行內聚性的開發。
  應用對象只實現它們應該做的-----完成業務邏輯-----僅此而已。它們 並不負責(甚至
  是意識)其它的系統級關注點,例如日誌或事務支持。
4.容器------Spring包含並管理應用對象的配置和生命週期,在這個意義上它是 一種容
  器,你可以配置你的每個bean如何被創建------基於一個可配置原型(prototype),
  你的bean可以創建一個單獨的實例或者每次需要時都生 成一個新的實例------以及它
  們是如何相互關聯的。然而,Spring不應該被混同於傳統的重量級的EJB容器,它們經常是龐大與笨重的,難以使用。
5.框架------Spring可以將簡單的組件配置、組合成爲複雜的應用。在Spring中,應用對
  象被聲明式地組合,典型地是在一個XML文件裏。Spring也提供了很多基礎功能(事
  務管理、持久化框架集成等等),將應用邏輯的開發留給了你。
 
 


Spring的IOC機制:
控制反轉:調用者,不再被調用的實例,由spring概要來實現
依賴注入:創建好實例後,再注入調用者,又稱爲"依賴注入",注入的方式:構造器注入,方法注入,設值注入.
 


Spring的核心:
spring的核心應該是IOC容器,它主要有BeanFactory和applicationContext兩個主要的接口實現
BeanFactory:主要是完成bean的初始化和配置,也就是說BeanFactory使我們管理任何對象成爲了可能.
ApplictionContext:除了BeanFactory的所有功能之外,它還提供了國際化處理,資源管理,加入web框
架中(加入一個servlet或監聽器),更易於AOP的集成.
                  


  spring的監聽器:
spring中的提供了一個名爲org.springframework.web.util.IntrospectorCleanupListener的監聽器。
它主要負責處理由JavaBeans  Introspector的使用而引起的緩衝泄露。
描述:它是一個在web應用關閉的時候,清除JavaBeans Introspector的監聽器.在web.xml中註冊這個listener.
可以保證在web 應用關閉的時候釋放與掉這個web應用相關的class loader 和由它管理的類如果你使用了
JavaBeans Introspector來分析應用中的類,Introspector 緩衝中會保留這些類的引用.結果在你的應用
關閉的時候,這些類以及web 應用相關的class loader沒有被垃圾回收.不幸的是,清除Introspector的唯一
方式是刷新整個緩衝.這是因爲我們沒法判斷哪些是屬於你的應用的引用.所以刪除被緩衝的introspection
會導致把這臺電腦上的所有應用的introspection都刪掉.
注意:spring 託管的bean不需要使用這個監聽器.因爲spring它自己的introspection所使用的緩衝在分析
完一個類之後會被馬上從javaBeans Introspector緩衝中清除掉.應用程序中的類從來不直接使用JavaBeans
Introspector.所以他們一般不會導致內部查看資源泄露.但是一些類庫和框架往往會產生這個問題.例如:Struts 和Quartz.
單個的內部查看泄漏會導致整個的web應用的類加載器不能進行垃圾回收.在web應用關閉之後,你會看到此應
用的所有靜態類資源(例如單例).這個錯誤當然不是由這個類自身引起的.


   SpringBean的管理
分類:在spring2.0之前bean只有singleton(單例)、prototype(原型)2種作用域.Spring2.0以後,增加了session、
request、global session三種專用於Web應用程序上下文的Bean。
   1.prototype:
prototype作用域部署的bean,每一次請求(將其注入到另一個bean中,或者以程序的方式調用容器的getBean()方法)
都會產生一個新的bean實例,相當於一個new的操作,對於prototype作用域的bean,有一點非常重要,那就是Spring不
能對一個prototype bean的整個生命週期負責,容器在初始化、配置、裝飾或者是裝配完一個prototype實例後,將它
交給客戶端,隨後就對該prototype實例不聞不問了。不管何種作用域,容器都會調用所有對象的初始化
生命週期回調方法,而對prototype而言,任何配置好的析構生命週期回調方法都將不會被調用。清除prototype作用域的
對象並釋放任何prototype bean所持有的昂貴資源,都是客戶端代碼的職責(讓Spring容器釋放被singleton作用域bean佔
用資源的一種可行方式是,通過使用bean的後置處理器,該處理器持有要被清除的bean的引用。)
   2.singleton:
當一個bean的作用域設置爲singleton,那麼Spring IOC容器中只會存在一個共享的bean實例,並且所有對bean的請求,只
要id與該bean定義相匹配,則只會返回bean的同一實例。換言之,當把一個bean定義設置爲singleton作用域時,Spring IOC
容器只會創建該bean定義的唯一實例。這個單一實例會被存儲到單例緩存(singleton cache)中,並且所有針對該bean的後續
請求和引用都將返回被緩存的對象實例,這裏要注意的是singleton作用域和GOF設計模式中的單例是完全不同的,單例設計模式
表示一個ClassLoader中只有一個class存在,而這裏的singleton則表示一個容器對應一個bean,也就是說當一個bean被標識爲
singleton時候,spring的IOC容器中只會存在一個該bean。
   3.session:
session作用域表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP session內有效.
   4.request:
request表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP request內有效.
   5.global session:
global session作用域類似於標準的HTTP Session作用域,不過它僅僅在基於portlet的web應用中才有意義。
Portlet規範定義了全局Session的概念,它被所有構成某個portlet web應用的各種不同的portlet所共享。
在global session作用域中定義的bean被限定於全局portlet Session的生命週期範圍內。如果你在web中使用
global session作用域來標識bean,那麼,web會自動當成session類型來使用。


   自定義bean裝配作用域
在spring 2.0中作用域是可以任意擴展的,你可以自定義作用域,甚至你也可以重新定義已有的作用域
(但是你不能覆蓋singleton和prototype),spring的作用域由接口org.springframework.beans.factory.config.Scope來定義,
自定義自己的作用域只要實現該接口即可.


spring由七大模塊組成:
   Spring 核心容器(Core):
提供Spring框架的基本功能。核心容器的主要組件是BeanFactory,她是工廠模式的實現。BeanFactory使
用控制反轉(Ioc)模式將應用程序的配置和依賴性規範與實際的應用代碼程序分開。
   Spring AOP:
通過配置管理特性,Spring AOP模塊直接面向方面的編程功能集成到了Spring框架中,所以可以很容易的
使Spring框架管理的任何對象支持 AOP。Spring AOP模塊爲基於Spring的應用程序中的對象提供了事務管
理服務。通過使用Spring AOP,不用依賴於EJB組件,就可以將聲明性事務管理集成到應用程序中。
  Spring ORM:
Spring框架集成了若干ORM框架,從而提供了ORM的對象關係工具,其中包括 JDO、Hibernate、iBatis和TopLink。
所有這些都遵從Spring的通用事務和DAO異常層結構。
  Spring DAO:
JDBC DAO抽象層提供了有意義的異常層次的結構,可用該結構來管理異常處理和不同數據供應商拋出的異常
錯誤信息。異常層次結構簡化了錯誤處理,並且大大的降低 了需要編寫的異常代碼數量(例如,打開和關係連接)
。Spring DAO的面向JDBC的異常遵從通用的DAO異常層結構。
  Spring WEB:
Web上下文模塊建立在上下文模塊(Context)的基礎之上,爲基於Web服務的應用程序提供了上下文的服務。
所以Spring框架支持 Jakarta Struts的集成。Web模塊還簡化了處理多部分請求及將請求參數綁定到域對象的工作。
  Spring上下文(Context):
Spring上下文是一個配置文件,向Spring框架提供上下文信息。Spring上下文包括企業服務,例如 JNDI、EJB、電子
郵件、國際化校驗和調度功能。
  Spring MVC:
Spring的MVC框架是一個全功能的構建Web應用程序的MVC實現。通過策略接口,MVC框架變成爲高度可配置的,MVC容納
的大量視圖技術,包括JSP、Velocity、Tiles、iText和Pol


   Spring AOP的定義:
面向切面編程(AOP)提供另外一種角度來思考程序結構,通過這種方式彌補了面向對象編程(OOP)的不足。
除了類(classes)以外,AOP提供了 切面。切面對關注點進行模塊化,例如橫切多個類型和對象的事務管理。
它是非業務性編程。


   Spring AOP的作用:
1.提供聲明式企業服務,特別是爲了替代EJB聲明式服務。 最重要的服務是 聲明性事務管理(declarative
    transaction management) , 這個服務建立在Spring的抽象事務管理(transaction abstraction)之上。
2.允許用戶實現自定義的切面,用AOP來完善OOP的使用。


   AOP具體實現:
AOP是一個概念,並沒有設定具體語言的實現,它能克服那些只有單繼承特性語言的缺點(如Java),
AOP具體實現有以下幾個:1.AspectJ (TM):創建於Xerox PARC. 有近十年曆史,成熟
                         缺點:過於複雜;破壞封裝;需要專門的Java編譯器。
                       2.動態AOP:使用JDK的動態代理API或字節碼Bytecode處理技術。


AOP關鍵詞:
  1.切面(Aspect):
一個關注點的模塊化,這個關注點可能會橫切多個對象。事務管理是J2EE應用中一個關於橫切關注點的很
好的例子。在Spring AOP中,切面可以使用通用類(基於模式的風格) 或者在普通類中以 @Aspect 註解
(@AspectJ風格)來實現。
   2.連接點(Joinpoint):
在程序執行過程中某個特定的點,比如某方法調用的時候或者處理異常的時候。 在Spring AOP中,一個
連接點總是代表一個方法的執行。通過聲明一個org.aspectj.lang.JoinPoint類型的參數可以使通知
(Advice)的主體部分獲得連接點信息。
   3.通知(Advice):
在切面的某個特定的連接點(Joinpoint)上執行的動作。通知有各種類型,其中包括“around”、“before”
和“after”等通知。 通知的類型將在後面部分進行討論。許多AOP框架,包括Spring,都是以攔截器做通
知模型, 並維護一個以連接點爲中心的攔截器鏈。
   4.切入點(Pointcut):
匹配連接點(Joinpoint)的斷言。通知和一個切入點表達式關聯,並在滿足這個切入點的連接點上
運行(例如,當執行某個特定名稱的方法時)。
切入點表達式如何和連接點匹配是AOP的核心:Spring缺省使用AspectJ切入點語法。
   5.引入(Introduction):(也被稱爲內部類型聲明(inter-type declaration))。
聲明額外的方法或者某個類型的字段。 Spring允許引入新的接口(以及一個對應的實現)到任何被代理
的對象。 例如,你可以使用一個引入來使bean實現 IsModified 接口,以便簡化緩存機制。
   6.目標對象(Target Object):
被一個或者多個切面(aspect)所通知(advise)的對象。也有人把它叫做 被通知(advised) 對象。
既然Spring AOP是通過運行時代理實現的,這個對象永遠是一個 被代理(proxied) 對象。
   7.AOP代理(AOP Proxy):
AOP框架創建的對象,用來實現切面契約(aspect contract)(包括通知方法執行等功能)。 在Spring
中,AOP代理可以是JDK動態代理或者CGLIB代理。 注意:Spring2.0最新引入的基於模式(schema-based)
風格和@AspectJ註解風格的切面聲明,對於使用這些風格的用戶來說,代理的創建是透明的。
   8.織入(Weaving):
把切面(aspect)連接到其它的應用程序類型或者對象上,並創建一個被通知(advised)的對象。 這些
可以在編譯時(例如使用AspectJ編譯器),類加載時和運行時完成。 Spring和其他純Java AOP框架一樣,
在運行時完成織入。


    AOP的通知的類型:
前置通知(Before advice):
    在某連接點(join point)之前執行的通知,但這個通知不能阻止連接點前的執行(除非它拋出一個異常)。
返回後通知(After returning advice):
    在某連接點(join point)正常完成後執行的通知:例如,一個方法沒有拋出任何異常,正常返回。
拋出異常後通知(After throwing advice):
    在方法拋出異常退出時執行的通知。
後通知(After (finally) advice):
    當某連接點退出的時候執行的通知(不論是正常返回還是異常退出)
環繞通知(Around Advice):
    包圍一個連接點(join point)的通知,如方法調用。這是最強大的一種通知類型。環繞通知可以在方法
    調用前後完成自定義的行爲。它也會選擇是否繼續執行連接點或直接返回它們自己的返回值或拋出異常來
    結束執行。
   


   什麼是事務:
事務是一組原子操作單元,要麼全部執行成功,若因爲某個原因其中一條指令執行有錯誤,則撤銷先前執行過
的所有指令。 更簡答的說就是:要麼全部執行成功,要麼撤銷不執行。   
   事務有四個特性:
1.原子性
2.一致性
3.隔離性
4.持久性


    事務的好處:
1.它能夠保證數據的完整性,一致性。
2.它可以讓我們從複雜的事務處理中解脫出來。
   Spring事務可以分爲兩種:
1.聲明式事務
    聲明式事務是非侵入式的事務;聲明式事務只需在配置文件中配置,而不需要去操作邏輯代碼;
2.編程式事務
    編程式事務是侵入式事務,而編程式事務則要操作邏輯代碼;相對繁瑣,而且不利於系統的擴展;
   
所以在項目中比較常用聲明式事務;
    1、編程式的事務管理可以清楚地控制事務的邊界,也就是讓您自行實現事務開始時間、撤消操作的時機、
        結束時間等,可以實現細粒度的事務控制。
    2、然而多數的情況下,事務並不需要細粒度的控制,而是採用聲明式的事務管理,好處是Spring
        事務管理的相關API可以不用介入程序之中,從對象的角度來看,它並不知道自己正被納入事務
        管理之中,在不需要事務管理的時候,只要在設置文件上修改一下設置,即可移去事務管理服務。
       


Spring事務的優點:
    1.爲不同的事務API提供一致的編程模型,如JTA、JDBC、Hibernate、iBATIS數據庫層JDO
    2.提供比大多數事務API更簡單的、易於使用的編程式事務管理API
    3.整合Spring數據訪問抽象
    4.支持Spring聲明式事務管理
   
   
   
   


    Spring和struts的整合
spring和struts的整合這裏我們提供了三種方案:
1.使用  Spring 與struts的ActionSupport 類進行整合.
  步驟 1.Action類直接繼承 ActionSupport
       2.使用使用ApplicationContext ctx = getWebApplicationContext();取得 Spring上下文
       3.取得相應Bean
  優點:簡單
  缺點:耦合度高,違反IOC容器的定義,無法使用多方法的action
 
2.將Spring的DelegatingRequestProcessor覆蓋Struts的RequestProcessor.
  步驟:1.Action中,使用 IOC 獲得服務,配置struts-config.xml
        2.在Spring的配置文件中註冊該動作.
        3.寫具有JavaBean屬性的Struts動.
   優點:耦合度較低,可以使用多方法的action.
   缺點:配置較爲繁瑣.
   
3.將Struts Action管理委託給Spring框架。
  步驟:1.Action中,使用 IOC 獲得服務,配置struts-config.xml
        2.在Spring的配置文件中註冊該動作.
       
  優點:1.耦合度低.
        2.不需要使用Spring api編寫
        3.利用了IOC裝配
       
       


    Spring和持久層的整合
Spring和持久層的整合方式的區別在於數據源的配置:
1.配置數據源:方式一:Spring 內置實現 DriverManagerDataSource 
              方式二:DBCP 提供的BasicDataSource
              方式三:JNDI 數據源(mysql5,tomcat6 爲例) 
                      1.在 Tomcat根目錄下的 conf\server.xml 配置 Resource
                      2.在 Spring的配置文件中配置:
                     
2.配置sessionFactory
3.如果不需要事務,直接就可以配置Dao且調用了.
    Spring和事務的配置:如果需要事務必須進入以下步驟(指的是聲明式事務)
1.配置Dao
2.裝配事務管理器
3.配置抽象事務代理
4.裝配Service 層
5.裝配具體事務代理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章