Spring學習(一)---基礎入門

什麼是Spring

  • Spring是一個輕量級的控制反轉IoC/DI依賴注入和麪向切面AOP的開源容器框架,是一個開源的Java/Java
    EE全功能棧full-stack的應用程序框架,以Apache許可證形式發佈
  • 它由Rod Johnson創建。它是爲了解決企業應用開發的複雜性而創建的, 2002年Rod Johnson在他的Expert
    One-On-One Java EE Design and
    Development一書中首次發佈了這個框架,並奠定了作者的大師地位。該框架也可以移植到.NET的環境下。
  • Spring框架本身並沒有強制實行任何特別的編程模式。在Java社區裏,Spring作爲EJB模型之外的另外一個選擇甚至是替代品而廣爲流行。從設計上看,Spring給予了Java程序員許多的自由度,但同時對業界常見的問題也提供了良好的文檔和易於使用的方法。
  • Spring框架的核心功能在任何Java應用中都是適用的。在基於Java企業平臺上的web應用中,大量的拓展和改進得以形成。爲此,Spring獲得了廣泛的歡迎,並被許多公司認可爲具有戰略意義的重要框架。

Spring框架4大原則:

  • 使用POJO進行輕量級和最小侵入式開發
    POJO(Plain Ordinary Java
    Object)簡單的Java對象,實際就是普通JavaBeans,是爲了避免和EJB混淆所創造的簡稱。
  • 通過控制反轉IoC、依賴注入DI和基於接口編程實現松耦合
  • 通過AOP和默認慣例進行聲明式編程
  • 使用AOP和模板編程減少模式化代碼

Spring框架的主要功能

  • 基於Java Beans的配置管理,採用IOC的原理,特別是對依賴注射技術的使用。這些都用來減少各組件間對實施細則的相互依賴性。

  • 一個核心的,全局適用的bean工廠

  • 一個一般抽象化的層面來管理數據庫間的數據處理

  • 建立在框架內的,對Java數據處理API和單獨的JDBC數據源的一般性策略。因此,在數據處理支持上對Java企業版本環境的依賴性得以消除

  • 和一些整合持久化的框架,如Hibernate,JDO,iBATIS和db4o,的整合

  • web應用中的MVC框架,基於核心的Spring功能,支持多種產生視圖的技術,包括JSP,FreeMarker,Velocity,Tiles,iText,和POI

  • 大量的AOP框架以提供諸如數據處理管理的服務。同IOC的功能一樣,目的是提高系統的模塊化程度

BeanFactory和ApplicationContext 之間的關係

  • BeanFacotry是spring中比較原始的Factory,提供了IoC/DI容器使用的最基本的方法。ApplicationContext接口由BeanFactory接口派生而來,在提供BeanFactory所有的功能基礎上提供了企業級應用開發的支持,例如讀取資源文件、發佈事件等。
  • BeanFactory針對單例的受管bean採用的是延遲加載,ApplicationContext採用的是立即加載【所有的prototype受管bean都是延遲】。所以BeanFactory一般用於內存敏感的受限環境開發中,ApplicationContext一般使用

基本框架結構

  • Spring是一種JavaEE開發中的一站式解決方案,所以其中包含的內容比較多,爲了避免在應用中添加無用功能,所以Spring採用了非強制性的模塊化結構,在具體應用中,可以根據應用所需要的功能進行選擇添加。

    Spring3.x分爲6大模塊,Spring的模塊化是很強的,各個功能模塊都是獨立的,可以選擇的使用

    這裏寫圖片描述

  • Core模塊是Spring應用的基礎,提供了最基本的IoC/DI容器的支持和實現
  • AOP模塊建立在Core模塊的基礎上,提供了AOP技術的支持,以簡化AOP編程的複雜度
  • DAO和ORM模塊建立在AOP的基礎上,DAO提供了dao模式編程的簡化支持,ORM提供了整合持久層框架的支持。同時在AOP的基礎上給數據庫訪問提供了聲明式事務的支持。
  • JEE模塊建立在Core模塊的基礎上,提供了針對EJB\郵件javaMail等企業級應用支持

Spring4.x分爲6大模塊,包括20多個子項目

