




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、SUNWAH Spring 基礎(chǔ)與實踐基礎(chǔ)與實踐 www. Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 目的目的 v介紹Spring兩大核心技術(shù)-依賴注入(DI) 和面向 切面編程(AOP)。 v介紹Spring 是如何利用這兩種技術(shù)來開發(fā)松散耦 合的Java 應(yīng)用程序。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 目錄目錄 Spring介紹介紹1 依賴注入依賴注入(DI)2 面向切面編程面向切面編程(AOP)3 實踐實踐4 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 1、Spring介紹介紹 Spring介紹介紹 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 1.1 Spring是什么是什么 v Spring是一個基于JAVA語言、
2、開源、輕量級的DI和AOP容 器框架。 v EJB的聲明式編程模型確實簡化了很多基礎(chǔ)設(shè)施層面的開發(fā), 如事務(wù)和安全,但在部署文件維護(hù)和各種接口(home、 remote/local接口)實現(xiàn)等方面變得很復(fù)雜。很多新技術(shù) 包括AOP和DI為JavaBeans提供了很多EJB才擁有的強(qiáng)大 功能。這些技術(shù)使用EJB那樣的聲明式編碼模型來提供簡單 潔凈Java對象(POJO)。負(fù)責(zé)輕量級POJO開發(fā)就是 Spring框架。 v Spring 框架是以簡化J2EE 應(yīng)用程序開發(fā)為特定目標(biāo)而創(chuàng) 建的。使用Spring,你可以用簡單的JavaBeans來實現(xiàn)那 些以前只有EJB才能實現(xiàn)的功能。 Spring
3、基礎(chǔ)與實踐基礎(chǔ)與實踐 vSpring 具有很多功能,可以將它們歸納為幾個基 本部件。Spring是一個輕量級的DI和AOP容器框 架。 輕量級輕量級從大小和應(yīng)用開支上說Spring都算是輕量級的。 整個Spring框架可以打成一個2.5MB多一點(diǎn)的JAR包, 并且Spring的處理開支也非常小。更重要的是,Spring 是非侵入式的:基于Spring開發(fā)的應(yīng)用中的對象一般不 依賴于Spring的類。 依賴注入依賴注入Spring提供了一種松耦合的技術(shù),稱為依賴 注入(DI)。使用DI,對象是被動接受依賴類而不是自己 主動去找。對象不是從容器中查找它的依賴類,而是容 器在實例化對象的時候主動將它
4、的依賴類注入給它。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 面向切面面向切面Spring對面向切面編程提供了強(qiáng)大支持,通過將業(yè)務(wù)邏 輯從應(yīng)用服務(wù)(如監(jiān)控和事務(wù)管理)中分離出來,實現(xiàn)了內(nèi)聚開發(fā)。 應(yīng)用對象只做它們該做的業(yè)務(wù)邏輯,它們不負(fù)責(zé)(或關(guān)心)其 它系統(tǒng)問題(如日志和事務(wù)支持)。 容器容器Spring是一個容器,因為它包含并且管理應(yīng)用對象的生命周 期和配置。你可以通過配置來設(shè)定你的Bean是單一實例,還是每 次請求產(chǎn)生一個實例,并且設(shè)定它們之間的關(guān)聯(lián)關(guān)系。Spring有別 于傳統(tǒng)的重量級EJB容器,這些容器通常很大,很笨重。 框架框架Spring實現(xiàn)了使用簡單的組件配置組合成一個復(fù)雜的應(yīng)用。 在S
5、pring中,應(yīng)用中的對象是通過XML文件配置組合起來的。并且 Spring提供了很多基礎(chǔ)功能(事務(wù)管理、持久層集成等),這使開 發(fā)人員能夠?qū)W⒂陂_發(fā)應(yīng)用邏輯。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 1.1.1 Spring模塊模塊 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 v核心容器核心容器 Spring的最底層是核心容器。Spring核心容器為Spring 框架提供了基礎(chǔ)功能。在這個模塊中你會找到 BeanFactory這個類,它是最基本的Spring容器和 Spring的DI所依賴的基礎(chǔ)。 vApplication Context(上下文)模塊(上下文)模塊 Spring的應(yīng)用上下文建立在核心容器之
6、上。如果說核心 模塊中的BeanFactory使Spring成為容器的話,那么, 上下文模塊就是使 Spring成為框架的原因。這個模塊擴(kuò) 展BeanFactory,添加了對I18N(國際化)、應(yīng)用生命 周期事件以及驗證的支持。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 v Spring的的AOP模塊模塊 在AOP模塊中,Spring對面向切面編程提供了豐富的支持。這個模 塊是為Spring應(yīng)用開發(fā)切面的基礎(chǔ)。與DI一樣,AOP支持應(yīng)用對象 之間的松耦合。利用AOP,應(yīng)用程序所關(guān)心的與其應(yīng)用的對象關(guān) 系不大。 v JDBC抽象及抽象及DAO模塊模塊 編寫JDBC代碼時總是要寫一些樣板式的代碼,如:獲得
7、連接、創(chuàng) 建語句、處理結(jié)果、最后關(guān)閉連接。Spring的JDBC和DAO模塊把 這些樣板式的代碼抽象出來,讓你的數(shù)據(jù)庫代碼變得簡單明了,也 可以避免因為釋放數(shù)據(jù)庫資源失敗而引起的問題。這個模塊還建立 了一個容易理解的數(shù)據(jù)庫異常層,它建立在各種數(shù)據(jù)庫錯誤信息之 上。以后就不用再去解釋那些隱晦專有的SQL錯誤信息了。 另外,這個模塊利用Spring的AOP模塊為Spring應(yīng)用中的對象提供 事務(wù)管理服務(wù)。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 vORM映射集成模塊映射集成模塊 vJMX(Java管理擴(kuò)展管理擴(kuò)展) vJava EE連接器連接器API(JCA) vSpring MVC框架框架 vSpri
8、ng Portlet MVC vSpring的的Web模塊模塊 v遠(yuǎn)程調(diào)用遠(yuǎn)程調(diào)用 vJava消息服務(wù)(消息服務(wù)(JMS) Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 1.2 開始開始Spring之旅之旅 v Spring版版Hello World示例的第一個類是一個服務(wù)類,它的作用是示例的第一個類是一個服務(wù)類,它的作用是 打印出那句熟悉的問候。打印出那句熟悉的問候。 v 定義定義Greeting Service接口接口 package com.sunwah.training.spring.hello; /* *Greeting Service接口,它定義了我們的服務(wù)類需要提供的服務(wù) */ public
9、 interface GreetingService /* * 打印問候語 */ public void sayGreeting(); Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 Hello World 程序代碼程序代碼 vGreeting ServiceImpl負(fù)責(zé)打印問候語。 package com.sunwah.training.spring.hello; /* * Greeting ServiceImpl負(fù)責(zé)打印問候語 */ public class GreetingServiceImpl implements GreetingService / 問候語 private String greet
10、ing; public GreetingServiceImpl() Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 public GreetingServiceImpl(String greeting) this.greeting = greeting; /打印問候語 public void sayGreeting() System.out.println(greeting); public void setGreeting(String greeting) this.greeting = greeting; Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 XML配置文件配置文件 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 是這個
11、簡單XML文件的根元素,它也是任何 Spring配置文件的根元素。 元素用來在 Spring容器中定義一個類以及它的 配置信息。這里,屬性id表示greetingService Bean的 名字,class屬性表示Bean的全路徑類名。 在元素中,元素表示設(shè)置屬性值 。 使用元素,我們告訴Spring容器通過調(diào)用 Bean的setGreeting()方法來設(shè)置其屬性值,在實例化此 bean時傳遞“Hello World”。 使用元素 ,我們告訴Spring容器通過 調(diào)用Bean的構(gòu)造函數(shù)來設(shè)置其屬性值,在實例化此 bean時傳遞“Hello World”。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 執(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基礎(chǔ)與實踐基礎(chǔ)與實踐 / 屬性注入 GreetingService greetingService = (GreetingService) factory .getBean(greetingService); greetingService.sayGreeting(); / 構(gòu)造注入 GreetingService greetingService2 = (GreetingService) factor
14、y .getBean(greetingService); greetingService2.sayGreeting(); Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 這段代碼的用處就是載入Spring容器并且利用它得到問 候服務(wù)。 這里用到的BeanFactory就是Spring容器。將spring- hello.xml文件載入容器后,main()方法調(diào)用 BeanFactory的 getBean()方法來得到問候服務(wù)的引用。 使用這個引用,它最后調(diào)用了sayGreeting()方法。當(dāng)我 們運(yùn)行HelloMain程序時,它在屏幕 上打出“Hello World!”。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐
15、2、依賴注入、依賴注入(DI) 依賴注入依賴注入(DI) Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 v在Spring中,組件無需自己負(fù)責(zé)與其他組件的關(guān)聯(lián)。 取而代之的是,容器負(fù)責(zé)把協(xié)作組件的引用給予各 個組件。 v創(chuàng)建系統(tǒng)組件之間協(xié)作關(guān)系的這個動作是DI的關(guān)鍵, 通常被稱之為裝配。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 2.1 容納你的容納你的Bean 在基于Spring的應(yīng)用中,應(yīng)用組件在Spring范圍內(nèi)是 激活的。容器可以創(chuàng)建組件,裝配和配置組件,以及 管理他們的整個生命周期(從new到finalize()。 首先,要知道容器是組件存活的地方。容器是Spring 框架的核心。Spring容器使用DI
16、管理所有注冊應(yīng)用系 統(tǒng)的組件。包括在協(xié)作組件之間建立關(guān)聯(lián)。 Spring提供了多種容器實現(xiàn),并分為兩類。Bean工廠 (由org.springframework.beans.factory.BeanFactory 接口定義)是最簡單的容器,提供了基礎(chǔ)的依賴注入 支持。應(yīng)用上下文(由 org.springframework.context.ApplicationContext接口 定義)建立在Bean工廠基礎(chǔ)之上,提供了系統(tǒng)架構(gòu)服 務(wù)。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 2.1.1使用使用Bean工廠工廠 Bean工廠采用了工廠設(shè)計模式,這個類負(fù)責(zé)創(chuàng)建、分發(fā)各種類型的 Bean及創(chuàng)建協(xié)作對象間的
17、關(guān)聯(lián)關(guā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); 當(dāng)getBean()方法被調(diào)用的時候,工廠就會實例化Bean并且使用依賴 注入設(shè)置Bean的屬性。這樣就在Spring容器中開始了Bean的生命。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 2.1.2使用應(yīng)用上下文使用應(yīng)用上下文 v ApplicationContext比BeanFactory提供了更多功能: 應(yīng)用上下文提供了文本信息解析工具,包括對國際化(I18N)的 支持。 應(yīng)用上下文提供載入文件資源的通用方法。 應(yīng)用上下文可以向注冊為監(jiān)聽器的Bean發(fā)送事件。 v Applicati
19、onContext有三個經(jīng)常用到的實現(xiàn): ClassPathXmlApplicationContext從類路徑中的XML文件載 入上下文定義信息,把上下文定義文件當(dāng)成類路徑資源。 從文件系統(tǒng)中的XML文件載入上下文定義信息。 XmlWebApplicationContext從Web系統(tǒng)中的XML文件載入 上下文定義信息。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 vApplicationContext與BeanFactory另一個重要 區(qū)別是關(guān)于單例的Bean是如何被載入的: BeanFactory延遲載入所有的Bean,直到getBean() 方法被調(diào)用時Bean才被創(chuàng)建。 應(yīng)用上下文會在上下文啟動
20、后預(yù)載入所有的單實例 Bean。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 2.1.3 Bean的生命的生命 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 步驟 說明 1. 實例化 Spring實例化Bean 2. 設(shè)置屬性 Spring注入Bean的屬性 3. 設(shè)置Bean名稱 如果Bean實現(xiàn)了BeanNameAware接口, Spring傳遞Bean工廠給 setBeanFactory() 4. 預(yù)處理(在初始 化之前) 如果有多個BeanPostProcessors, Spring將調(diào)用 postProcessBeforeInitialization()方法 Bean生命周期中的步驟明細(xì) Spring基礎(chǔ)
21、與實踐基礎(chǔ)與實踐 5. 初始化Bean 如果Bean實現(xiàn)了InitializingBean,其 afterPropertiesSet()方法將被調(diào)用。如 果Bean聲明了自定義的初始化方法,那么 將調(diào)用制定的初始化方法 6. 預(yù)處理(在初始 化之后) 如果有多個BeanPostProcessors, Spring將調(diào)用 postProcessAfterInitialization()方法 7. Bean已經(jīng)準(zhǔn)備 好 此時Bean已經(jīng)準(zhǔn)備好,可以使用,并且將 一直保留在Bean工廠中,直到不再需要它 8. 銷毀Bean如果Bean實現(xiàn)了DisposableBean,將調(diào) 用destory()方法
22、。如果Bean有自定義的 銷毀方法,將調(diào)用指定的方法。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 vBean在Spring應(yīng)用上下文的生命周期與在Bean 工廠中的生命周期只有一點(diǎn)不同: 如果Bean實現(xiàn)了ApplicationContextAware接口, setApplicationContext()方法會被調(diào)用。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 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基礎(chǔ)與實踐基礎(chǔ)與實踐 2.2.1 聲明一個簡單的聲明一個簡單的Bean v定義“魔術(shù)師”類: package com.sunwah.training.spring.di; /* *魔術(shù)師類 */ 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基礎(chǔ)與實踐基礎(chǔ)與實踐 在Spring配置文件中聲明Bean: 元素是Spring中最基本的配置單元,它通知 Spring創(chuàng)建一個對象。Id屬性定義了該Bean的名稱, clas
25、s屬性指明了它是個Juggler。 當(dāng)Spring容器裝載該Bean時,它將采用默認(rèn)的構(gòu)造函 數(shù)來實例化juggler Bean。實際上是采用下面的java代 碼來創(chuàng)建: new com.sunwah.training.spring.di.Juggler(); Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 使用以下代碼來裝載Spring應(yīng)用上下文: ApplicationContext ctx = new ClassPathXmlApplicationContext( spring-di.xml); / 默認(rèn)屬性值 Performer juggler = (Performer) ctx.getBean(j
26、uggler); juggler.perform(); Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 2.2.2通過構(gòu)造函數(shù)注入通過構(gòu)造函數(shù)注入 v注入基本類型的值: v注入其他對象 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 定義“詩歌”接口: package com.sunwah.training.spring.di; /* * * 詩歌接口 * */ public interface Poem /* * 朗誦 */ public void recite(); Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 定義“作十四行詩”類: 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基礎(chǔ)與實踐基礎(chǔ)與實踐 public Sonnet29() /* * 朗誦 */ public void recite() for (int i = 0; i LINES.length; i+) System.out.println(LINESi); Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 定義“會誦詩的魔術(shù)師”類: package com.sunwah.training.spring.d
30、i; /* *會誦詩的魔術(shù)師 */ public class PoeticJuggler extends Juggler / 詩歌 private Poem poem; public PoeticJuggler() super(); public PoeticJuggler(Poem poem) super(); this.poem = poem; Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 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基礎(chǔ)與實踐基礎(chǔ)與實踐 Sonnet29在Spring配置文件中的定義: PoeticJuggler在Spring配置文件中的定義: Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 2.2.3 通過通過setter方法注入方法注入 v通常Bean提供一對函數(shù)用來訪問屬性:setXXX() 和getXXX()。Sprin
32、g可以通過setter注入,利用 setter方法來配置屬性值。 vSpring用setter方法把元素里面設(shè) 置的值注入到對象中。屬性name對應(yīng)對象的屬性 名稱,屬性value就是要注入的值。 v注入簡單的數(shù)值 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 v注入其他的Bean Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 2.2.4 選擇構(gòu)造函數(shù)注入還是選擇構(gòu)造函數(shù)注入還是Set注入注入 ? v 使用構(gòu)造函數(shù)注入的優(yōu)點(diǎn): 構(gòu)造函數(shù)注入強(qiáng)制使用強(qiáng)依賴契約。如果沒有提供所有需要的 依賴,一個Bean就無法被實例化。 由于Bean的依賴都通過它的構(gòu)造函數(shù)設(shè)置,所以沒有必要再寫 多月的Set方法。這有助于減少代碼。 因
33、為只能通過構(gòu)造函數(shù)設(shè)置類的屬性,這樣做能有效地保證了 屬性的不可變性。 v 使用構(gòu)造函數(shù)注入的缺點(diǎn): 如果Bean有很多依賴,那么構(gòu)造函數(shù)的參數(shù)列表會很長。 如果一個對象已經(jīng)有很多種構(gòu)造方式,那么很難再提出不同的 構(gòu)造函數(shù),因為構(gòu)造函數(shù)只能通過參數(shù)的個數(shù)和類型來區(qū)分。 如果構(gòu)造函數(shù)的參數(shù)中有兩個以上是相同類型的,那么很難確 定每個參數(shù)的用途。 構(gòu)造函數(shù)注入不利于自身的繼承。Bean的構(gòu)造函數(shù)為了給父 類的私有變量賦值,需要把參數(shù)傳遞給super()方法。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 2.3 裝配集合裝配集合 Spring提供了4個類型的集合配置元素: 集合元素 用途 裝配一列值,允許重復(fù)
34、 裝配值集,不允許重復(fù) 裝配名稱-值對的集合,名稱和值可 以是任意類型 裝配名稱-值對的集合,名稱和值都 必須是String類型 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 v和對應(yīng)的屬性類型是array或者是 java.util.Collection。 v和對應(yīng)是java.util.Map和 java.util.Properties。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 v 使用配置元素: Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 v 使用配置元素: Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 v 使用配置元素: Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 v 使用配置元素: STRUM STRUM STRUM CRASH CRA
35、SH CRASH HUM HUM HUM Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 2.4自動裝配自動裝配 v 默認(rèn)情況下,Bean不會自動裝配。 v 有兩個辦法可以讓Spring自動裝配: 設(shè)置需要自動裝配的中的autowire屬性。 通過在Spring配置文件的根元素設(shè)置default-autowire 屬性。 v Spring提供了四種自動裝配類型: byName試圖在容器中尋找和需要自動裝配的屬性名相同的 Bean(或ID)。如果沒有找到相符的Bean,這個屬性就沒有被裝 配上。 byType試圖在容器中尋找一個與需要自動配置的屬性類型相 同的Bean。如果沒有找到相符的Bean,這個屬性就沒
36、有被裝 配上。如果找到超過一個相符的Bean,就會拋出異常。 constructor試圖在容器中查找與需要自動裝配的Bean的構(gòu)造 函數(shù)參數(shù)一致的一個或多個Bean。如果存在不確定Bean或構(gòu) 造函數(shù),容器會拋出異常。 autodetect首先嘗試使用constructor來自動裝配,然后使用 byType方式。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 v可以混合使用自動和手動裝配。 v使用自動裝配雖然有利于減少編寫裝配文件,但 是自動隱藏了很多細(xì)節(jié),缺乏透明,因此一般建 議采用手動裝配。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 2.5控制控制Bean創(chuàng)建創(chuàng)建 v默認(rèn)情況下,所有Spring Bean都是
37、單一的。 v為了使得每次都能產(chǎn)生一個新的Bean實例,可以 聲明Bean的scope屬性為prototype。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 2.5.1 Bean范圍化范圍化 vBean的范圍化選項主要有兩種 : singleton單例,定義Bean的范圍為每個Spring容器 一個實例(默認(rèn)值)。 prototype原型,允許Bean可以被多次實例化(每 次都創(chuàng)建一個新實例)。 例如: Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 2.5.2 利用工廠方法來創(chuàng)建利用工廠方法來創(chuàng)建Bean v在Spring應(yīng)用上下文中配置的Bean都可以通過調(diào) 用類的構(gòu)造函數(shù)來創(chuàng)建,也可以通過靜態(tài)工廠方 法來創(chuàng)建。
38、v元素有一個factory-method屬性,允許 指定要調(diào)用的靜態(tài)方法,而不是使用構(gòu)造函數(shù)內(nèi) 創(chuàng)建類的實例。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 2.5.3初始化和銷毀初始化和銷毀Bean v 元素中的init-method屬性指定了在Bean初始化 是要調(diào)用的方法,destroy-method指定了將Bean從容器 中刪除時要調(diào)用的方法。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 默認(rèn)的初始化和銷毀方法默認(rèn)的初始化和銷毀方法 v 元素中的default-init-method屬性設(shè)置了一個上下文定義 文件中所有Bean的初始化方法,default-destroy-method設(shè)置了上 下文定義文件中
39、所有Bean的銷毀方法。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 2.6聲明父聲明父Bean和子和子Bean v創(chuàng)建一個類來擴(kuò)展另一個類是面向?qū)ο蟮幕A(chǔ)之 一。在Java的類結(jié)構(gòu)里,為了把通用的功能和屬 性集中起來,可以把它們定義在父類里,讓子類 來繼承。 v出于同樣的目的,我們從定義里擴(kuò)展和 繼承新的。這樣做還會有效地減少 Spring上下文定義文件里冗余的XML。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 v為了實現(xiàn)Bean的繼承,元素提供了兩個 特殊屬性: parent: 指明Bean的id。它對于的作用相當(dāng)于 關(guān)鍵字extends對于Java類的作用。 abstract: 如果設(shè)置為true,就表示
40、聲明是抽象 的,不能被Spring實例化。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 2.6.1抽象基抽象基Bean類型類型 定義兩個相同類型的Bean Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 上面兩個Bean的定義可以采用繼承來實現(xiàn): Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 v在父Bean定義中,abstract屬性設(shè)置為true,這 就告訴Spring不要實例化這個Bean。父Bean不 必一定是抽象的,從一個具體Bean也可以創(chuàng)建子 Bean。 v在子Bean定義中,parent屬性表明kenny和 david都繼承自baseSaxophonist。 v在子Bean定義中沒有class屬性,這是因為 ken
41、ny和david不僅會繼承父Bean的屬性,也會 繼承它的類型。子Bean可以覆蓋繼承的屬性。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 2.6.2抽象共同屬性抽象共同屬性 以下兩個Bean有相同的屬性song,而且注入的屬性值也一樣。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 抽象公共屬性: Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 v注意父bean basePerformer沒有class屬性。這 沒有問題,因為子Bean會利用自己的class屬性 來確定自己的類型。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 2.7小結(jié)小結(jié) vSpring框架的核心是Spring容器。Spring提供了 多種實現(xiàn)容器的方法,這些方法可以
42、歸納為兩類: BeanFactory是最簡單的容器,它提供了基本的 DI和Bean裝配服務(wù)。如果需要用到更高級的框架 服務(wù),就需要使用Spring的ApplicationContext。 v在本課中,我們介紹了如何將Bean與Spring容器 裝配在一起。通常,在Spring容器中使用XML來 執(zhí)行裝配。這個XML文件包括了幫助容器執(zhí)行DI 的信息,以便Bean能夠與其所依賴的其他Bean 相關(guān)聯(lián)。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 3、面向切面編程、面向切面編程(AOP) 面向切面編程面向切面編程(AOP) Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 v在軟件開發(fā)中,散布于程序中多個地點(diǎn)的函數(shù)被 稱為
43、“交叉事務(wù)”。從概念上來說,它們一般是 與程序業(yè)務(wù)邏輯分開的(但經(jīng)常是直接嵌入其中 的)。 v把這些交叉事務(wù)與業(yè)務(wù)邏輯分離開正是面向切面 編程(AOP)的作用所在。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 3.1 AOP簡介簡介 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 3.1.1定義定義AOP術(shù)語術(shù)語 v通知通知(Advice) 切面的功能被稱為“通知”。通知定義了切面是 什么以及何時使用。 v連接點(diǎn)(連接點(diǎn)(Joinpoint) 連接點(diǎn)是在程序執(zhí)行過程中能夠插入切面的一個 點(diǎn)。這個點(diǎn)可以是方法被調(diào)用時、異常被拋出時、 甚至字段被編輯時。切面代碼可以通過這些點(diǎn)插 入到程序的一般流程之中,從而添加新的行為。
44、 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 v切入點(diǎn)切入點(diǎn)(Pointcut) 一個切面不是一定要通知程序里全部的連接點(diǎn)。 切入點(diǎn)可以縮小切面通知的連接點(diǎn)的范圍。如果 說通知定義了切面的“什么”和“何時”,那么 切入點(diǎn)就定義了“何地”。切入點(diǎn)的定義匹配通 知要接入點(diǎn)一個或多個連接點(diǎn)。 v切面(切面(Aspect) 切面是通知和切入點(diǎn)的結(jié)合。通知和切入點(diǎn)共同 定義了關(guān)于切面的全部內(nèi)容它的功能、在何時 和何地完成其功能。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 v引入(引入(Introduction) “引入”允許我們向現(xiàn)有的類添加新方法和屬性。 v目標(biāo)(目標(biāo)(Target) “目標(biāo)”是被通知的對象。 v代理(
45、代理(Proxy) “代理”是向目標(biāo)對象應(yīng)用通知之后被創(chuàng)建的對 象。 v織入織入(Weaving) “織入”是把切面應(yīng)用到目標(biāo)對象來創(chuàng)建新的代理 對象的過程。切面在指定連接點(diǎn)織入到目標(biāo)對象。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 織入的時機(jī): 編譯時:切面在目標(biāo)類編譯時被織入。 類加載時:切面在目標(biāo)類加載到JVM時被織入。 運(yùn)行時:切面在程序運(yùn)行時的某個時刻被織入。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 3.1.2 Spring對對AOP的支持的支持 v創(chuàng)建切點(diǎn)來定義切面織入的連接點(diǎn)是AOP框架的 基本功能。 vSpring對AOP的支持具有以下4種情況 : 經(jīng)典的基于代理的AOP AspectJ注解
46、驅(qū)動的切面 純POJO切面 注入式AspectJ切面 前三種都是基于代理的AOP的變體,因此, Spring對于AOP的支持局限于方法注入。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 Spring的的AOP框架的幾個關(guān)鍵點(diǎn):框架的幾個關(guān)鍵點(diǎn): v Spring通知是用JAVA編寫的。 Spring創(chuàng)建的全部通知都是用標(biāo)準(zhǔn)JAVA類編寫的。定義 通知所應(yīng)用的切點(diǎn)通常是以XML方式寫在Spring配置文件 里。 v Spring在運(yùn)行時通知對象。 Spring利用代理類包裹切面,從而把它們織入到Spring 管理的Bean里。代理類裝作目標(biāo)Bean,截取被通知的方 法調(diào)用,再把這些調(diào)用轉(zhuǎn)發(fā)到真正的目標(biāo)Be
47、an。在代理截 取方法調(diào)用之后,實際調(diào)用目標(biāo)Bean的方法之前,代理會 執(zhí)行切面邏輯。 v Spring只支持方法連接點(diǎn)。 由于Spring是基于動態(tài)代理的,它只支持方法連接點(diǎn)。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 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基礎(chǔ)與實踐基礎(chǔ)與實踐 / 落座 public void takeSeats() System.out.println(The audience is taking their seats.); / 關(guān)閉自己的手機(jī) 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基礎(chǔ)與實踐基礎(chǔ)與實踐 使用如下XML可以把它裝配為Spring的: Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 3.2.1 創(chuàng)建通知創(chuàng)建通知 Spring的AOP里有5種類型的通知,分別由一個接口進(jìn)行定義: 通知類型接口 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基礎(chǔ)與實踐基礎(chǔ)與實踐 前通知、返回后通知和拋出后通知 定義觀眾功能如何被使用的通知: 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基礎(chǔ)與實踐基礎(chǔ)與實踐 / 在方法之前調(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基礎(chǔ)與實踐基礎(chǔ)與實踐 / 在拋出異常之后執(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基礎(chǔ)與實踐基礎(chǔ)與實踐 XML配置文件如下: Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 周圍通知周圍通知 v周圍通知相當(dāng)于前通知、返回后通知、拋出后通 知的結(jié)合。 v在Spring里,周圍通知是由AOP Alliance的 MethodInterceptor接口定義的。 v編寫周圍通知的好處: 能以簡潔的方式在一個方法里定義前通知和后通 知。 可以檢查和修改被通知方法的返回值。 Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 以周圍通知方式定義觀眾通知: 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基礎(chǔ)與實踐基礎(chǔ)與實踐 public Object invoke(MethodInvocati
57、on invocation) throws Throwable try / 在方法調(diào)用前執(zhí)行 audience.takeSeats(); audience.turnOffCellPhones(); / 調(diào)用目標(biāo)方法 Object returnValue = ceed(); / 在成功返回之后執(zhí)行 audience.applaud(); return returnValue; catch (PerformanceException throwable) / 出現(xiàn)異常之后執(zhí)行 audience.demandRefund(); throw throwable; Spring基礎(chǔ)與實踐基礎(chǔ)與實踐 / injected private Audience audience; public void setAudie
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五貨物貿(mào)易居間合同正規(guī)范例
- 個人擔(dān)保借款合同大全
- 忠誠協(xié)議書范文
- 道路建設(shè)安全管理制度
- 鋼構(gòu)車間設(shè)備管理制度
- 銀行未達(dá)賬項管理制度
- 運(yùn)營計劃統(tǒng)計管理制度
- 規(guī)范項目資產(chǎn)管理制度
- 公司小車隊管理制度
- 食品公司贈品管理制度
- 熱力管網(wǎng)安全風(fēng)險評估-全面剖析
- 人道主義補(bǔ)償協(xié)議書
- 2025年北京市順義區(qū)高考英語一模試卷
- 《人工智能安全導(dǎo)論》 課件 第四章 后門攻擊與防御
- 2025年世界地球日知識答題活動考試題庫300題(含答案)
- 2025屆浙江省溫州市高三下學(xué)期二模物理試題(含答案)
- 軍隊保密知識
- 麻醉睡眠治療科普
- 2025-2031年中國花卉行業(yè)競爭格局分析及投資戰(zhàn)略咨詢報告
- 2025年職業(yè)院校技能大賽(高職組)體育活動設(shè)計與實施賽項參考試題(附答案)
- 23G409先張法預(yù)應(yīng)力混凝土管樁
評論
0/150
提交評論