版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、SUNWAH Spring 基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 www. Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 目的目的 v介紹Spring兩大核心技術(shù)-依賴注入(DI) 和面向 切面編程(AOP)。 v介紹Spring 是如何利用這兩種技術(shù)來(lái)開(kāi)發(fā)松散耦 合的Java 應(yīng)用程序。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 目錄目錄 Spring介紹介紹1 依賴注入依賴注入(DI)2 面向切面編程面向切面編程(AOP)3 實(shí)踐實(shí)踐4 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 1、Spring介紹介紹 Spring介紹介紹 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 1.1 Spring是什么是什么 v Spring是一個(gè)基于JAVA語(yǔ)言、
2、開(kāi)源、輕量級(jí)的DI和AOP容 器框架。 v EJB的聲明式編程模型確實(shí)簡(jiǎn)化了很多基礎(chǔ)設(shè)施層面的開(kāi)發(fā), 如事務(wù)和安全,但在部署文件維護(hù)和各種接口(home、 remote/local接口)實(shí)現(xiàn)等方面變得很復(fù)雜。很多新技術(shù) 包括AOP和DI為JavaBeans提供了很多EJB才擁有的強(qiáng)大 功能。這些技術(shù)使用EJB那樣的聲明式編碼模型來(lái)提供簡(jiǎn)單 潔凈Java對(duì)象(POJO)。負(fù)責(zé)輕量級(jí)POJO開(kāi)發(fā)就是 Spring框架。 v Spring 框架是以簡(jiǎn)化J2EE 應(yīng)用程序開(kāi)發(fā)為特定目標(biāo)而創(chuàng) 建的。使用Spring,你可以用簡(jiǎn)單的JavaBeans來(lái)實(shí)現(xiàn)那 些以前只有EJB才能實(shí)現(xiàn)的功能。 Spring
3、基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 vSpring 具有很多功能,可以將它們歸納為幾個(gè)基 本部件。Spring是一個(gè)輕量級(jí)的DI和AOP容器框 架。 輕量級(jí)輕量級(jí)從大小和應(yīng)用開(kāi)支上說(shuō)Spring都算是輕量級(jí)的。 整個(gè)Spring框架可以打成一個(gè)2.5MB多一點(diǎn)的JAR包, 并且Spring的處理開(kāi)支也非常小。更重要的是,Spring 是非侵入式的:基于Spring開(kāi)發(fā)的應(yīng)用中的對(duì)象一般不 依賴于Spring的類。 依賴注入依賴注入Spring提供了一種松耦合的技術(shù),稱為依賴 注入(DI)。使用DI,對(duì)象是被動(dòng)接受依賴類而不是自己 主動(dòng)去找。對(duì)象不是從容器中查找它的依賴類,而是容 器在實(shí)例化對(duì)象的時(shí)候主動(dòng)將它
4、的依賴類注入給它。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 面向切面面向切面Spring對(duì)面向切面編程提供了強(qiáng)大支持,通過(guò)將業(yè)務(wù)邏 輯從應(yīng)用服務(wù)(如監(jiān)控和事務(wù)管理)中分離出來(lái),實(shí)現(xiàn)了內(nèi)聚開(kāi)發(fā)。 應(yīng)用對(duì)象只做它們?cè)撟龅臉I(yè)務(wù)邏輯,它們不負(fù)責(zé)(或關(guān)心)其 它系統(tǒng)問(wèn)題(如日志和事務(wù)支持)。 容器容器Spring是一個(gè)容器,因?yàn)樗⑶夜芾響?yīng)用對(duì)象的生命周 期和配置。你可以通過(guò)配置來(lái)設(shè)定你的Bean是單一實(shí)例,還是每 次請(qǐng)求產(chǎn)生一個(gè)實(shí)例,并且設(shè)定它們之間的關(guān)聯(lián)關(guān)系。Spring有別 于傳統(tǒng)的重量級(jí)EJB容器,這些容器通常很大,很笨重。 框架框架Spring實(shí)現(xiàn)了使用簡(jiǎn)單的組件配置組合成一個(gè)復(fù)雜的應(yīng)用。 在S
5、pring中,應(yīng)用中的對(duì)象是通過(guò)XML文件配置組合起來(lái)的。并且 Spring提供了很多基礎(chǔ)功能(事務(wù)管理、持久層集成等),這使開(kāi) 發(fā)人員能夠?qū)W⒂陂_(kāi)發(fā)應(yīng)用邏輯。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 1.1.1 Spring模塊模塊 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 v核心容器核心容器 Spring的最底層是核心容器。Spring核心容器為Spring 框架提供了基礎(chǔ)功能。在這個(gè)模塊中你會(huì)找到 BeanFactory這個(gè)類,它是最基本的Spring容器和 Spring的DI所依賴的基礎(chǔ)。 vApplication Context(上下文)模塊(上下文)模塊 Spring的應(yīng)用上下文建立在核心容器之
6、上。如果說(shuō)核心 模塊中的BeanFactory使Spring成為容器的話,那么, 上下文模塊就是使 Spring成為框架的原因。這個(gè)模塊擴(kuò) 展BeanFactory,添加了對(duì)I18N(國(guó)際化)、應(yīng)用生命 周期事件以及驗(yàn)證的支持。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 v Spring的的AOP模塊模塊 在AOP模塊中,Spring對(duì)面向切面編程提供了豐富的支持。這個(gè)模 塊是為Spring應(yīng)用開(kāi)發(fā)切面的基礎(chǔ)。與DI一樣,AOP支持應(yīng)用對(duì)象 之間的松耦合。利用AOP,應(yīng)用程序所關(guān)心的與其應(yīng)用的對(duì)象關(guān) 系不大。 v JDBC抽象及抽象及DAO模塊模塊 編寫JDBC代碼時(shí)總是要寫一些樣板式的代碼,如:獲得
7、連接、創(chuàng) 建語(yǔ)句、處理結(jié)果、最后關(guān)閉連接。Spring的JDBC和DAO模塊把 這些樣板式的代碼抽象出來(lái),讓你的數(shù)據(jù)庫(kù)代碼變得簡(jiǎn)單明了,也 可以避免因?yàn)獒尫艛?shù)據(jù)庫(kù)資源失敗而引起的問(wèn)題。這個(gè)模塊還建立 了一個(gè)容易理解的數(shù)據(jù)庫(kù)異常層,它建立在各種數(shù)據(jù)庫(kù)錯(cuò)誤信息之 上。以后就不用再去解釋那些隱晦專有的SQL錯(cuò)誤信息了。 另外,這個(gè)模塊利用Spring的AOP模塊為Spring應(yīng)用中的對(duì)象提供 事務(wù)管理服務(wù)。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 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ǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 1.2 開(kāi)始開(kāi)始Spring之旅之旅 v Spring版版Hello World示例的第一個(gè)類是一個(gè)服務(wù)類,它的作用是示例的第一個(gè)類是一個(gè)服務(wù)類,它的作用是 打印出那句熟悉的問(wèn)候。打印出那句熟悉的問(wèn)候。 v 定義定義Greeting Service接口接口 package com.sunwah.training.spring.hello; /* *Greeting Service接口,它定義了我們的服務(wù)類需要提供的服務(wù) */ public
9、 interface GreetingService /* * 打印問(wèn)候語(yǔ) */ public void sayGreeting(); Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 Hello World 程序代碼程序代碼 vGreeting ServiceImpl負(fù)責(zé)打印問(wèn)候語(yǔ)。 package com.sunwah.training.spring.hello; /* * Greeting ServiceImpl負(fù)責(zé)打印問(wèn)候語(yǔ) */ public class GreetingServiceImpl implements GreetingService / 問(wèn)候語(yǔ) private String greet
10、ing; public GreetingServiceImpl() Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 public GreetingServiceImpl(String greeting) this.greeting = greeting; /打印問(wèn)候語(yǔ) public void sayGreeting() System.out.println(greeting); public void setGreeting(String greeting) this.greeting = greeting; Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 XML配置文件配置文件 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 是這個(gè)
11、簡(jiǎn)單XML文件的根元素,它也是任何 Spring配置文件的根元素。 元素用來(lái)在 Spring容器中定義一個(gè)類以及它的 配置信息。這里,屬性id表示greetingService Bean的 名字,class屬性表示Bean的全路徑類名。 在元素中,元素表示設(shè)置屬性值 。 使用元素,我們告訴Spring容器通過(guò)調(diào)用 Bean的setGreeting()方法來(lái)設(shè)置其屬性值,在實(shí)例化此 bean時(shí)傳遞“Hello World”。 使用元素 ,我們告訴Spring容器通過(guò) 調(diào)用Bean的構(gòu)造函數(shù)來(lái)設(shè)置其屬性值,在實(shí)例化此 bean時(shí)傳遞“Hello World”。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 執(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ǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 / 屬性注入 GreetingService greetingService = (GreetingService) factory .getBean(greetingService); greetingService.sayGreeting(); / 構(gòu)造注入 GreetingService greetingService2 = (GreetingService) factor
14、y .getBean(greetingService); greetingService2.sayGreeting(); Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 這段代碼的用處就是載入Spring容器并且利用它得到問(wèn) 候服務(wù)。 這里用到的BeanFactory就是Spring容器。將spring- hello.xml文件載入容器后,main()方法調(diào)用 BeanFactory的 getBean()方法來(lái)得到問(wèn)候服務(wù)的引用。 使用這個(gè)引用,它最后調(diào)用了sayGreeting()方法。當(dāng)我 們運(yùn)行HelloMain程序時(shí),它在屏幕 上打出“Hello World!”。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐
15、2、依賴注入、依賴注入(DI) 依賴注入依賴注入(DI) Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 v在Spring中,組件無(wú)需自己負(fù)責(zé)與其他組件的關(guān)聯(lián)。 取而代之的是,容器負(fù)責(zé)把協(xié)作組件的引用給予各 個(gè)組件。 v創(chuàng)建系統(tǒng)組件之間協(xié)作關(guān)系的這個(gè)動(dòng)作是DI的關(guān)鍵, 通常被稱之為裝配。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 2.1 容納你的容納你的Bean 在基于Spring的應(yīng)用中,應(yīng)用組件在Spring范圍內(nèi)是 激活的。容器可以創(chuàng)建組件,裝配和配置組件,以及 管理他們的整個(gè)生命周期(從new到finalize()。 首先,要知道容器是組件存活的地方。容器是Spring 框架的核心。Spring容器使用DI
16、管理所有注冊(cè)應(yīng)用系 統(tǒng)的組件。包括在協(xié)作組件之間建立關(guān)聯(lián)。 Spring提供了多種容器實(shí)現(xiàn),并分為兩類。Bean工廠 (由org.springframework.beans.factory.BeanFactory 接口定義)是最簡(jiǎn)單的容器,提供了基礎(chǔ)的依賴注入 支持。應(yīng)用上下文(由 org.springframework.context.ApplicationContext接口 定義)建立在Bean工廠基礎(chǔ)之上,提供了系統(tǒng)架構(gòu)服 務(wù)。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 2.1.1使用使用Bean工廠工廠 Bean工廠采用了工廠設(shè)計(jì)模式,這個(gè)類負(fù)責(zé)創(chuàng)建、分發(fā)各種類型的 Bean及創(chuàng)建協(xié)作對(duì)象間的
17、關(guān)聯(lián)關(guān)系。Bean工廠還要參與到Bean的生 命周期中,調(diào)用用戶定義的初始化和銷毀方法。 org.springframework.beans.factory.xml.XmlBeanFactory是最常使用 的BeanFactory的實(shí)現(xiàn),它根據(jù)XML文件中的定義裝載Bean。 例: BeanFactory factory = new XmlBeanFactory(new (c:/beans.xml); 這段代碼的意思是告訴Bean工廠從XML文件中讀取Bean的定義信息。 但是Bean只有在被需要的時(shí)候才被實(shí)例化。 為了從BeanFactory中得到一個(gè)Bean,只要簡(jiǎn)單調(diào)用getBean()
18、方法。 例: MyBean myBean = (MyBean) factory.getBean(myBean); 當(dāng)getBean()方法被調(diào)用的時(shí)候,工廠就會(huì)實(shí)例化Bean并且使用依賴 注入設(shè)置Bean的屬性。這樣就在Spring容器中開(kāi)始了Bean的生命。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 2.1.2使用應(yīng)用上下文使用應(yīng)用上下文 v ApplicationContext比BeanFactory提供了更多功能: 應(yīng)用上下文提供了文本信息解析工具,包括對(duì)國(guó)際化(I18N)的 支持。 應(yīng)用上下文提供載入文件資源的通用方法。 應(yīng)用上下文可以向注冊(cè)為監(jiān)聽(tīng)器的Bean發(fā)送事件。 v Applicati
19、onContext有三個(gè)經(jīng)常用到的實(shí)現(xiàn): ClassPathXmlApplicationContext從類路徑中的XML文件載 入上下文定義信息,把上下文定義文件當(dāng)成類路徑資源。 從文件系統(tǒng)中的XML文件載入上下文定義信息。 XmlWebApplicationContext從Web系統(tǒng)中的XML文件載入 上下文定義信息。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 vApplicationContext與BeanFactory另一個(gè)重要 區(qū)別是關(guān)于單例的Bean是如何被載入的: BeanFactory延遲載入所有的Bean,直到getBean() 方法被調(diào)用時(shí)Bean才被創(chuàng)建。 應(yīng)用上下文會(huì)在上下文啟動(dòng)
20、后預(yù)載入所有的單實(shí)例 Bean。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 2.1.3 Bean的生命的生命 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 步驟 說(shuō)明 1. 實(shí)例化 Spring實(shí)例化Bean 2. 設(shè)置屬性 Spring注入Bean的屬性 3. 設(shè)置Bean名稱 如果Bean實(shí)現(xiàn)了BeanNameAware接口, Spring傳遞Bean工廠給 setBeanFactory() 4. 預(yù)處理(在初始 化之前) 如果有多個(gè)BeanPostProcessors, Spring將調(diào)用 postProcessBeforeInitialization()方法 Bean生命周期中的步驟明細(xì) Spring基礎(chǔ)
21、與實(shí)踐基礎(chǔ)與實(shí)踐 5. 初始化Bean 如果Bean實(shí)現(xiàn)了InitializingBean,其 afterPropertiesSet()方法將被調(diào)用。如 果Bean聲明了自定義的初始化方法,那么 將調(diào)用制定的初始化方法 6. 預(yù)處理(在初始 化之后) 如果有多個(gè)BeanPostProcessors, Spring將調(diào)用 postProcessAfterInitialization()方法 7. Bean已經(jīng)準(zhǔn)備 好 此時(shí)Bean已經(jīng)準(zhǔn)備好,可以使用,并且將 一直保留在Bean工廠中,直到不再需要它 8. 銷毀Bean如果Bean實(shí)現(xiàn)了DisposableBean,將調(diào) 用destory()方法
22、。如果Bean有自定義的 銷毀方法,將調(diào)用指定的方法。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 vBean在Spring應(yīng)用上下文的生命周期與在Bean 工廠中的生命周期只有一點(diǎn)不同: 如果Bean實(shí)現(xiàn)了ApplicationContextAware接口, setApplicationContext()方法會(huì)被調(diào)用。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 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ǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 2.2.1 聲明一個(gè)簡(jiǎn)單的聲明一個(gè)簡(jiǎn)單的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ǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 在Spring配置文件中聲明Bean: 元素是Spring中最基本的配置單元,它通知 Spring創(chuàng)建一個(gè)對(duì)象。Id屬性定義了該Bean的名稱, clas
25、s屬性指明了它是個(gè)Juggler。 當(dāng)Spring容器裝載該Bean時(shí),它將采用默認(rèn)的構(gòu)造函 數(shù)來(lái)實(shí)例化juggler Bean。實(shí)際上是采用下面的java代 碼來(lái)創(chuàng)建: new com.sunwah.training.spring.di.Juggler(); Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 使用以下代碼來(lái)裝載Spring應(yīng)用上下文: ApplicationContext ctx = new ClassPathXmlApplicationContext( spring-di.xml); / 默認(rèn)屬性值 Performer juggler = (Performer) ctx.getBean(j
26、uggler); juggler.perform(); Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 2.2.2通過(guò)構(gòu)造函數(shù)注入通過(guò)構(gòu)造函數(shù)注入 v注入基本類型的值: v注入其他對(duì)象 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 定義“詩(shī)歌”接口: package com.sunwah.training.spring.di; /* * * 詩(shī)歌接口 * */ public interface Poem /* * 朗誦 */ public void recite(); Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 定義“作十四行詩(shī)”類: package com.sunwah.training.spring.di; /* *十四行詩(shī)
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ǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 public Sonnet29() /* * 朗誦 */ public void recite() for (int i = 0; i LINES.length; i+) System.out.println(LINESi); Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 定義“會(huì)誦詩(shī)的魔術(shù)師”類: package com.sunwah.training.spring.d
30、i; /* *會(huì)誦詩(shī)的魔術(shù)師 */ public class PoeticJuggler extends Juggler / 詩(shī)歌 private Poem poem; public PoeticJuggler() super(); public PoeticJuggler(Poem poem) super(); this.poem = poem; Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 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ǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 Sonnet29在Spring配置文件中的定義: PoeticJuggler在Spring配置文件中的定義: Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 2.2.3 通過(guò)通過(guò)setter方法注入方法注入 v通常Bean提供一對(duì)函數(shù)用來(lái)訪問(wèn)屬性:setXXX() 和getXXX()。Sprin
32、g可以通過(guò)setter注入,利用 setter方法來(lái)配置屬性值。 vSpring用setter方法把元素里面設(shè) 置的值注入到對(duì)象中。屬性name對(duì)應(yīng)對(duì)象的屬性 名稱,屬性value就是要注入的值。 v注入簡(jiǎn)單的數(shù)值 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 v注入其他的Bean Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 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)依賴契約。如果沒(méi)有提供所有需要的 依賴,一個(gè)Bean就無(wú)法被實(shí)例化。 由于Bean的依賴都通過(guò)它的構(gòu)造函數(shù)設(shè)置,所以沒(méi)有必要再寫 多月的Set方法。這有助于減少代碼。 因
33、為只能通過(guò)構(gòu)造函數(shù)設(shè)置類的屬性,這樣做能有效地保證了 屬性的不可變性。 v 使用構(gòu)造函數(shù)注入的缺點(diǎn): 如果Bean有很多依賴,那么構(gòu)造函數(shù)的參數(shù)列表會(huì)很長(zhǎng)。 如果一個(gè)對(duì)象已經(jīng)有很多種構(gòu)造方式,那么很難再提出不同的 構(gòu)造函數(shù),因?yàn)闃?gòu)造函數(shù)只能通過(guò)參數(shù)的個(gè)數(shù)和類型來(lái)區(qū)分。 如果構(gòu)造函數(shù)的參數(shù)中有兩個(gè)以上是相同類型的,那么很難確 定每個(gè)參數(shù)的用途。 構(gòu)造函數(shù)注入不利于自身的繼承。Bean的構(gòu)造函數(shù)為了給父 類的私有變量賦值,需要把參數(shù)傳遞給super()方法。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 2.3 裝配集合裝配集合 Spring提供了4個(gè)類型的集合配置元素: 集合元素 用途 裝配一列值,允許重復(fù)
34、 裝配值集,不允許重復(fù) 裝配名稱-值對(duì)的集合,名稱和值可 以是任意類型 裝配名稱-值對(duì)的集合,名稱和值都 必須是String類型 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 v和對(duì)應(yīng)的屬性類型是array或者是 java.util.Collection。 v和對(duì)應(yīng)是java.util.Map和 java.util.Properties。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 v 使用配置元素: Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 v 使用配置元素: Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 v 使用配置元素: Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 v 使用配置元素: STRUM STRUM STRUM CRASH CRA
35、SH CRASH HUM HUM HUM Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 2.4自動(dòng)裝配自動(dòng)裝配 v 默認(rèn)情況下,Bean不會(huì)自動(dòng)裝配。 v 有兩個(gè)辦法可以讓Spring自動(dòng)裝配: 設(shè)置需要自動(dòng)裝配的中的autowire屬性。 通過(guò)在Spring配置文件的根元素設(shè)置default-autowire 屬性。 v Spring提供了四種自動(dòng)裝配類型: byName試圖在容器中尋找和需要自動(dòng)裝配的屬性名相同的 Bean(或ID)。如果沒(méi)有找到相符的Bean,這個(gè)屬性就沒(méi)有被裝 配上。 byType試圖在容器中尋找一個(gè)與需要自動(dòng)配置的屬性類型相 同的Bean。如果沒(méi)有找到相符的Bean,這個(gè)屬性就沒(méi)
36、有被裝 配上。如果找到超過(guò)一個(gè)相符的Bean,就會(huì)拋出異常。 constructor試圖在容器中查找與需要自動(dòng)裝配的Bean的構(gòu)造 函數(shù)參數(shù)一致的一個(gè)或多個(gè)Bean。如果存在不確定Bean或構(gòu) 造函數(shù),容器會(huì)拋出異常。 autodetect首先嘗試使用constructor來(lái)自動(dòng)裝配,然后使用 byType方式。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 v可以混合使用自動(dòng)和手動(dòng)裝配。 v使用自動(dòng)裝配雖然有利于減少編寫裝配文件,但 是自動(dòng)隱藏了很多細(xì)節(jié),缺乏透明,因此一般建 議采用手動(dòng)裝配。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 2.5控制控制Bean創(chuàng)建創(chuàng)建 v默認(rèn)情況下,所有Spring Bean都是
37、單一的。 v為了使得每次都能產(chǎn)生一個(gè)新的Bean實(shí)例,可以 聲明Bean的scope屬性為prototype。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 2.5.1 Bean范圍化范圍化 vBean的范圍化選項(xiàng)主要有兩種 : singleton單例,定義Bean的范圍為每個(gè)Spring容器 一個(gè)實(shí)例(默認(rèn)值)。 prototype原型,允許Bean可以被多次實(shí)例化(每 次都創(chuàng)建一個(gè)新實(shí)例)。 例如: Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 2.5.2 利用工廠方法來(lái)創(chuàng)建利用工廠方法來(lái)創(chuàng)建Bean v在Spring應(yīng)用上下文中配置的Bean都可以通過(guò)調(diào) 用類的構(gòu)造函數(shù)來(lái)創(chuàng)建,也可以通過(guò)靜態(tài)工廠方 法來(lái)創(chuàng)建。
38、v元素有一個(gè)factory-method屬性,允許 指定要調(diào)用的靜態(tài)方法,而不是使用構(gòu)造函數(shù)內(nèi) 創(chuàng)建類的實(shí)例。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 2.5.3初始化和銷毀初始化和銷毀Bean v 元素中的init-method屬性指定了在Bean初始化 是要調(diào)用的方法,destroy-method指定了將Bean從容器 中刪除時(shí)要調(diào)用的方法。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 默認(rèn)的初始化和銷毀方法默認(rèn)的初始化和銷毀方法 v 元素中的default-init-method屬性設(shè)置了一個(gè)上下文定義 文件中所有Bean的初始化方法,default-destroy-method設(shè)置了上 下文定義文件中
39、所有Bean的銷毀方法。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 2.6聲明父聲明父Bean和子和子Bean v創(chuàng)建一個(gè)類來(lái)擴(kuò)展另一個(gè)類是面向?qū)ο蟮幕A(chǔ)之 一。在Java的類結(jié)構(gòu)里,為了把通用的功能和屬 性集中起來(lái),可以把它們定義在父類里,讓子類 來(lái)繼承。 v出于同樣的目的,我們從定義里擴(kuò)展和 繼承新的。這樣做還會(huì)有效地減少 Spring上下文定義文件里冗余的XML。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 v為了實(shí)現(xiàn)Bean的繼承,元素提供了兩個(gè) 特殊屬性: parent: 指明Bean的id。它對(duì)于的作用相當(dāng)于 關(guān)鍵字extends對(duì)于Java類的作用。 abstract: 如果設(shè)置為true,就表示
40、聲明是抽象 的,不能被Spring實(shí)例化。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 2.6.1抽象基抽象基Bean類型類型 定義兩個(gè)相同類型的Bean Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 上面兩個(gè)Bean的定義可以采用繼承來(lái)實(shí)現(xiàn): Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 v在父Bean定義中,abstract屬性設(shè)置為true,這 就告訴Spring不要實(shí)例化這個(gè)Bean。父Bean不 必一定是抽象的,從一個(gè)具體Bean也可以創(chuàng)建子 Bean。 v在子Bean定義中,parent屬性表明kenny和 david都繼承自baseSaxophonist。 v在子Bean定義中沒(méi)有class屬性,這是因?yàn)?ken
41、ny和david不僅會(huì)繼承父Bean的屬性,也會(huì) 繼承它的類型。子Bean可以覆蓋繼承的屬性。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 2.6.2抽象共同屬性抽象共同屬性 以下兩個(gè)Bean有相同的屬性song,而且注入的屬性值也一樣。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 抽象公共屬性: Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 v注意父bean basePerformer沒(méi)有class屬性。這 沒(méi)有問(wèn)題,因?yàn)樽覤ean會(huì)利用自己的class屬性 來(lái)確定自己的類型。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 2.7小結(jié)小結(jié) vSpring框架的核心是Spring容器。Spring提供了 多種實(shí)現(xiàn)容器的方法,這些方法可以
42、歸納為兩類: BeanFactory是最簡(jiǎn)單的容器,它提供了基本的 DI和Bean裝配服務(wù)。如果需要用到更高級(jí)的框架 服務(wù),就需要使用Spring的ApplicationContext。 v在本課中,我們介紹了如何將Bean與Spring容器 裝配在一起。通常,在Spring容器中使用XML來(lái) 執(zhí)行裝配。這個(gè)XML文件包括了幫助容器執(zhí)行DI 的信息,以便Bean能夠與其所依賴的其他Bean 相關(guān)聯(lián)。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 3、面向切面編程、面向切面編程(AOP) 面向切面編程面向切面編程(AOP) Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 v在軟件開(kāi)發(fā)中,散布于程序中多個(gè)地點(diǎn)的函數(shù)被 稱為
43、“交叉事務(wù)”。從概念上來(lái)說(shuō),它們一般是 與程序業(yè)務(wù)邏輯分開(kāi)的(但經(jīng)常是直接嵌入其中 的)。 v把這些交叉事務(wù)與業(yè)務(wù)邏輯分離開(kāi)正是面向切面 編程(AOP)的作用所在。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 3.1 AOP簡(jiǎn)介簡(jiǎn)介 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 3.1.1定義定義AOP術(shù)語(yǔ)術(shù)語(yǔ) v通知通知(Advice) 切面的功能被稱為“通知”。通知定義了切面是 什么以及何時(shí)使用。 v連接點(diǎn)(連接點(diǎn)(Joinpoint) 連接點(diǎn)是在程序執(zhí)行過(guò)程中能夠插入切面的一個(gè) 點(diǎn)。這個(gè)點(diǎn)可以是方法被調(diào)用時(shí)、異常被拋出時(shí)、 甚至字段被編輯時(shí)。切面代碼可以通過(guò)這些點(diǎn)插 入到程序的一般流程之中,從而添加新的行為。
44、 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 v切入點(diǎn)切入點(diǎn)(Pointcut) 一個(gè)切面不是一定要通知程序里全部的連接點(diǎn)。 切入點(diǎn)可以縮小切面通知的連接點(diǎn)的范圍。如果 說(shuō)通知定義了切面的“什么”和“何時(shí)”,那么 切入點(diǎn)就定義了“何地”。切入點(diǎn)的定義匹配通 知要接入點(diǎn)一個(gè)或多個(gè)連接點(diǎn)。 v切面(切面(Aspect) 切面是通知和切入點(diǎn)的結(jié)合。通知和切入點(diǎn)共同 定義了關(guān)于切面的全部?jī)?nèi)容它的功能、在何時(shí) 和何地完成其功能。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 v引入(引入(Introduction) “引入”允許我們向現(xiàn)有的類添加新方法和屬性。 v目標(biāo)(目標(biāo)(Target) “目標(biāo)”是被通知的對(duì)象。 v代理(
45、代理(Proxy) “代理”是向目標(biāo)對(duì)象應(yīng)用通知之后被創(chuàng)建的對(duì) 象。 v織入織入(Weaving) “織入”是把切面應(yīng)用到目標(biāo)對(duì)象來(lái)創(chuàng)建新的代理 對(duì)象的過(guò)程。切面在指定連接點(diǎn)織入到目標(biāo)對(duì)象。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 織入的時(shí)機(jī): 編譯時(shí):切面在目標(biāo)類編譯時(shí)被織入。 類加載時(shí):切面在目標(biāo)類加載到JVM時(shí)被織入。 運(yùn)行時(shí):切面在程序運(yùn)行時(shí)的某個(gè)時(shí)刻被織入。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 3.1.2 Spring對(duì)對(duì)AOP的支持的支持 v創(chuàng)建切點(diǎn)來(lái)定義切面織入的連接點(diǎn)是AOP框架的 基本功能。 vSpring對(duì)AOP的支持具有以下4種情況 : 經(jīng)典的基于代理的AOP AspectJ注解
46、驅(qū)動(dòng)的切面 純POJO切面 注入式AspectJ切面 前三種都是基于代理的AOP的變體,因此, Spring對(duì)于AOP的支持局限于方法注入。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 Spring的的AOP框架的幾個(gè)關(guān)鍵點(diǎn):框架的幾個(gè)關(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)行時(shí)通知對(duì)象。 Spring利用代理類包裹切面,從而把它們織入到Spring 管理的Bean里。代理類裝作目標(biāo)Bean,截取被通知的方 法調(diào)用,再把這些調(diào)用轉(zhuǎn)發(fā)到真正的目標(biāo)Be
47、an。在代理截 取方法調(diào)用之后,實(shí)際調(diào)用目標(biāo)Bean的方法之前,代理會(huì) 執(zhí)行切面邏輯。 v Spring只支持方法連接點(diǎn)。 由于Spring是基于動(dòng)態(tài)代理的,它只支持方法連接點(diǎn)。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 3.2創(chuàng)建經(jīng)典的創(chuàng)建經(jīng)典的Spring切面切面 定義一個(gè)觀眾類: 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ǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 / 落座 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ǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 使用如下XML可以把它裝配為Spring的: Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 3.2.1 創(chuàng)建通知?jiǎng)?chuàng)建通知 Spring的AOP里有5種類型的通知,分別由一個(gè)接口進(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ǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 前通知、返回后通知和拋出后通知 定義觀眾功能如何被使用的通知: 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; /* * * 定義觀眾功能如何被使用的通知(實(shí)現(xiàn)了三種類型的通知) * */ public class AudienceAdvice implements MethodBeforeAdvice, AfterReturningAdvice, ThrowsAdvice public Audience
53、Advice() Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 / 在方法之前調(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ǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 / 在拋出異常之后執(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ǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 XML配置文件如下: Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 周圍通知周圍通知 v周圍通知相當(dāng)于前通知、返回后通知、拋出后通 知的結(jié)合。 v在Spring里,周圍通知是由AOP Alliance的 MethodInterceptor接口定義的。 v編寫周圍通知的好處: 能以簡(jiǎn)潔的方式在一個(gè)方法里定義前通知和后通 知。 可以檢查和修改被通知方法的返回值。 Spring基礎(chǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 以周圍通知方式定義觀眾通知: 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ǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 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ǔ)與實(shí)踐基礎(chǔ)與實(shí)踐 / injected private Audience audience; public void setAudie
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全生產(chǎn)事故隱患排查治理實(shí)施辦法
- 摩托車的材料選擇與可持續(xù)發(fā)展考核試卷
- 醫(yī)用造口袋的選擇和清潔方法考核試卷
- 企業(yè)文化與組織氛圍培訓(xùn)考核試卷
- 期貨公司周邊道路改造臨時(shí)合同
- 遠(yuǎn)程醫(yī)療解除合同模板
- 傳媒行業(yè)專家聘任協(xié)議
- 女性職場(chǎng)權(quán)益保障策略共促發(fā)展
- 酒店建設(shè)項(xiàng)目授權(quán)委托書模板
- 小型挖掘機(jī)租賃協(xié)議
- 男性早泄的治療專家講座
- 藥物性肝損傷指南
- 《生物化學(xué)》重點(diǎn)講解及習(xí)題(含答案詳解)
- 【企業(yè)招聘管理研究國(guó)內(nèi)外文獻(xiàn)綜述】
- 農(nóng)藥生產(chǎn)企業(yè)安全生產(chǎn)檢查表
- A4橫線稿紙模板(課程作業(yè)專用紙)
- 住宅樓施工組織設(shè)計(jì)畢業(yè)論文
- 大學(xué)生勞動(dòng)教育(高職版)智慧樹(shù)知到答案章節(jié)測(cè)試2023年
- 《等比數(shù)列的通項(xiàng)公式》示范課教案【高中數(shù)學(xué)蘇教版教學(xué)設(shè)計(jì)】
- 愛(ài)國(guó)主義主題班會(huì)
- 電力電子技術(shù)課程設(shè)計(jì)-NE555驅(qū)動(dòng)的BUCK降壓電路
評(píng)論
0/150
提交評(píng)論