spring基礎(chǔ)功能分享課件_第1頁
spring基礎(chǔ)功能分享課件_第2頁
spring基礎(chǔ)功能分享課件_第3頁
spring基礎(chǔ)功能分享課件_第4頁
spring基礎(chǔ)功能分享課件_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

《spring基礎(chǔ)功能分享》

(HDC)2011-12-15

Spring是一個(gè)非常優(yōu)秀的開源產(chǎn)品,我記得在04年的時(shí)候,在國內(nèi)突然冒出很多可供JAVA開發(fā)者使用的優(yōu)秀開源產(chǎn)品,比如webwork,struts,spring,ibatis,hibernate等等,到現(xiàn)在為止,這些開源產(chǎn)品的版本都算比較穩(wěn)定了。很多現(xiàn)有的開源產(chǎn)品,或則剛誕生和發(fā)展起來的開源產(chǎn)品,幾乎每一款都能兼容Spring,或則和Spring搭檔.

Spring提供的內(nèi)容很廣,某些章節(jié)的內(nèi)容也很深,一般來講,它包括有如下的這些模塊構(gòu)成:1、核心容器:Spring核心容器為Spring框架提供了基礎(chǔ)功能,在這里,查看源碼,你會(huì)發(fā)現(xiàn)有一個(gè)特別的類:BeanFactory,它是最基本的Spring容器和DI所依賴的基礎(chǔ)。2、ApplicationContext(應(yīng)用上下文)模塊:他是建立在核心容器之上。這個(gè)應(yīng)用上下文擴(kuò)展了BeanFactory類,添加了一些別的應(yīng)用支持,比如I18N(國際化)、應(yīng)用生命周期事件(比如BeanPostPorcessor接口)等。3、AOP模塊:與DI一樣,它支持應(yīng)用對(duì)象之間的松耦合,也是我們開發(fā)程序時(shí)一直追求的方式。4、JDBC抽象及DAO模塊:jdbcTemplete模板5、ORM映射集成模塊:支持hibernate,jpa,ibatis等框架的持久化模板6、SpringMVC框架:類似于STRUTS\WEBWORK框架,擁有(model/view/controller)7、SpringPortletMVC8、SpringWeb模塊9、遠(yuǎn)程調(diào)用,包括RMI,Hessian,Webservice等10、JAVA消息服務(wù),支持很多開源消息產(chǎn)品,比如apacheactiveMQ,MuleESB,JbossMQ等。11、。。。。。。今天,我們就挑選Spring在我們的應(yīng)用開發(fā)中最常被使用的模塊來講解一下:DI和AOP,數(shù)據(jù)持久化。

其中SampleDAO中的dataSource將由容器在運(yùn)行期動(dòng)態(tài)注入,而DataSource的具體配置和初始化工作也將由容器在運(yùn)行期完成。對(duì)比傳統(tǒng)的實(shí)現(xiàn)方式(如通過編碼初始化DataSource實(shí)例),我們可以看到,基于依賴注入的系統(tǒng)實(shí)現(xiàn)相當(dāng)靈活簡潔。通過依賴注入機(jī)制,我們只需要通過簡單的配置,而無需任何代碼就可指定SampleDAO中所需的DataSource實(shí)例。上面的實(shí)例中,我們假設(shè)SampleDAO是一個(gè)運(yùn)行在J2EE容器中的組件(如Weblogic)。在運(yùn)行期,通過JNDI從容器中獲取DataSource實(shí)例?,F(xiàn)在假設(shè)我們的部署環(huán)境發(fā)生了變化,系統(tǒng)需要脫離應(yīng)用服務(wù)器獨(dú)立運(yùn)行,這樣,由于失去了容器的支持,原本通過JNDI獲取DataSource的方式不再有效。我們需要如何修改以適應(yīng)新的系統(tǒng)環(huán)境?很簡單,我們只需要修改dataSource的配置:

對(duì)于DI,常見的有如下幾種:1、基本數(shù)據(jù)類型的set方法注入:publicclassUser{ privateintuserid; privateStringusername; privateStringpassword;

//為這些屬性添加相應(yīng)的getter和setter}配置文件:<beanid="user"class="com.wadata.inject.User"> <propertyname="userid"value="1"></property> <propertyname="password"value="pass_word"></property> <propertyname="username"value="tom"></property></bean>測試類:Useruser=(User)context.getBean("user");(注意,spring不一定要讓你擁有跟配置文件對(duì)應(yīng)的屬性,但一定要擁有配置文件屬性所對(duì)應(yīng)的set方法)2、基本數(shù)據(jù)類型的構(gòu)造器注入(構(gòu)造方法):為剛才的User添加一個(gè)構(gòu)造方法 publicUser(Stringusername,Stringpassword){ this.username=username; this.password=password; }配置文件:<beanid=“user”class=“com.wadata.inject.User”> <constructor-argvalue="tom"></constructor-arg> <constructor-argvalue="pass_word"></constructor-arg></bean>當(dāng)然,你也可以如下嚴(yán)格定義參數(shù)類型:<constructor-argvalue="tom"type="String"index=“0"></constructor-arg>這個(gè)意思就是構(gòu)造函數(shù)中,第一個(gè)參數(shù)值類型是String,值為tom,并且是構(gòu)造函數(shù)第一個(gè)參數(shù)設(shè)值注入3、特殊類型的注入,比如Set,List,Map等數(shù)組的值注入:publicclassUser{ privateSetset; privateListlist; privateMapmap; privateUseruser; //添加相應(yīng)的set,get方法}配置文件如下所示:Set的注入:<propertyname="set"> <set> <value>setvalue1</value> </set></property>List的注入:<propertyname="list"> <list> <value>listvalue1</value> </list></property>Map的注入:<propertyname="map"> <map> <entrykey="key2"value="value2"></entry> </map></property>1、單實(shí)例的BEAN延遲加載方式:ApplicationContextcontext=newClassPathXmlApplicationContext("

com/wadata/conf/spring.xml"); Useruser=(User)context.getBean(“user”); Bean配置信息通過ClassPathXmlApplicationContext(“com/wadata/conf/spring.xml”)加載進(jìn)來,然后通過getBean(“user”)獲取相應(yīng)的bean實(shí)例。注意,單實(shí)例的bean,通過getBean()方式是延遲加載的。2、通過容器管理了的應(yīng)用上下文:對(duì)于單實(shí)例Bean,應(yīng)用上下文啟動(dòng)后會(huì)預(yù)載入所有的單實(shí)例bean。當(dāng)應(yīng)用程序需要這些單實(shí)例bean的時(shí)候,直接獲取了,不需要等待他們被創(chuàng)建。 由于極大多數(shù)應(yīng)用用到的bean都是單實(shí)例的,因此,spring也建議使用applicationContext來獲取bean實(shí)例,而不是通過getBean()的方式獲取。另外一點(diǎn),通過getBean()的方式,無形中增加了系統(tǒng)之間的耦合性,萬一beanID發(fā)生了改變呢?這樣你就需要修改你的應(yīng)用代碼。

AspectOrientedProgramming(AOP)是近來非常熱門的一個(gè)話題。AOP,很多都譯作“面向方面編程”。其實(shí),譯成“面向切面編程”更來得合適,AOP的本意,是在針對(duì)業(yè)務(wù)處理過程中的切面進(jìn)行切入、提取,它所面對(duì)的是處理過程中的某個(gè)步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果,使之真正意義上做到對(duì)象或?qū)ο笾g的耦合。 在我們開發(fā)基于WEB的JAVA應(yīng)用中,AOP隨處可見,比如我們常用的權(quán)限管理,登錄用戶的session是否超時(shí)判斷,還有大家時(shí)常會(huì)碰到的數(shù)據(jù)庫事務(wù)管理,都會(huì)涉及到AOP的概念和行為。如下就是我們常用的數(shù)據(jù)庫事務(wù)管理的一個(gè)典型AOP配置。

【題外話:Spring提供的事務(wù)AOP,是從服務(wù)層織入控制的,而不是在DAO層,這個(gè)需要注意?!?/p>

AOP介紹

