版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《spring基礎(chǔ)功能分享》
(HDC)2011-12-151精選2021版課件
Spring是一個(gè)非常優(yōu)秀的開源產(chǎn)品,我記得在04年的時(shí)候,在國(guó)內(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搭檔.
2精選2021版課件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(國(guó)際化)、應(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ù)持久化。3精選2021版課件DI介紹
我們首先來看一個(gè)截圖,搞JAVA開發(fā)的,都非常清楚如下的這個(gè)代碼,這是非常典型的數(shù)據(jù)源配置:這個(gè)代碼其實(shí)包含了2個(gè)概念:1、參數(shù)的注入:比如字符串:java:comp/env/jdbc/sample2、bean之間的依賴注入:<reflocal="dataSource"/>4精選2021版課件
其中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)靈活簡(jiǎn)潔。通過依賴注入機(jī)制,我們只需要通過簡(jiǎn)單的配置,而無需任何代碼就可指定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)境?很簡(jiǎn)單,我們只需要修改dataSource的配置:5精選2021版課件
對(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>測(cè)試類:Useruser=(User)context.getBean("user");(注意,spring不一定要讓你擁有跟配置文件對(duì)應(yīng)的屬性,但一定要擁有配置文件屬性所對(duì)應(yīng)的set方法)6精選2021版課件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è)值注入7精選2021版課件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>8精選2021版課件對(duì)于屬性u(píng)ser的對(duì)象注入,可以通過如下的配置文件來描述:<propertyname=“user”ref=“user”/><!--也可以使用local=“user”不過這樣的話,只能引用本配置文件中的Bean-->測(cè)試代碼: publicstaticvoidmain(String[]args){
ApplicationContextcontext=newClassPathXmlApplicationContext("com/wadata/conf/spring.xml");---1
Useruser=(Student)context.getBean(“user”);---2
System.out.println(user.getList()); System.out.println(user.getSet()); System.out.println(user.getMap()); System.out.println(user.getUser()); }第一行代碼是將配置文件加載。第二行代碼是通過beanID獲得一個(gè)bean實(shí)例。在這里,我介紹一下應(yīng)用程序獲取bean實(shí)例的2種方式:9精選2021版課件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)用代碼。10精選2021版課件下面稍微介紹一下關(guān)于bean的范圍化: 注意到了scope=“singleton”,這是Spring2.0新增的功能,也就是spring范圍化。在Spring2.0+中,默認(rèn)所有的Bean都是單一的,也就是scope=‘singleton’方式。如果是單實(shí)例bean,這里的scope=‘singleton’可以省略不寫。
在2.0之前的版本,只能設(shè)置<bean>的singleton屬性為true或false,不能進(jìn)行更多的擴(kuò)展。以下是Spring2.0+范圍化規(guī)則列表,在開發(fā)時(shí),可供參考:Singleton:定義Bean的范圍為每個(gè)Spring容器一個(gè)實(shí)例,默認(rèn)是這種情況。Prototype:允許Bean可以被多次實(shí)例化(相當(dāng)于new的作用)。Request:定義Bean的范圍是HTTP請(qǐng)求。只有在使用有WEB能力的SPRING上下文(SPRINGMVC)時(shí)才有效。Session:定義Bean的范圍是HTTP請(qǐng)求。只有在使用有WEB能力的SPRING上下文(SPRINGMVC)時(shí)才有效。Global-session:定義Bean的范圍是全局HTTP會(huì)話。只有在portlet上下文中才有效。 總之,對(duì)singleton和prototype的通俗理解可以如下描述: 如果一個(gè)bean是prototype的,并且這個(gè)bean要被注入到其它bean或者你通過getBean這樣的方式獲得這個(gè)bean的時(shí)候,spring容器會(huì)創(chuàng)建一個(gè)新的實(shí)例給你。singleton模式指的是對(duì)某個(gè)對(duì)象的完全共享,包括代碼空間和數(shù)據(jù)空間,也就是說,singleton會(huì)讓所有線程共享他的成員變量。prototype則不會(huì)這樣。此外singleton的生命周期由容器來管理,但是prototype的生命周期得你自己管理。11精選2021版課件
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ù)庫(kù)事務(wù)管理,都會(huì)涉及到AOP的概念和行為。如下就是我們常用的數(shù)據(jù)庫(kù)事務(wù)管理的一個(gè)典型AOP配置。
【題外話:Spring提供的事務(wù)AOP,是從服務(wù)層織入控制的,而不是在DAO層,這個(gè)需要注意?!?/p>
AOP介紹12精選2021版課件在AOP中,有如下幾個(gè)核心的概念:切面(Aspect):用程序簡(jiǎn)單的語言描述,即是需要被管理的類。切面的隔離,降低了耦合性,我們就可以在不同的應(yīng)用中將各個(gè)切面組合使用,從而使得代碼可重用性大大增強(qiáng)。連接點(diǎn)(JoinPoint):程序運(yùn)行過程中的某個(gè)階段點(diǎn)。如某個(gè)方法調(diào)用,或者某個(gè)異常被拋出。處理邏輯(Advice):在某個(gè)連接點(diǎn)所采用的處理邏輯。處理邏輯的調(diào)用模式通常有以下幾種:前三種是我們最常用的調(diào)用模式。Before(之前):僅在連接點(diǎn)之前插入預(yù)處理過程After-returning(返回后)After-throwing(拋出后):在連接點(diǎn)拋出異常時(shí)進(jìn)行異常處理Around(周圍):在連接點(diǎn)前后插入預(yù)處理過程和后處理過程,其相當(dāng)于是前面三種的結(jié)合。在Spring里,周圍通知是由開源項(xiàng)目AOPAlliance提供的MethodInterceptor接口實(shí)現(xiàn).Introduction(引入)切點(diǎn)(PointCut):一系列連接點(diǎn)的集合,它指明處理方式(Advice)將在何時(shí)被觸發(fā)。 在Spring中,對(duì)AOP的支持都是基于代理的。代理類封裝了目標(biāo)BEAN,截取被通知的方法調(diào)用,再把這些調(diào)用轉(zhuǎn)發(fā)到真正的目標(biāo)BEAN。如何來理解這句話呢?Spring生成代理類的方式有2種,如果目標(biāo)BEAN實(shí)現(xiàn)的是一個(gè)接口,SPRING會(huì)使用JDK的java.lang.reflect.Proxy類,它允許Spring動(dòng)態(tài)生成一個(gè)新類來實(shí)現(xiàn)必要的接口、織入任何通知、并且把對(duì)這些接口的任何調(diào)用都轉(zhuǎn)發(fā)到目標(biāo)類。如果目標(biāo)類不是實(shí)現(xiàn)一個(gè)接口,Spring就使用CGLIB庫(kù)生成目標(biāo)類的一個(gè)子類。在創(chuàng)建這個(gè)子類時(shí),Spring織入通知,并且把對(duì)子類的調(diào)用委托到目標(biāo)類。
這里需要注意,被標(biāo)識(shí)為final的方法是不能被通知的。因?yàn)镾pring為目標(biāo)類創(chuàng)建一個(gè)子類,需要被通知的任何方法都會(huì)被覆蓋并被織入通知,這對(duì)final類型的方法是不可能的。 以上這些純粹的語言描述,很難讓人理解和信服。接下來,我們通過一個(gè)實(shí)際的例子,來說明AOP強(qiáng)大的功能。
【剛好在設(shè)計(jì)RHM3的功能:表單操作日志功能設(shè)計(jì)方案,里面恰巧要用AOP】13精選2021版課件14精選2021版課件
我們現(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í)例?!?5精選2021版課件16精選2021版課件 眾所周知,在接大多數(shù)應(yīng)用開發(fā)中,都脫離不了數(shù)據(jù)庫(kù)概念。數(shù)據(jù)庫(kù)持久化技術(shù),是一個(gè)非常常見且常用的一個(gè)技術(shù)話題,在早期開發(fā)的代碼中【沒有spring框架提供】,如下的代碼片段是我們非常熟悉的:數(shù)據(jù)庫(kù)持久化介紹17精選2021版課件 上面的代碼,大致實(shí)現(xiàn)了數(shù)據(jù)庫(kù)一條實(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ù)庫(kù)訪問的地方)重復(fù)出現(xiàn)。于是,大家開始尋找一些設(shè)計(jì)模式以改進(jìn)如此的設(shè)計(jì),Template模式的應(yīng)用是其中一種典型的改進(jìn)方案:讓公用代碼盡可能抽取,開發(fā)者只關(guān)心自己業(yè)務(wù)有關(guān)的SQL編寫。比如,可以將如上的代碼精簡(jiǎn)到如下這2行: 這就是spring帶給我們的好處。 Spring提供了一組數(shù)據(jù)訪問框架,集成了多種數(shù)據(jù)訪問技術(shù),用戶可以靈活選擇JDBC、Hibernate、JPA、iBatis等任意一個(gè)持久化框架,實(shí)現(xiàn)數(shù)據(jù)庫(kù)的訪問。選擇Spring提供的模板技術(shù),可以讓開發(fā)者消除數(shù)據(jù)持久化代碼中的麻煩,特別是在事物控制時(shí),使用這樣的模板,會(huì)帶給開發(fā)者事半功倍的效果。首先,我們就來看看Spring給我們提供的多個(gè)數(shù)據(jù)庫(kù)訪問模板,分別適用于不同的持久化機(jī)制。
注意:綠色背景是我們開發(fā)中常用的一些模板類。18精選2021版課件19精選2021版課件 使用如上的模板,我們只需要在Spring上下文里配置相應(yīng)的dataSource的Bean,然后把它織入到程序的DAO層即可?!净仡橠I介紹章節(jié)中的例子】
20精選2021版課件這樣,以JDBC模板為例,在我們的DAO實(shí)現(xiàn)類中:SampleDAO,核心的代碼如下:publicclassSampleDAOimplementSampleDaoService{ ……privateDataSourcedataSource;publicvoidset
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國(guó)cdn服務(wù)行業(yè)運(yùn)營(yíng)模式及發(fā)展戰(zhàn)略分析報(bào)告權(quán)威版
- 2024-2030年“一帶一路”背景下中國(guó)南珠層粉產(chǎn)業(yè)未來發(fā)展趨勢(shì)及投資策略分析報(bào)告
- 江蘇大學(xué)《工程圖學(xué)》2021-2022學(xué)年第一學(xué)期期末試卷
- 土方倒運(yùn)的方案
- 智慧旅游行業(yè)解決方案開發(fā)合同
- 企業(yè)數(shù)字化人才培訓(xùn)體系建設(shè)方案
- 交通運(yùn)輸行業(yè)智能交通管理與安全技術(shù)方案
- 招標(biāo)項(xiàng)目方案典范
- 第十五章《電功和電熱》復(fù)習(xí)課教案
- 掌控失業(yè)保險(xiǎn):策略與影響-公司財(cái)務(wù)風(fēng)險(xiǎn)有效控制
- 網(wǎng)站服務(wù)合同域名續(xù)費(fèi)與維護(hù)
- 單喇叭互通立交設(shè)計(jì)主要技術(shù)問題分析
- 實(shí)驗(yàn)幼兒園陪餐記錄表
- 燈具材料樣本確認(rèn)單
- 《鉗工技能訓(xùn)練》實(shí)訓(xùn)教案
- 新加坡科技創(chuàng)新體系架構(gòu)及對(duì)我市科技發(fā)展的啟示
- 中國(guó)卡丁車錦標(biāo)賽暨中國(guó)青少年卡丁車錦標(biāo)賽【比賽規(guī)則】
- 安全教育培訓(xùn)記錄運(yùn)輸車輛安全技術(shù)要求
- Minitab操作教程
- 巖漿礦床實(shí)習(xí)報(bào)告(四川攀枝花釩鈦磁鐵礦礦床)
- 燃?xì)夤艿?流量-流速-口徑計(jì)算公式
評(píng)論
0/150
提交評(píng)論