這裏寫圖片描述

  • Core container核心容器:beans core context context-support expression
  • AOP和apects提供AOP編程技術支持: aop aspects,另外還有其它的不是Spring的jar
  • Data Access/Integration針對DAO編程和ORM整合的支持: jdbc orm tx
  • Web提供了整合表現層框架和對應的web解決方案SpringMVC:web webmvc
  • Instrumentation底層基礎,是一種沒有圖形界面的,具有啓動能力的,用於監控其他類的工具類
  • Test提供了單元測試的支持,要求junit4.8+版本

Spring的全方位應用程序框架

這裏寫圖片描述

  • ssm=SpringMVC+Spring+MyBatis [一般開發中常用,尤其是互聯網應用開發類型的公司,一般中小型快速開發中應用]
  • ssh[2]=Struts2+Spring+Hibernate [使用較少,一般在大型軟件公司中長期使用]

受管bean

  • Spring中那些組成應用的主體以及由Spring
    IoC容器所管理的對象被稱之爲bean。Bean就是由Spring容器初始化、裝配以及被管理的對象
  • bean是Spring管理的基本單位,在Spring的應用中,所有的組件都是bean,bean包括數據源、
    Hibernate的SessionFactory及事務管理器等。 Spring裏的bean是非常廣義的概念,任何的Java對象,
    Java組件都可被當成bean處理。甚至這些組件並不是標準的JavaBean

bean中行爲的scope配置

  • singleton單例,是默認屬性:Spring將Bean放入Spring
    IoC容器的緩存池中,並將Bean引用返回給調用者,spring
    IoC容器負責對這些Bean進行後續的生命管理。BeanFactory只管理一個共享的實例。所有對這個特定bean的實例請求,都導致返回這個唯一bean實例的引用。即每次拿到的對象都是引用的同一個地址的對象。當一個bean被標識爲singleton時候,spring的IoC容器中只會存在一個該bean。
  • prototype原型:不管是BeanFactory或者ApplicationContext都是延遲加載使用的。每次對這個bean的實例請求都會導致一個新的實例的創建。當用戶需要不受其他用戶對象影響的對象或有類似的需求時,這是一個較理想的解決辦法。即每次拿到的對象都是引用的不同地址的對象。相當於一個new的操作。清除prototype作用域的對象並釋放任何prototype bean所持有的昂貴資源,都是客戶端代碼的職責
  • 以下3種scope都使用的較少,有request\session\global session,類似於JavaEE裏面的request和session。在使用SpringMVC是可能會用到
  • request表示針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP request內有效,session表示一個用戶【客戶】對應一個新的bean,global session作用域類似於標準的HTTPSsession作用域,不過僅僅在基於portlet的web應用中才有意義
  • 注意:對於struts2中的Action來說需要指明scope=prototype,因爲struts2的Action要求是多實例、單線程的.
  • 正轉:當需要使用某個對象時,由調用方負責創建和管理這個對象。
  • 控制反轉:當需要使用某個對象時,調用方並不負責創建和管理這個對象的聲明週期,而是由容器負責創建和管理。控制權限的反轉。

控制反轉和依賴注入的概念

  • IoC實現由容器控制程序之間的關係,而非傳統實現中,由程序代碼直接操控,控制權由應用代碼中轉到了外部容器,控制權的轉移,是所謂控制反轉
  • 可供選擇的IoC 容器: Apache Avalon、PicoContainer 和 HiveMind。Avalon
    從沒怎麼流行,儘管它很強大而且有很長的歷史。Avalon相當的重和複雜,並且看起來比新的IoC解決方案更具侵入性。PicoContainer是一個輕量級而且更強調通過構造函數表達依賴性而不是JavaBean
    屬性。 與Spring不同,它的設計允許每個類型一個對象的定義(可能是因爲它拒絕任何Java代碼外的元數據導致的侷限性)
  • Martin Fowler給IoC起更爲直觀的名字:Dependency
    Injection依賴注射DI。創建被調用者實例的工作通常由Spring容器來完成,然後注入調用者,因此也稱爲依賴注入
    <bean id=”bb” class=”com.yan.Person” p:birth-ref=”now”/>
  • 針對Person屬性birth由容器負責調用Person對象的setBirth將now對象設置進去

兩者區別詳見:
http://blog.csdn.net/uponz/article/details/79169843

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章