我們現(xiàn)在就來看看AopImpl這個(gè)類,這是個(gè)純POJO,可以發(fā)現(xiàn),這個(gè)類并沒有和任何的業(yè)務(wù)對(duì)象進(jìn)行綁定,最多也只是通過DI的形式,注入了一些所需要的bean。但通過以上的配置,這個(gè)類卻可以在正確的時(shí)間,做正確的事情。

【這里也可以發(fā)現(xiàn),我并沒有通過Context.getBean(“beanID”)來獲取相應(yīng)的bean實(shí)例?!?眾所周知,在接大多數(shù)應(yīng)用開發(fā)中,都脫離不了數(shù)據(jù)庫概念。數(shù)據(jù)庫持久化技術(shù),是一個(gè)非常常見且常用的一個(gè)技術(shù)話題,在早期開發(fā)的代碼中【沒有spring框架提供】,如下的代碼片段是我們非常熟悉的:數(shù)據(jù)庫持久化介紹 上面的代碼,大致實(shí)現(xiàn)了數(shù)據(jù)庫一條實(shí)體記錄的修改。通過對(duì)如上代碼的分析,發(fā)現(xiàn)一個(gè)現(xiàn)象:為了執(zhí)行一個(gè)SQL語句【stmt.executeUpdate(“UPDATEuserSETage=18WHEREid=‘erica’”);】,我們必須編寫其余可以重復(fù)、且和業(yè)務(wù)無關(guān)的代碼,并且,這樣的代碼還會(huì)在系統(tǒng)其他地方(也許是每個(gè)需要數(shù)據(jù)庫訪問的地方)重復(fù)出現(xiàn)。于是,大家開始尋找一些設(shè)計(jì)模式以改進(jìn)如此的設(shè)計(jì),Template模式的應(yīng)用是其中一種典型的改進(jìn)方案:讓公用代碼盡可能抽取,開發(fā)者只關(guān)心自己業(yè)務(wù)有關(guān)的SQL編寫。比如,可以將如上的代碼精簡到如下這2行: 這就是spring帶給我們的好處。 Spring提供了一組數(shù)據(jù)訪問框架,集成了多種數(shù)據(jù)訪問技術(shù),用戶可以靈活選擇JDBC、Hibernate、JPA、iBatis等任意一個(gè)持久化框架,實(shí)現(xiàn)數(shù)據(jù)庫的訪問。選擇Spring提供的模板技術(shù),可以讓開發(fā)者消除數(shù)據(jù)持久化代碼中的麻煩,特別是在事物控制時(shí),使用這樣的模板,會(huì)帶給開發(fā)者事半功倍的效果。首先,我們就來看看Spring給我們提供的多個(gè)數(shù)據(jù)庫訪問模板,分別適用于不同的持久化機(jī)制。

注意:綠色背景是我們開發(fā)中常用的一些模板類。 使用如上的模板,我們只需要在Spring上下文里配置相應(yīng)的dataSource的Bean,然后把它織入到程序的DAO層即可?!净仡橠I介紹章節(jié)中的例子】

這樣,以JDBC模板為例,在我們的DAO實(shí)現(xiàn)類中:SampleDAO,核心的代碼如下:publicclassSampleDAOimplementSampleDaoService{ ……privateDataSourcedataSource;publicvoidsetDataSource(DataSourcedataSource){ this.dataSource=dataSource;}//業(yè)務(wù)方法publicvoidinsertUser(RegisterInforegInfo){ JdbcTemplatejt=newJdbcTemplate(dataSource); jt.update("insertintousers(username)values(‘tester');");}……} 雖然直接織入模板很不錯(cuò),很傳統(tǒng)的JDBC代碼相比,已經(jīng)大大減少了代碼量。但是,Spring提供了比如上更方便的一組DAO基類,可以用于管理模板:這樣,以JDBC模板為例,在我們的DAO實(shí)現(xiàn)類中:SampleDAO,核心的代碼如下:publicclassSampleDAOextendsJdbcDaoSupportimplementSampleDaoService{ ……//業(yè)務(wù)方法publicvoidinsertUser(RegisterInfore

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論