版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
SpringLearnmore.
本章概要Spring簡介Spring入門SpringAOPSpring整合Struts2SSH框架整合(Maven)Spring簡介對于面對對象編程語言來說,實現(xiàn)一個復(fù)雜的功能離不開對象之間的互相調(diào)用,在調(diào)用之前,我們必須知道,
你將要創(chuàng)建哪個類的對象,然后使用new關(guān)鍵字來創(chuàng)建這個類的對象。隨著項目的推進(jìn),有些業(yè)務(wù)的具體邏輯
可能會發(fā)生變化,這個時候,我們得找出具體的業(yè)務(wù)邏輯類并修改類的實現(xiàn)。為了讓程序擴(kuò)展性更強(qiáng),有前輩
提出每個業(yè)務(wù)功能都以接口的形式提供出去,然后通過不同的實現(xiàn)類實現(xiàn)不同的邏輯。這確實是一個不錯的方案,
但是等項目越來越大,我們會發(fā)覺仍然難以管理越來越多的接口和實現(xiàn)類,這時候,spring閃亮登場。
Spring簡介
Spring是一款開源的,輕量級的開發(fā)框架,它通過配置或者注解的形式來管理不同模塊代碼之間的依賴關(guān)系。在設(shè)計業(yè)務(wù)層時,首先會定義業(yè)務(wù)接口,然后實現(xiàn)這個接口,并在xml文件里(或使用注解)配置實現(xiàn)類。假如某個模塊需要使用這個接口,直接配置此接口實現(xiàn)類的引用即可,至于對象的裝配過程,并不是我們關(guān)心的事情,這樣就是Spring依賴注入的設(shè)計思想。
Spring概念
依賴注入:(DependencyInjection),簡稱DI,某組件(類)在實現(xiàn)一
個具體功能的時候需要依賴另外一個組件(類)的功能,被依賴的組件(類)是需要預(yù)先注入值的。
控制反轉(zhuǎn)
(InversionofControl),簡稱IOC,意思就是把模塊間的依賴關(guān)系交給Spring容器處理
Spring簡介Spring能夠做的遠(yuǎn)不止這些。通過依賴注入的方式,Spring可以動態(tài)的給我們的類實現(xiàn)代理的功能,即它可以捕獲到某些方法的調(diào)用,并在調(diào)用前后加上一些相應(yīng)功能的代碼,比如說事務(wù)處理,日志功能,性能統(tǒng)計,安全(權(quán)限)控制等。這種方式稱為AOP,即切面編程,AOP可以看做對OOP的升級。
在實際項目中,事務(wù)功能幾乎是企業(yè)及開發(fā)的必備。而這一切,都可以通過簡單的配置即可實現(xiàn)。
另外,目前Spring支持非常多第三方有用的組件,可以使我們的程序如虎添翼。
Spring入門Spring搭建方式大致有如下幾種:
1,下載Spring源碼包,里面附帶所有源碼,依賴包,文檔,以及示例
程序2,直接通過IDE(比如MyEclipse)直接導(dǎo)入Spring3,采用Maven等項目構(gòu)建工具搭建(以后將會學(xué)習(xí))
本章暫時采用第2種方式講解首先新建一個項目,然后點擊右鍵,選擇Add-Spring-Capabilities選擇把包copy到自己的lib下,選擇下一步,F(xiàn)inish。新建一個bean(bean:實現(xiàn)某個功能的類)在上一步建完之后,工具會自動在src下建立一個applicationContext.xml的配置文件,這個文件就是整個Spring的配置文件。然后我們新建一個UserService接口,模擬對員工的添加操作。
publicinterfaceUserService{publicvoidsave();}然后創(chuàng)建一個此接口的實現(xiàn)類:publicclassUserServiceImplimplementsUserService{publicvoidsave(){System.out.println("新增員工");}}在applicationContext.xml中配置bean<beanid="userService"class="service.UserServiceImpl"></bean>Id是唯一標(biāo)識,class需要給定接口實現(xiàn)類(注意不是接口)Spring通過一個bean的工廠來得到相應(yīng)的bean對象,所以在得到bean對象之前,我們需要先得到這個bean工廠,而這個工廠的創(chuàng)建又依賴于配置文件。配置文件放在src下,最后會被編譯到classes文件夾,我們可以通過ClassPathXmlApplicationContext對象構(gòu)建這個工廠:BeanFactorybeanFactory=newClassPathXmlApplicationContext("applicationContext.xml");然后得到這個UserService實現(xiàn)類對象:UserServiceuserService=(UserService)beanFactory.getBean("userService");最后,調(diào)用接口方法:userService.save();在applicationContext.xml中配置bean之前只需要寫兩行代碼就可以調(diào)用一個對象的方法,而現(xiàn)在還得通過配置文件得到某個對象并調(diào)用方法,似乎有點大炮打蚊子的感覺,實際上,編寫一款架構(gòu)良好的軟件程序往往在開頭是比較繁瑣的,一旦架子搭建完畢,隨著項目的推薦,這種架構(gòu)會給你帶來諸多便利之處,俗話說:磨刀不誤砍柴工,就是說的這個道理。那么這樣做能帶來哪些便利呢?比如說,現(xiàn)在員工管理的業(yè)務(wù)邏輯改了,插入時需要做另外的操作,那么我們可以重新新建一個UserService的實現(xiàn)類,然后配置到applicationContext.xml文件就夠了。為什么要“大炮打蚊子”?依賴配置spring最強(qiáng)大的功能就是依賴注入功能,什么叫依賴?
實現(xiàn)某個功能所需要引入的外部的API(接口,類)就叫做一種依賴,簡單來說:在A類中,需要調(diào)用B類對象的某個方法來完成某種功能,那么A就依賴于B。
示例配置:
<!--配置MainService的實現(xiàn)類--><beanid="mainService"class="service.MainServiceImpl">
<!--注入類的userService屬性,這個屬性是一個引用,引用的是上面定義的beanid-->
<propertyname="userService"ref="uservice1"></property></bean>
依賴配置bean的作用域
spring提供"singleton"和"prototype"兩種基本的作用域:singleton表示該bean是單例的,也就是說在整個web環(huán)境下是唯一的實例;
prototype表示每次使用該bean時都會生成一個新的對象。spring中配置的bean默認(rèn)是singleton的。
我們比較一下先后兩次得到的同一個bean對象:
MainServicemainService=(MainService)beanFactory.getBean("mainService");
MainServicemainService1=(MainService)beanFactory.getBean("mainService");
System.out.println(mainService==mainService1);
結(jié)果會打?。簍rue,表示這兩個對象確實是同一個
假如說在MainService實現(xiàn)類的配置中加一個scope="prototype",那么結(jié)果會打印false,說明每次得到的bean對象都是新建的。分模塊配置文件當(dāng)bean的配置越來越多,applicationContext.xml文件會越來越大。所有的bean都配置在一個地方不僅不利于協(xié)作開發(fā),而且在準(zhǔn)備修改某個模塊的功能時非常不容易找出來,此時我們可以考慮根據(jù)模塊劃分,把不同模塊的bean配置在不同的xml文件里面。
比如在上面的例子中,我們可以新建一個用戶模塊專屬的配置文件,取名userContext.xml,然后在這個文件里配置bean,并在applicationContext.xml中引入這個配置文件:
<importresource="userContext.xml"/>SpringAOP
AOP:面向切面編程,在不侵入源碼的情況下對某些方法進(jìn)行功能加強(qiáng)的一種技術(shù)(思想)。
考慮一下如下場景:在對數(shù)據(jù)庫進(jìn)行操作時,我們往往需要在調(diào)用方法時進(jìn)行一些日志的記錄,比如說某人在某時新增了一條數(shù)據(jù)。。。
按照傳統(tǒng)的做法,我們必須在插入數(shù)據(jù)的方法體內(nèi)加上一些log的操作:
publicvoidsave(Useruser){
System.out.println("準(zhǔn)備執(zhí)行用戶的新增"+user.getName);
...
session.save(user);
...
System.out.println("執(zhí)行完畢");
}
這樣的確能實現(xiàn)日志記錄的功能,但是缺點非常明顯:需要在具體的方法體內(nèi)嵌入一些日志打印的代碼,假如以后要修改日志記錄的具體信息或者撤掉日志記錄的功能
,就需要找到所有具有日志打印的方法一個個進(jìn)行修改或者刪除。
Spring的AOP通過攔截具體的方法點來實現(xiàn)方法前后加入代碼的功能,它不需要直接嵌入到某個方法內(nèi),以后要修改這些增強(qiáng)功能只需要在一個地方做修改就可以了。SpringAOP實現(xiàn)在使用SpringAOP時需要先搞清楚幾個概念:切入點,通知,切面。
切入點:pointcut,表示需要被加強(qiáng)功能的所有方法,它是使用一個表達(dá)式來描述方法的選擇規(guī)則。
通知:表示在切入點的方法執(zhí)行,常用的有前置通知(前面調(diào)用),后置通知(后面調(diào)用)
切面:aspect,也稱作方面,它里面可以有多個切入點和通知下面看看,怎樣使用Spring完成AOP的功能。首先創(chuàng)建一個project,導(dǎo)入Spring時,需要勾選AOP的包
首先創(chuàng)建一個project,導(dǎo)入Spring時,需要勾選AOP的包創(chuàng)建一個UserService接口,這個接口有兩個方法:
publicinterfaceUserService{publicvoidsave();publicvoidupdate();
}
然后新建一個實現(xiàn)類:
publicclassUserServiceImplimplementsUserService{@Overridepublicvoidsave(){System.out.println("新增員工");}@Overridepublicvoidupdate(){System.out.println("修改員工");}
}
假如我們現(xiàn)在這個接口的方法前后調(diào)用相應(yīng)的代碼,那么就得新建一個切面類:
publicclassUserServiceAspect{publicvoidbeforeCall(){System.out.println("方法前調(diào)用");}publicvoidafterCall(){System.out.println("方法后調(diào)用");}}配置業(yè)務(wù)bean和切面類:
<beanid="userService"class="service.UserServiceImpl"></bean>
<beanid="userServiceAspect"class="aspectpkg.UserServiceAspect"></bean>到目前為止,我們只是按照最常規(guī)的方式把它們配置成bean,假如要使用aop,則需要把配置文件的schema加上aop
完整的頭部如下:
<beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:p="/schema/p"xmlns:aop="/schema/aop"
xsi:schemaLocation="/schema/beans
/schema/beans/spring-beans-3.0.xsd
/schema/aop
/schema/aop/spring-aop-3.0.xsd">
然后aop:
<aop:config>
<!--切入點,攔截哪些方法-->
<aop:pointcutid="pointcut1"expression="execution(*service..*.*(..))"/><!--切面--><aop:aspectref="userServiceAspect">
<aop:beforepointcut-ref="pointcut1"method="beforeCall"/>
<aop:afterpointcut="execution(*service..*.*(..))"method="afterCall"/></aop:aspect></aop:config>
首先,aop的配置需要<aop:config>這個標(biāo)簽包起來;
<aop:pointcut>聲明了一個切入點,expression是一個切入點選擇的表達(dá)式,其實就是找出所有滿足這個表達(dá)式的方法。
expression語法詳解:
第一個星號表示返回所有類型,假如是int,那么只會選擇返回類型是int值的方法;
后面是跟的包名,包名后面的兩點表示這個包以及子包;
第二個星號表示匹配包下所有類;
第三個星號表示匹配所有方法名,假如改成save*,就表示匹配所有以save開頭的方法名
(..)表示任何參數(shù)的方法定義切面的節(jié)點是<aop:aspect>,ref屬性引用的就是之前定義的切面類。
<aop:before>是前置通知,pointcut-ref引用的是上面聲明過的切入點pointcut1,method就是切面類中的方法,
這表示切面類userServiceAspect會在切入點方法調(diào)用之前調(diào)用beforeCall方法;
<aop:after>是后置通知,這個里面沒有使用pointcut-ref來引入切入點,而是直接使用pointcut屬性來定義切入點,
這是沒問題的,當(dāng)然這里也可以使用pointcut-ref來引入公共的pointcut配置。這個節(jié)點表示切面類userServiceAspect類會在
切入點方法的后面調(diào)用Spring整合Struts2Struts2是一個基于MVC的web框架,本身可以獨立使用,僅僅需要在web.xml里面配置攔截url的過濾器和struts*.xml中配置Action的具體類,在具體的Action類里面,就可以調(diào)用Service層的業(yè)務(wù)方法,而Service層就可以調(diào)用持久層(Hibernate,MyBatis)等數(shù)據(jù)操作的API
Spring是一個基于IOC的組件工廠,它本身作用不大,但是可以管理不同組件(API,類,接口)之間的依賴關(guān)系,比如說Action跟Service的依賴,Service跟持久層(或者DAO層)的依賴等。
那么我們可以讓Spring來接管Struts2的Action,以達(dá)到最終管理整個Struts周邊組件依賴的目的。Spring需要怎樣和Struts2配合使用?Spring整合Struts2首先新建一個webproject,然后分別導(dǎo)入spring包和struts包。
spring包可以去/下載
struts包可以去
/
下載然后在項目中導(dǎo)入相關(guān)依賴包。導(dǎo)入之后,在src下建立struts.xml,applicationContext.xml文件,留待后面配置這兩個框架。Spring整合Struts2在web.xml中配置spring和struts
<context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:/applicationContext.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>*.action</url-pattern></filter-mapping>Spring整合Struts2把Struts的Action配置到Spring假如要讓Struts的Action納入到Spring的管理,必須在struts.xml文件中配置:
<constantname="struts.objectFactory"
value="org.apache.struts2.spring.StrutsSpringObjectFactory"></constant>
這是配置了一個ObjectFactory,也就是對象工廠,表示Action由這些工廠幫我們創(chuàng)建。
配置<action>節(jié)點也與之前不太一樣,特別是class屬性,就不再是Action類的全路徑,而是配置在Spring中的bean。SSH框架整合(Maven)Spring整合hibernate的核心是配置sessionFactory以及事務(wù)處理,在配置這些之前,需要把命名空間加上<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:p="/schema/p"xmlns:aop="/schema/aop"xmlns:tx="/schema/tx"xsi:schemaLocation="
/schema/beans
/schema/beans/spring-beans-3.0.xsd
/schema/aop
/schema/aop/spring-aop-3.0.xsd
/schema/tx
/schema/tx/spring-tx-3.0.xsd">配置SessionFactory<!--HibernateSession工廠--><beanid="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<propertyname="configLocation"value="classpath:hibernate.cfg.xml"></property></bean>配置事務(wù)<!--Hibernate事務(wù)處理器--><beanid="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"><propertyname="sessionFactory"ref="sessionFactory"></property></bean><!--配置事務(wù)傳播特性--><tx:adviceid="txAdvice"transaction-manager="transactionManager"><tx:attributes><tx:methodname="save*"propagation="REQUIRED"/
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 一次性竹制餐具供貨與可持續(xù)資源開發(fā)合同2篇
- 幼兒園教研工作制度模版(2篇)
- 人力資源助理的工作職責(zé)(2篇)
- 2025年小學(xué)班主任德育計劃例文(2篇)
- 幼兒園幼兒膳食管理制度范文(2篇)
- 2025年英語教師工作計劃模版(3篇)
- 夏季汛期安全工作方案(2篇)
- 教職工上下班工作制度(2篇)
- 二零二五年度快遞代理權(quán)轉(zhuǎn)讓與業(yè)績考核合同范本3篇
- 2025年幼兒園衛(wèi)生保健工作計劃例文(二篇)
- 學(xué)校信息中心述職報告(共3篇)
- 小說與散文的區(qū)別課件
- 景德鎮(zhèn)綠地昌南里項目視頻討論會ua根據(jù)0108意見修改
- 豆腐的制作工藝及配方
- DB-T 29-202-2022 天津市建筑基坑工程技術(shù)規(guī)程
- 福建省社會體育指導(dǎo)員信息表
- DB51∕T 5060-2013 四川省預(yù)拌砂漿生產(chǎn)與應(yīng)用技術(shù)規(guī)程
- 珠心算習(xí)題匯總(可以打印版A4)
- 設(shè)備潤滑注油周期表.doc
- 醫(yī)用紅外熱像儀
- 有限空間作業(yè)應(yīng)急預(yù)案及現(xiàn)場處置方案
評論
0/150
提交評論