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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

《spring基礎功能分享》

(HDC)2011-12-15

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

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

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

//為這些屬性添加相應的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不一定要讓你擁有跟配置文件對應的屬性,但一定要擁有配置文件屬性所對應的set方法)2、基本數(shù)據(jù)類型的構造器注入(構造方法):為剛才的User添加一個構造方法 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>當然,你也可以如下嚴格定義參數(shù)類型:<constructor-argvalue="tom"type="String"index=“0"></constructor-arg>這個意思就是構造函數(shù)中,第一個參數(shù)值類型是String,值為tom,并且是構造函數(shù)第一個參數(shù)設值注入3、特殊類型的注入,比如Set,List,Map等數(shù)組的值注入:publicclassUser{ privateSetset; privateListlist; privateMapmap; privateUseruser; //添加相應的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、單實例的BEAN延遲加載方式:ApplicationContextcontext=newClassPathXmlApplicationContext("

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

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

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

AOP介紹

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

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

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

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

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論