




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、SUNWAH Spring 基礎與實踐基礎與實踐 www. Spring基礎與實踐基礎與實踐 目的目的 v介紹Spring兩大核心技術-依賴注入(DI) 和面向 切面編程(AOP)。 v介紹Spring 是如何利用這兩種技術來開發(fā)松散耦 合的Java 應用程序。 Spring基礎與實踐基礎與實踐 目錄目錄 Spring介紹介紹1 依賴注入依賴注入(DI)2 面向切面編程面向切面編程(AOP)3 實踐實踐4 Spring基礎與實踐基礎與實踐 1、Spring介紹介紹 Spring介紹介紹 Spring基礎與實踐基礎與實踐 1.1 Spring是什么是什么 v Spring是一個基于JAVA語言、
2、開源、輕量級的DI和AOP容 器框架。 v EJB的聲明式編程模型確實簡化了很多基礎設施層面的開發(fā), 如事務和安全,但在部署文件維護和各種接口(home、 remote/local接口)實現(xiàn)等方面變得很復雜。很多新技術 包括AOP和DI為JavaBeans提供了很多EJB才擁有的強大 功能。這些技術使用EJB那樣的聲明式編碼模型來提供簡單 潔凈Java對象(POJO)。負責輕量級POJO開發(fā)就是 Spring框架。 v Spring 框架是以簡化J2EE 應用程序開發(fā)為特定目標而創(chuàng) 建的。使用Spring,你可以用簡單的JavaBeans來實現(xiàn)那 些以前只有EJB才能實現(xiàn)的功能。 Spring
3、基礎與實踐基礎與實踐 vSpring 具有很多功能,可以將它們歸納為幾個基 本部件。Spring是一個輕量級的DI和AOP容器框 架。 輕量級輕量級從大小和應用開支上說Spring都算是輕量級的。 整個Spring框架可以打成一個2.5MB多一點的JAR包, 并且Spring的處理開支也非常小。更重要的是,Spring 是非侵入式的:基于Spring開發(fā)的應用中的對象一般不 依賴于Spring的類。 依賴注入依賴注入Spring提供了一種松耦合的技術,稱為依賴 注入(DI)。使用DI,對象是被動接受依賴類而不是自己 主動去找。對象不是從容器中查找它的依賴類,而是容 器在實例化對象的時候主動將它
4、的依賴類注入給它。 Spring基礎與實踐基礎與實踐 面向切面面向切面Spring對面向切面編程提供了強大支持,通過將業(yè)務邏 輯從應用服務(如監(jiān)控和事務管理)中分離出來,實現(xiàn)了內(nèi)聚開發(fā)。 應用對象只做它們該做的業(yè)務邏輯,它們不負責(或關心)其 它系統(tǒng)問題(如日志和事務支持)。 容器容器Spring是一個容器,因為它包含并且管理應用對象的生命周 期和配置。你可以通過配置來設定你的Bean是單一實例,還是每 次請求產(chǎn)生一個實例,并且設定它們之間的關聯(lián)關系。Spring有別 于傳統(tǒng)的重量級EJB容器,這些容器通常很大,很笨重。 框架框架Spring實現(xiàn)了使用簡單的組件配置組合成一個復雜的應用。 在S
5、pring中,應用中的對象是通過XML文件配置組合起來的。并且 Spring提供了很多基礎功能(事務管理、持久層集成等),這使開 發(fā)人員能夠?qū)W⒂陂_發(fā)應用邏輯。 Spring基礎與實踐基礎與實踐 1.1.1 Spring模塊模塊 Spring基礎與實踐基礎與實踐 v核心容器核心容器 Spring的最底層是核心容器。Spring核心容器為Spring 框架提供了基礎功能。在這個模塊中你會找到 BeanFactory這個類,它是最基本的Spring容器和 Spring的DI所依賴的基礎。 vApplication Context(上下文)模塊(上下文)模塊 Spring的應用上下文建立在核心容器之
6、上。如果說核心 模塊中的BeanFactory使Spring成為容器的話,那么, 上下文模塊就是使 Spring成為框架的原因。這個模塊擴 展BeanFactory,添加了對I18N(國際化)、應用生命 周期事件以及驗證的支持。 Spring基礎與實踐基礎與實踐 v Spring的的AOP模塊模塊 在AOP模塊中,Spring對面向切面編程提供了豐富的支持。這個模 塊是為Spring應用開發(fā)切面的基礎。與DI一樣,AOP支持應用對象 之間的松耦合。利用AOP,應用程序所關心的與其應用的對象關 系不大。 v JDBC抽象及抽象及DAO模塊模塊 編寫JDBC代碼時總是要寫一些樣板式的代碼,如:獲得
7、連接、創(chuàng) 建語句、處理結果、最后關閉連接。Spring的JDBC和DAO模塊把 這些樣板式的代碼抽象出來,讓你的數(shù)據(jù)庫代碼變得簡單明了,也 可以避免因為釋放數(shù)據(jù)庫資源失敗而引起的問題。這個模塊還建立 了一個容易理解的數(shù)據(jù)庫異常層,它建立在各種數(shù)據(jù)庫錯誤信息之 上。以后就不用再去解釋那些隱晦專有的SQL錯誤信息了。 另外,這個模塊利用Spring的AOP模塊為Spring應用中的對象提供 事務管理服務。 Spring基礎與實踐基礎與實踐 vORM映射集成模塊映射集成模塊 vJMX(Java管理擴展管理擴展) vJava EE連接器連接器API(JCA) vSpring MVC框架框架 vSpri
8、ng Portlet MVC vSpring的的Web模塊模塊 v遠程調(diào)用遠程調(diào)用 vJava消息服務(消息服務(JMS) Spring基礎與實踐基礎與實踐 1.2 開始開始Spring之旅之旅 v Spring版版Hello World示例的第一個類是一個服務類,它的作用是示例的第一個類是一個服務類,它的作用是 打印出那句熟悉的問候。打印出那句熟悉的問候。 v 定義定義Greeting Service接口接口 package com.sunwah.training.spring.hello; /* *Greeting Service接口,它定義了我們的服務類需要提供的服務 */ public
9、 interface GreetingService /* * 打印問候語 */ public void sayGreeting(); Spring基礎與實踐基礎與實踐 Hello World 程序代碼程序代碼 vGreeting ServiceImpl負責打印問候語。 package com.sunwah.training.spring.hello; /* * Greeting ServiceImpl負責打印問候語 */ public class GreetingServiceImpl implements GreetingService / 問候語 private String greet
10、ing; public GreetingServiceImpl() Spring基礎與實踐基礎與實踐 public GreetingServiceImpl(String greeting) this.greeting = greeting; /打印問候語 public void sayGreeting() System.out.println(greeting); public void setGreeting(String greeting) this.greeting = greeting; Spring基礎與實踐基礎與實踐 XML配置文件配置文件 Spring基礎與實踐基礎與實踐 是這個
11、簡單XML文件的根元素,它也是任何 Spring配置文件的根元素。 元素用來在 Spring容器中定義一個類以及它的 配置信息。這里,屬性id表示greetingService Bean的 名字,class屬性表示Bean的全路徑類名。 在元素中,元素表示設置屬性值 。 使用元素,我們告訴Spring容器通過調(diào)用 Bean的setGreeting()方法來設置其屬性值,在實例化此 bean時傳遞“Hello World”。 使用元素 ,我們告訴Spring容器通過 調(diào)用Bean的構造函數(shù)來設置其屬性值,在實例化此 bean時傳遞“Hello World”。 Spring基礎與實踐基礎與實踐 執(zhí)
12、行執(zhí)行Hello World 程序程序 package com.sunwah.training.spring.hello; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactor y; import org.springframework.core.io.ClassPathResource; public class HelloMain public static void main(String args) throws E
13、xception BeanFactory factory = new XmlBeanFactory(new ClassPathResource( spring-hello.xml); Spring基礎與實踐基礎與實踐 / 屬性注入 GreetingService greetingService = (GreetingService) factory .getBean(greetingService); greetingService.sayGreeting(); / 構造注入 GreetingService greetingService2 = (GreetingService) factor
14、y .getBean(greetingService); greetingService2.sayGreeting(); Spring基礎與實踐基礎與實踐 這段代碼的用處就是載入Spring容器并且利用它得到問 候服務。 這里用到的BeanFactory就是Spring容器。將spring- hello.xml文件載入容器后,main()方法調(diào)用 BeanFactory的 getBean()方法來得到問候服務的引用。 使用這個引用,它最后調(diào)用了sayGreeting()方法。當我 們運行HelloMain程序時,它在屏幕 上打出“Hello World!”。 Spring基礎與實踐基礎與實踐
15、2、依賴注入、依賴注入(DI) 依賴注入依賴注入(DI) Spring基礎與實踐基礎與實踐 v在Spring中,組件無需自己負責與其他組件的關聯(lián)。 取而代之的是,容器負責把協(xié)作組件的引用給予各 個組件。 v創(chuàng)建系統(tǒng)組件之間協(xié)作關系的這個動作是DI的關鍵, 通常被稱之為裝配。 Spring基礎與實踐基礎與實踐 2.1 容納你的容納你的Bean 在基于Spring的應用中,應用組件在Spring范圍內(nèi)是 激活的。容器可以創(chuàng)建組件,裝配和配置組件,以及 管理他們的整個生命周期(從new到finalize()。 首先,要知道容器是組件存活的地方。容器是Spring 框架的核心。Spring容器使用DI
16、管理所有注冊應用系 統(tǒng)的組件。包括在協(xié)作組件之間建立關聯(lián)。 Spring提供了多種容器實現(xiàn),并分為兩類。Bean工廠 (由org.springframework.beans.factory.BeanFactory 接口定義)是最簡單的容器,提供了基礎的依賴注入 支持。應用上下文(由 org.springframework.context.ApplicationContext接口 定義)建立在Bean工廠基礎之上,提供了系統(tǒng)架構服 務。 Spring基礎與實踐基礎與實踐 2.1.1使用使用Bean工廠工廠 Bean工廠采用了工廠設計模式,這個類負責創(chuàng)建、分發(fā)各種類型的 Bean及創(chuàng)建協(xié)作對象間的
17、關聯(lián)關系。Bean工廠還要參與到Bean的生 命周期中,調(diào)用用戶定義的初始化和銷毀方法。 org.springframework.beans.factory.xml.XmlBeanFactory是最常使用 的BeanFactory的實現(xiàn),它根據(jù)XML文件中的定義裝載Bean。 例: BeanFactory factory = new XmlBeanFactory(new (c:/beans.xml); 這段代碼的意思是告訴Bean工廠從XML文件中讀取Bean的定義信息。 但是Bean只有在被需要的時候才被實例化。 為了從BeanFactory中得到一個Bean,只要簡單調(diào)用getBean()
18、方法。 例: MyBean myBean = (MyBean) factory.getBean(myBean); 當getBean()方法被調(diào)用的時候,工廠就會實例化Bean并且使用依賴 注入設置Bean的屬性。這樣就在Spring容器中開始了Bean的生命。 Spring基礎與實踐基礎與實踐 2.1.2使用應用上下文使用應用上下文 v ApplicationContext比BeanFactory提供了更多功能: 應用上下文提供了文本信息解析工具,包括對國際化(I18N)的 支持。 應用上下文提供載入文件資源的通用方法。 應用上下文可以向注冊為監(jiān)聽器的Bean發(fā)送事件。 v Applicati
19、onContext有三個經(jīng)常用到的實現(xiàn): ClassPathXmlApplicationContext從類路徑中的XML文件載 入上下文定義信息,把上下文定義文件當成類路徑資源。 從文件系統(tǒng)中的XML文件載入上下文定義信息。 XmlWebApplicationContext從Web系統(tǒng)中的XML文件載入 上下文定義信息。 Spring基礎與實踐基礎與實踐 vApplicationContext與BeanFactory另一個重要 區(qū)別是關于單例的Bean是如何被載入的: BeanFactory延遲載入所有的Bean,直到getBean() 方法被調(diào)用時Bean才被創(chuàng)建。 應用上下文會在上下文啟動
20、后預載入所有的單實例 Bean。 Spring基礎與實踐基礎與實踐 2.1.3 Bean的生命的生命 Spring基礎與實踐基礎與實踐 步驟 說明 1. 實例化 Spring實例化Bean 2. 設置屬性 Spring注入Bean的屬性 3. 設置Bean名稱 如果Bean實現(xiàn)了BeanNameAware接口, Spring傳遞Bean工廠給 setBeanFactory() 4. 預處理(在初始 化之前) 如果有多個BeanPostProcessors, Spring將調(diào)用 postProcessBeforeInitialization()方法 Bean生命周期中的步驟明細 Spring基礎
21、與實踐基礎與實踐 5. 初始化Bean 如果Bean實現(xiàn)了InitializingBean,其 afterPropertiesSet()方法將被調(diào)用。如 果Bean聲明了自定義的初始化方法,那么 將調(diào)用制定的初始化方法 6. 預處理(在初始 化之后) 如果有多個BeanPostProcessors, Spring將調(diào)用 postProcessAfterInitialization()方法 7. Bean已經(jīng)準備 好 此時Bean已經(jīng)準備好,可以使用,并且將 一直保留在Bean工廠中,直到不再需要它 8. 銷毀Bean如果Bean實現(xiàn)了DisposableBean,將調(diào) 用destory()方法
22、。如果Bean有自定義的 銷毀方法,將調(diào)用指定的方法。 Spring基礎與實踐基礎與實踐 Spring基礎與實踐基礎與實踐 vBean在Spring應用上下文的生命周期與在Bean 工廠中的生命周期只有一點不同: 如果Bean實現(xiàn)了ApplicationContextAware接口, setApplicationContext()方法會被調(diào)用。 Spring基礎與實踐基礎與實踐 2.2 創(chuàng)建創(chuàng)建Bean v 定義“表演者”接口: package com.sunwah.training.spring.di; /* * 表演者接口 * */ public interface Performer /
23、* * 表演 * throws PerformanceException */ public void perform() throws PerformanceException; Spring基礎與實踐基礎與實踐 2.2.1 聲明一個簡單的聲明一個簡單的Bean v定義“魔術師”類: package com.sunwah.training.spring.di; /* *魔術師類 */ public class Juggler implements Performer /小布袋 private int beanBags = 3; public Juggler() public Juggler(
24、int beanBags) this.beanBags = beanBags; public void perform() throws PerformanceException System.out.println(JUGGLING + beanBags + BEANBAGS); public void setBeanBags(int beanBags) this.beanBags = beanBags; Spring基礎與實踐基礎與實踐 在Spring配置文件中聲明Bean: 元素是Spring中最基本的配置單元,它通知 Spring創(chuàng)建一個對象。Id屬性定義了該Bean的名稱, clas
25、s屬性指明了它是個Juggler。 當Spring容器裝載該Bean時,它將采用默認的構造函 數(shù)來實例化juggler Bean。實際上是采用下面的java代 碼來創(chuàng)建: new com.sunwah.training.spring.di.Juggler(); Spring基礎與實踐基礎與實踐 使用以下代碼來裝載Spring應用上下文: ApplicationContext ctx = new ClassPathXmlApplicationContext( spring-di.xml); / 默認屬性值 Performer juggler = (Performer) ctx.getBean(j
26、uggler); juggler.perform(); Spring基礎與實踐基礎與實踐 2.2.2通過構造函數(shù)注入通過構造函數(shù)注入 v注入基本類型的值: v注入其他對象 Spring基礎與實踐基礎與實踐 定義“詩歌”接口: package com.sunwah.training.spring.di; /* * * 詩歌接口 * */ public interface Poem /* * 朗誦 */ public void recite(); Spring基礎與實踐基礎與實踐 定義“作十四行詩”類: package com.sunwah.training.spring.di; /* *十四行詩
27、類 */ public class Sonnet29 implements Poem private static String LINES = When, in disgrace with fortune and mens eyes, I all alone beweep my outcast state, And trouble deaf heaven with my bootless cries, And look upon myself and curse my fate, Wishing me like to one more rich in hope, Featured like
28、him, like him with friends possessd, Desiring this mans art and that mans scope, With what I most enjoy contented least;, Yet in these thoughts myself almost despising, Haply I think on thee, and then my state, Like to the lark at break of day arising, From sullen earth, sings hymns at heavens gate;
29、, For thy sweet love rememberd such wealth brings, That then I scorn to change my state with kings. ; Spring基礎與實踐基礎與實踐 public Sonnet29() /* * 朗誦 */ public void recite() for (int i = 0; i LINES.length; i+) System.out.println(LINESi); Spring基礎與實踐基礎與實踐 定義“會誦詩的魔術師”類: package com.sunwah.training.spring.d
30、i; /* *會誦詩的魔術師 */ public class PoeticJuggler extends Juggler / 詩歌 private Poem poem; public PoeticJuggler() super(); public PoeticJuggler(Poem poem) super(); this.poem = poem; Spring基礎與實踐基礎與實踐 public PoeticJuggler(int beanBags, Poem poem) super(beanBags); this.poem = poem; public void perform() thro
31、ws PerformanceException super.perform(); System.out.println(While reciting.); poem.recite(); public void setPoem(Poem poem) this.poem = poem; Spring基礎與實踐基礎與實踐 Sonnet29在Spring配置文件中的定義: PoeticJuggler在Spring配置文件中的定義: Spring基礎與實踐基礎與實踐 2.2.3 通過通過setter方法注入方法注入 v通常Bean提供一對函數(shù)用來訪問屬性:setXXX() 和getXXX()。Sprin
32、g可以通過setter注入,利用 setter方法來配置屬性值。 vSpring用setter方法把元素里面設 置的值注入到對象中。屬性name對應對象的屬性 名稱,屬性value就是要注入的值。 v注入簡單的數(shù)值 Spring基礎與實踐基礎與實踐 v注入其他的Bean Spring基礎與實踐基礎與實踐 2.2.4 選擇構造函數(shù)注入還是選擇構造函數(shù)注入還是Set注入注入 ? v 使用構造函數(shù)注入的優(yōu)點: 構造函數(shù)注入強制使用強依賴契約。如果沒有提供所有需要的 依賴,一個Bean就無法被實例化。 由于Bean的依賴都通過它的構造函數(shù)設置,所以沒有必要再寫 多月的Set方法。這有助于減少代碼。 因
33、為只能通過構造函數(shù)設置類的屬性,這樣做能有效地保證了 屬性的不可變性。 v 使用構造函數(shù)注入的缺點: 如果Bean有很多依賴,那么構造函數(shù)的參數(shù)列表會很長。 如果一個對象已經(jīng)有很多種構造方式,那么很難再提出不同的 構造函數(shù),因為構造函數(shù)只能通過參數(shù)的個數(shù)和類型來區(qū)分。 如果構造函數(shù)的參數(shù)中有兩個以上是相同類型的,那么很難確 定每個參數(shù)的用途。 構造函數(shù)注入不利于自身的繼承。Bean的構造函數(shù)為了給父 類的私有變量賦值,需要把參數(shù)傳遞給super()方法。 Spring基礎與實踐基礎與實踐 2.3 裝配集合裝配集合 Spring提供了4個類型的集合配置元素: 集合元素 用途 裝配一列值,允許重復
34、 裝配值集,不允許重復 裝配名稱-值對的集合,名稱和值可 以是任意類型 裝配名稱-值對的集合,名稱和值都 必須是String類型 Spring基礎與實踐基礎與實踐 v和對應的屬性類型是array或者是 java.util.Collection。 v和對應是java.util.Map和 java.util.Properties。 Spring基礎與實踐基礎與實踐 v 使用配置元素: Spring基礎與實踐基礎與實踐 v 使用配置元素: Spring基礎與實踐基礎與實踐 v 使用配置元素: Spring基礎與實踐基礎與實踐 v 使用配置元素: STRUM STRUM STRUM CRASH CRA
35、SH CRASH HUM HUM HUM Spring基礎與實踐基礎與實踐 2.4自動裝配自動裝配 v 默認情況下,Bean不會自動裝配。 v 有兩個辦法可以讓Spring自動裝配: 設置需要自動裝配的中的autowire屬性。 通過在Spring配置文件的根元素設置default-autowire 屬性。 v Spring提供了四種自動裝配類型: byName試圖在容器中尋找和需要自動裝配的屬性名相同的 Bean(或ID)。如果沒有找到相符的Bean,這個屬性就沒有被裝 配上。 byType試圖在容器中尋找一個與需要自動配置的屬性類型相 同的Bean。如果沒有找到相符的Bean,這個屬性就沒
36、有被裝 配上。如果找到超過一個相符的Bean,就會拋出異常。 constructor試圖在容器中查找與需要自動裝配的Bean的構造 函數(shù)參數(shù)一致的一個或多個Bean。如果存在不確定Bean或構 造函數(shù),容器會拋出異常。 autodetect首先嘗試使用constructor來自動裝配,然后使用 byType方式。 Spring基礎與實踐基礎與實踐 v可以混合使用自動和手動裝配。 v使用自動裝配雖然有利于減少編寫裝配文件,但 是自動隱藏了很多細節(jié),缺乏透明,因此一般建 議采用手動裝配。 Spring基礎與實踐基礎與實踐 2.5控制控制Bean創(chuàng)建創(chuàng)建 v默認情況下,所有Spring Bean都是
37、單一的。 v為了使得每次都能產(chǎn)生一個新的Bean實例,可以 聲明Bean的scope屬性為prototype。 Spring基礎與實踐基礎與實踐 2.5.1 Bean范圍化范圍化 vBean的范圍化選項主要有兩種 : singleton單例,定義Bean的范圍為每個Spring容器 一個實例(默認值)。 prototype原型,允許Bean可以被多次實例化(每 次都創(chuàng)建一個新實例)。 例如: Spring基礎與實踐基礎與實踐 2.5.2 利用工廠方法來創(chuàng)建利用工廠方法來創(chuàng)建Bean v在Spring應用上下文中配置的Bean都可以通過調(diào) 用類的構造函數(shù)來創(chuàng)建,也可以通過靜態(tài)工廠方 法來創(chuàng)建。
38、v元素有一個factory-method屬性,允許 指定要調(diào)用的靜態(tài)方法,而不是使用構造函數(shù)內(nèi) 創(chuàng)建類的實例。 Spring基礎與實踐基礎與實踐 2.5.3初始化和銷毀初始化和銷毀Bean v 元素中的init-method屬性指定了在Bean初始化 是要調(diào)用的方法,destroy-method指定了將Bean從容器 中刪除時要調(diào)用的方法。 Spring基礎與實踐基礎與實踐 默認的初始化和銷毀方法默認的初始化和銷毀方法 v 元素中的default-init-method屬性設置了一個上下文定義 文件中所有Bean的初始化方法,default-destroy-method設置了上 下文定義文件中
39、所有Bean的銷毀方法。 Spring基礎與實踐基礎與實踐 2.6聲明父聲明父Bean和子和子Bean v創(chuàng)建一個類來擴展另一個類是面向?qū)ο蟮幕A之 一。在Java的類結構里,為了把通用的功能和屬 性集中起來,可以把它們定義在父類里,讓子類 來繼承。 v出于同樣的目的,我們從定義里擴展和 繼承新的。這樣做還會有效地減少 Spring上下文定義文件里冗余的XML。 Spring基礎與實踐基礎與實踐 v為了實現(xiàn)Bean的繼承,元素提供了兩個 特殊屬性: parent: 指明Bean的id。它對于的作用相當于 關鍵字extends對于Java類的作用。 abstract: 如果設置為true,就表示
40、聲明是抽象 的,不能被Spring實例化。 Spring基礎與實踐基礎與實踐 2.6.1抽象基抽象基Bean類型類型 定義兩個相同類型的Bean Spring基礎與實踐基礎與實踐 上面兩個Bean的定義可以采用繼承來實現(xiàn): Spring基礎與實踐基礎與實踐 v在父Bean定義中,abstract屬性設置為true,這 就告訴Spring不要實例化這個Bean。父Bean不 必一定是抽象的,從一個具體Bean也可以創(chuàng)建子 Bean。 v在子Bean定義中,parent屬性表明kenny和 david都繼承自baseSaxophonist。 v在子Bean定義中沒有class屬性,這是因為 ken
41、ny和david不僅會繼承父Bean的屬性,也會 繼承它的類型。子Bean可以覆蓋繼承的屬性。 Spring基礎與實踐基礎與實踐 2.6.2抽象共同屬性抽象共同屬性 以下兩個Bean有相同的屬性song,而且注入的屬性值也一樣。 Spring基礎與實踐基礎與實踐 抽象公共屬性: Spring基礎與實踐基礎與實踐 v注意父bean basePerformer沒有class屬性。這 沒有問題,因為子Bean會利用自己的class屬性 來確定自己的類型。 Spring基礎與實踐基礎與實踐 2.7小結小結 vSpring框架的核心是Spring容器。Spring提供了 多種實現(xiàn)容器的方法,這些方法可以
42、歸納為兩類: BeanFactory是最簡單的容器,它提供了基本的 DI和Bean裝配服務。如果需要用到更高級的框架 服務,就需要使用Spring的ApplicationContext。 v在本課中,我們介紹了如何將Bean與Spring容器 裝配在一起。通常,在Spring容器中使用XML來 執(zhí)行裝配。這個XML文件包括了幫助容器執(zhí)行DI 的信息,以便Bean能夠與其所依賴的其他Bean 相關聯(lián)。 Spring基礎與實踐基礎與實踐 3、面向切面編程、面向切面編程(AOP) 面向切面編程面向切面編程(AOP) Spring基礎與實踐基礎與實踐 v在軟件開發(fā)中,散布于程序中多個地點的函數(shù)被 稱為
43、“交叉事務”。從概念上來說,它們一般是 與程序業(yè)務邏輯分開的(但經(jīng)常是直接嵌入其中 的)。 v把這些交叉事務與業(yè)務邏輯分離開正是面向切面 編程(AOP)的作用所在。 Spring基礎與實踐基礎與實踐 3.1 AOP簡介簡介 Spring基礎與實踐基礎與實踐 3.1.1定義定義AOP術語術語 v通知通知(Advice) 切面的功能被稱為“通知”。通知定義了切面是 什么以及何時使用。 v連接點(連接點(Joinpoint) 連接點是在程序執(zhí)行過程中能夠插入切面的一個 點。這個點可以是方法被調(diào)用時、異常被拋出時、 甚至字段被編輯時。切面代碼可以通過這些點插 入到程序的一般流程之中,從而添加新的行為。
44、 Spring基礎與實踐基礎與實踐 v切入點切入點(Pointcut) 一個切面不是一定要通知程序里全部的連接點。 切入點可以縮小切面通知的連接點的范圍。如果 說通知定義了切面的“什么”和“何時”,那么 切入點就定義了“何地”。切入點的定義匹配通 知要接入點一個或多個連接點。 v切面(切面(Aspect) 切面是通知和切入點的結合。通知和切入點共同 定義了關于切面的全部內(nèi)容它的功能、在何時 和何地完成其功能。 Spring基礎與實踐基礎與實踐 v引入(引入(Introduction) “引入”允許我們向現(xiàn)有的類添加新方法和屬性。 v目標(目標(Target) “目標”是被通知的對象。 v代理(
45、代理(Proxy) “代理”是向目標對象應用通知之后被創(chuàng)建的對 象。 v織入織入(Weaving) “織入”是把切面應用到目標對象來創(chuàng)建新的代理 對象的過程。切面在指定連接點織入到目標對象。 Spring基礎與實踐基礎與實踐 織入的時機: 編譯時:切面在目標類編譯時被織入。 類加載時:切面在目標類加載到JVM時被織入。 運行時:切面在程序運行時的某個時刻被織入。 Spring基礎與實踐基礎與實踐 3.1.2 Spring對對AOP的支持的支持 v創(chuàng)建切點來定義切面織入的連接點是AOP框架的 基本功能。 vSpring對AOP的支持具有以下4種情況 : 經(jīng)典的基于代理的AOP AspectJ注解
46、驅(qū)動的切面 純POJO切面 注入式AspectJ切面 前三種都是基于代理的AOP的變體,因此, Spring對于AOP的支持局限于方法注入。 Spring基礎與實踐基礎與實踐 Spring的的AOP框架的幾個關鍵點:框架的幾個關鍵點: v Spring通知是用JAVA編寫的。 Spring創(chuàng)建的全部通知都是用標準JAVA類編寫的。定義 通知所應用的切點通常是以XML方式寫在Spring配置文件 里。 v Spring在運行時通知對象。 Spring利用代理類包裹切面,從而把它們織入到Spring 管理的Bean里。代理類裝作目標Bean,截取被通知的方 法調(diào)用,再把這些調(diào)用轉(zhuǎn)發(fā)到真正的目標Be
47、an。在代理截 取方法調(diào)用之后,實際調(diào)用目標Bean的方法之前,代理會 執(zhí)行切面邏輯。 v Spring只支持方法連接點。 由于Spring是基于動態(tài)代理的,它只支持方法連接點。 Spring基礎與實踐基礎與實踐 3.2創(chuàng)建經(jīng)典的創(chuàng)建經(jīng)典的Spring切面切面 定義一個觀眾類: package com.sunwah.training.spring.aop; import org.aspectj.lang.ProceedingJoinPoint; /* * 觀眾 * */ public class Audience public Audience() public void watchPerfo
48、rmance(ProceedingJoinPoint jp) System.out.println(The audience is taking their seats.); System.out.println(The audience is turning off their cellphones); try ceed(); System.out.println(CLAP CLAP CLAP CLAP CLAP); catch (Throwable throwable) System.out.println(Boo! We want our money back!); Spri
49、ng基礎與實踐基礎與實踐 / 落座 public void takeSeats() System.out.println(The audience is taking their seats.); / 關閉自己的手機 public void turnOffCellPhones() System.out.println(The audience is turning off their cellphones); / 鼓掌 public void applaud() System.out.println(CLAP CLAP CLAP CLAP CLAP); / 退票 public void dem
50、andRefund() System.out.println(Boo! We want our money back!); Spring基礎與實踐基礎與實踐 使用如下XML可以把它裝配為Spring的: Spring基礎與實踐基礎與實踐 3.2.1 創(chuàng)建通知創(chuàng)建通知 Spring的AOP里有5種類型的通知,分別由一個接口進行定義: 通知類型接口 Before (前) org.springframework.aop.Met hodBeforeAdvice After-returning (返回后) org.springframework.aop.Afte rReturningAdvice Aft
51、er-throwing (拋出后) org.springframework.aop.Thro wsAdvice Around (周圍) ercept.Meth odInterceptor Introduction (引 入) org.springframework.aop.Intr oductionInterceptor Spring基礎與實踐基礎與實踐 前通知、返回后通知和拋出后通知 定義觀眾功能如何被使用的通知: package com.sunwah.training.spring.aop; import java.lang.reflect.Metho
52、d; import org.springframework.aop.AfterReturningAdvice; import org.springframework.aop.MethodBeforeAdvice; import org.springframework.aop.ThrowsAdvice; /* * * 定義觀眾功能如何被使用的通知(實現(xiàn)了三種類型的通知) * */ public class AudienceAdvice implements MethodBeforeAdvice, AfterReturningAdvice, ThrowsAdvice public Audience
53、Advice() Spring基礎與實踐基礎與實踐 / 在方法之前調(diào)用 public void before(Method method, Object args, Object target) throws Throwable audience.takeSeats(); audience.turnOffCellPhones(); / 在成功返回之后調(diào)用 public void afterReturning(Object rtn, Method method, Object args, Object target) throws Throwable audience.applaud(); /
54、在拋出異常之后執(zhí)行 public void afterThrowing(Throwable throwable) audience.demandRefund(); Spring基礎與實踐基礎與實踐 / 在拋出異常之后執(zhí)行 public void afterThrowing(Method method, Object args, Object target, Throwable throwable) audience.demandRefund(); / injected private Audience audience; public void setAudience(Audience aud
55、ience) this.audience = audience; Spring基礎與實踐基礎與實踐 XML配置文件如下: Spring基礎與實踐基礎與實踐 周圍通知周圍通知 v周圍通知相當于前通知、返回后通知、拋出后通 知的結合。 v在Spring里,周圍通知是由AOP Alliance的 MethodInterceptor接口定義的。 v編寫周圍通知的好處: 能以簡潔的方式在一個方法里定義前通知和后通 知。 可以檢查和修改被通知方法的返回值。 Spring基礎與實踐基礎與實踐 以周圍通知方式定義觀眾通知: package com.sunwah.training.spring.aop; imp
56、ort ercept.MethodInterceptor; import ercept.MethodInvocation; import com.sunwah.training.spring.di.PerformanceException; /* * * 以周圍通知方式定義觀眾通知 * */ public class AudienceAroundAdvice implements MethodInterceptor Spring基礎與實踐基礎與實踐 public Object invoke(MethodInvocati
57、on invocation) throws Throwable try / 在方法調(diào)用前執(zhí)行 audience.takeSeats(); audience.turnOffCellPhones(); / 調(diào)用目標方法 Object returnValue = ceed(); / 在成功返回之后執(zhí)行 audience.applaud(); return returnValue; catch (PerformanceException throwable) / 出現(xiàn)異常之后執(zhí)行 audience.demandRefund(); throw throwable; Spring基礎與實踐基礎與實踐 / injected private Audience audience; public void setAudie
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度商業(yè)秘密合作轉(zhuǎn)讓合同協(xié)議
- 二零二五年度豬肉市場風險預警與應對合同
- 二零二五年度社區(qū)服務兼職志愿者服務協(xié)議
- 二零二五年度成人外語培訓機構報名服務協(xié)議
- 二零二五年度手貨車車輛轉(zhuǎn)讓與汽車金融服務及市場推廣合同
- 2025年度游學旅游線路研發(fā)與推廣協(xié)議
- 2025年度珠寶首飾返傭金代理合同
- 2025年度混凝土班組勞務合作施工進度合同
- 二零二五年度精裝修房屋買賣合同違約賠償標準
- 二零二五年度房產(chǎn)交易全程服務協(xié)議范本
- 2024年09月2024屆山東威海市商業(yè)銀行秋季校園招聘筆試歷年參考題庫附帶答案詳解
- 2025年北師大版數(shù)學六年級下冊教學計劃(含進度表)
- 2025年臨床醫(yī)師定期考核必考復習題庫及答案(620題)
- 八年級物理全冊全套試卷測試卷(含答案解析)
- 2024年黑龍江林業(yè)職業(yè)技術學院單招職業(yè)技能測試題庫完整答案
- 2025中國華電校園招聘高頻重點提升(共500題)附帶答案詳解
- 住宅建筑室內(nèi)裝飾裝修設計管理研究
- 教育部《中小學校園食品安全和膳食經(jīng)費管理工作指引》專題講座
- 龍門吊安裝及拆除安全專項施工方案
- 理療課件教學課件
- 2024解析:第十二章滑輪-講核心(解析版)
評論
0/150
提交評論