




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
SpringLearnmore.
本章概要Spring簡介Spring入門SpringAOPSpring整合Struts2SSH框架整合(Maven)Spring簡介對于面對對象編程語言來說,實(shí)現(xiàn)一個(gè)復(fù)雜的功能離不開對象之間的互相調(diào)用,在調(diào)用之前,我們必須知道,
你將要?jiǎng)?chuàng)建哪個(gè)類的對象,然后使用new關(guān)鍵字來創(chuàng)建這個(gè)類的對象。隨著項(xiàng)目的推進(jìn),有些業(yè)務(wù)的具體邏輯
可能會發(fā)生變化,這個(gè)時(shí)候,我們得找出具體的業(yè)務(wù)邏輯類并修改類的實(shí)現(xiàn)。為了讓程序擴(kuò)展性更強(qiáng),有前輩
提出每個(gè)業(yè)務(wù)功能都以接口的形式提供出去,然后通過不同的實(shí)現(xiàn)類實(shí)現(xiàn)不同的邏輯。這確實(shí)是一個(gè)不錯(cuò)的方案,
但是等項(xiàng)目越來越大,我們會發(fā)覺仍然難以管理越來越多的接口和實(shí)現(xiàn)類,這時(shí)候,spring閃亮登場。
Spring簡介
Spring是一款開源的,輕量級的開發(fā)框架,它通過配置或者注解的形式來管理不同模塊代碼之間的依賴關(guān)系。在設(shè)計(jì)業(yè)務(wù)層時(shí),首先會定義業(yè)務(wù)接口,然后實(shí)現(xiàn)這個(gè)接口,并在xml文件里(或使用注解)配置實(shí)現(xiàn)類。假如某個(gè)模塊需要使用這個(gè)接口,直接配置此接口實(shí)現(xiàn)類的引用即可,至于對象的裝配過程,并不是我們關(guān)心的事情,這樣就是Spring依賴注入的設(shè)計(jì)思想。
Spring概念
依賴注入:(DependencyInjection),簡稱DI,某組件(類)在實(shí)現(xiàn)一
個(gè)具體功能的時(shí)候需要依賴另外一個(gè)組件(類)的功能,被依賴的組件(類)是需要預(yù)先注入值的。
控制反轉(zhuǎn)
(InversionofControl),簡稱IOC,意思就是把模塊間的依賴關(guān)系交給Spring容器處理
Spring簡介Spring能夠做的遠(yuǎn)不止這些。通過依賴注入的方式,Spring可以動態(tài)的給我們的類實(shí)現(xiàn)代理的功能,即它可以捕獲到某些方法的調(diào)用,并在調(diào)用前后加上一些相應(yīng)功能的代碼,比如說事務(wù)處理,日志功能,性能統(tǒng)計(jì),安全(權(quán)限)控制等。這種方式稱為AOP,即切面編程,AOP可以看做對OOP的升級。
在實(shí)際項(xiàng)目中,事務(wù)功能幾乎是企業(yè)及開發(fā)的必備。而這一切,都可以通過簡單的配置即可實(shí)現(xiàn)。
另外,目前Spring支持非常多第三方有用的組件,可以使我們的程序如虎添翼。
Spring入門Spring搭建方式大致有如下幾種:
1,下載Spring源碼包,里面附帶所有源碼,依賴包,文檔,以及示例
程序2,直接通過IDE(比如MyEclipse)直接導(dǎo)入Spring3,采用Maven等項(xiàng)目構(gòu)建工具搭建(以后將會學(xué)習(xí))
本章暫時(shí)采用第2種方式講解首先新建一個(gè)項(xiàng)目,然后點(diǎn)擊右鍵,選擇Add-Spring-Capabilities選擇把包c(diǎn)opy到自己的lib下,選擇下一步,F(xiàn)inish。新建一個(gè)bean(bean:實(shí)現(xiàn)某個(gè)功能的類)在上一步建完之后,工具會自動在src下建立一個(gè)applicationContext.xml的配置文件,這個(gè)文件就是整個(gè)Spring的配置文件。然后我們新建一個(gè)UserService接口,模擬對員工的添加操作。
publicinterfaceUserService{publicvoidsave();}然后創(chuàng)建一個(gè)此接口的實(shí)現(xiàn)類:publicclassUserServiceImplimplementsUserService{publicvoidsave(){System.out.println("新增員工");}}在applicationContext.xml中配置bean<beanid="userService"class="service.UserServiceImpl"></bean>Id是唯一標(biāo)識,class需要給定接口實(shí)現(xiàn)類(注意不是接口)Spring通過一個(gè)bean的工廠來得到相應(yīng)的bean對象,所以在得到bean對象之前,我們需要先得到這個(gè)bean工廠,而這個(gè)工廠的創(chuàng)建又依賴于配置文件。配置文件放在src下,最后會被編譯到classes文件夾,我們可以通過ClassPathXmlApplicationContext對象構(gòu)建這個(gè)工廠:BeanFactorybeanFactory=newClassPathXmlApplicationContext("applicationContext.xml");然后得到這個(gè)UserService實(shí)現(xiàn)類對象:UserServiceuserService=(UserService)beanFactory.getBean("userService");最后,調(diào)用接口方法:userService.save();在applicationContext.xml中配置bean之前只需要寫兩行代碼就可以調(diào)用一個(gè)對象的方法,而現(xiàn)在還得通過配置文件得到某個(gè)對象并調(diào)用方法,似乎有點(diǎn)大炮打蚊子的感覺,實(shí)際上,編寫一款架構(gòu)良好的軟件程序往往在開頭是比較繁瑣的,一旦架子搭建完畢,隨著項(xiàng)目的推薦,這種架構(gòu)會給你帶來諸多便利之處,俗話說:磨刀不誤砍柴工,就是說的這個(gè)道理。那么這樣做能帶來哪些便利呢?比如說,現(xiàn)在員工管理的業(yè)務(wù)邏輯改了,插入時(shí)需要做另外的操作,那么我們可以重新新建一個(gè)UserService的實(shí)現(xiàn)類,然后配置到applicationContext.xml文件就夠了。為什么要“大炮打蚊子”?依賴配置spring最強(qiáng)大的功能就是依賴注入功能,什么叫依賴?
實(shí)現(xiàn)某個(gè)功能所需要引入的外部的API(接口,類)就叫做一種依賴,簡單來說:在A類中,需要調(diào)用B類對象的某個(gè)方法來完成某種功能,那么A就依賴于B。
示例配置:
<!--配置MainService的實(shí)現(xiàn)類--><beanid="mainService"class="service.MainServiceImpl">
<!--注入類的userService屬性,這個(gè)屬性是一個(gè)引用,引用的是上面定義的beanid-->
<propertyname="userService"ref="uservice1"></property></bean>
依賴配置bean的作用域
spring提供"singleton"和"prototype"兩種基本的作用域:singleton表示該bean是單例的,也就是說在整個(gè)web環(huán)境下是唯一的實(shí)例;
prototype表示每次使用該bean時(shí)都會生成一個(gè)新的對象。spring中配置的bean默認(rèn)是singleton的。
我們比較一下先后兩次得到的同一個(gè)bean對象:
MainServicemainService=(MainService)beanFactory.getBean("mainService");
MainServicemainService1=(MainService)beanFactory.getBean("mainService");
System.out.println(mainService==mainService1);
結(jié)果會打印:true,表示這兩個(gè)對象確實(shí)是同一個(gè)
假如說在MainService實(shí)現(xiàn)類的配置中加一個(gè)scope="prototype",那么結(jié)果會打印false,說明每次得到的bean對象都是新建的。分模塊配置文件當(dāng)bean的配置越來越多,applicationContext.xml文件會越來越大。所有的bean都配置在一個(gè)地方不僅不利于協(xié)作開發(fā),而且在準(zhǔn)備修改某個(gè)模塊的功能時(shí)非常不容易找出來,此時(shí)我們可以考慮根據(jù)模塊劃分,把不同模塊的bean配置在不同的xml文件里面。
比如在上面的例子中,我們可以新建一個(gè)用戶模塊專屬的配置文件,取名userContext.xml,然后在這個(gè)文件里配置bean,并在applicationContext.xml中引入這個(gè)配置文件:
<importresource="userContext.xml"/>SpringAOP
AOP:面向切面編程,在不侵入源碼的情況下對某些方法進(jìn)行功能加強(qiáng)的一種技術(shù)(思想)。
考慮一下如下場景:在對數(shù)據(jù)庫進(jìn)行操作時(shí),我們往往需要在調(diào)用方法時(shí)進(jìn)行一些日志的記錄,比如說某人在某時(shí)新增了一條數(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í)行完畢");
}
這樣的確能實(shí)現(xiàn)日志記錄的功能,但是缺點(diǎn)非常明顯:需要在具體的方法體內(nèi)嵌入一些日志打印的代碼,假如以后要修改日志記錄的具體信息或者撤掉日志記錄的功能
,就需要找到所有具有日志打印的方法一個(gè)個(gè)進(jìn)行修改或者刪除。
Spring的AOP通過攔截具體的方法點(diǎn)來實(shí)現(xiàn)方法前后加入代碼的功能,它不需要直接嵌入到某個(gè)方法內(nèi),以后要修改這些增強(qiáng)功能只需要在一個(gè)地方做修改就可以了。SpringAOP實(shí)現(xiàn)在使用SpringAOP時(shí)需要先搞清楚幾個(gè)概念:切入點(diǎn),通知,切面。
切入點(diǎn):pointcut,表示需要被加強(qiáng)功能的所有方法,它是使用一個(gè)表達(dá)式來描述方法的選擇規(guī)則。
通知:表示在切入點(diǎn)的方法執(zhí)行,常用的有前置通知(前面調(diào)用),后置通知(后面調(diào)用)
切面:aspect,也稱作方面,它里面可以有多個(gè)切入點(diǎn)和通知下面看看,怎樣使用Spring完成AOP的功能。首先創(chuàng)建一個(gè)project,導(dǎo)入Spring時(shí),需要勾選AOP的包
首先創(chuàng)建一個(gè)project,導(dǎo)入Spring時(shí),需要勾選AOP的包創(chuàng)建一個(gè)UserService接口,這個(gè)接口有兩個(gè)方法:
publicinterfaceUserService{publicvoidsave();publicvoidupdate();
}
然后新建一個(gè)實(shí)現(xiàn)類:
publicclassUserServiceImplimplementsUserService{@Overridepublicvoidsave(){System.out.println("新增員工");}@Overridepublicvoidupdate(){System.out.println("修改員工");}
}
假如我們現(xiàn)在這個(gè)接口的方法前后調(diào)用相應(yīng)的代碼,那么就得新建一個(gè)切面類:
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>
<!--切入點(diǎn),攔截哪些方法-->
<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>這個(gè)標(biāo)簽包起來;
<aop:pointcut>聲明了一個(gè)切入點(diǎn),expression是一個(gè)切入點(diǎn)選擇的表達(dá)式,其實(shí)就是找出所有滿足這個(gè)表達(dá)式的方法。
expression語法詳解:
第一個(gè)星號表示返回所有類型,假如是int,那么只會選擇返回類型是int值的方法;
后面是跟的包名,包名后面的兩點(diǎn)表示這個(gè)包以及子包;
第二個(gè)星號表示匹配包下所有類;
第三個(gè)星號表示匹配所有方法名,假如改成save*,就表示匹配所有以save開頭的方法名
(..)表示任何參數(shù)的方法定義切面的節(jié)點(diǎn)是<aop:aspect>,ref屬性引用的就是之前定義的切面類。
<aop:before>是前置通知,pointcut-ref引用的是上面聲明過的切入點(diǎn)pointcut1,method就是切面類中的方法,
這表示切面類userServiceAspect會在切入點(diǎn)方法調(diào)用之前調(diào)用beforeCall方法;
<aop:after>是后置通知,這個(gè)里面沒有使用pointcut-ref來引入切入點(diǎn),而是直接使用pointcut屬性來定義切入點(diǎn),
這是沒問題的,當(dāng)然這里也可以使用pointcut-ref來引入公共的pointcut配置。這個(gè)節(jié)點(diǎn)表示切面類userServiceAspect類會在
切入點(diǎn)方法的后面調(diào)用Spring整合Struts2Struts2是一個(gè)基于MVC的web框架,本身可以獨(dú)立使用,僅僅需要在web.xml里面配置攔截url的過濾器和struts*.xml中配置Action的具體類,在具體的Action類里面,就可以調(diào)用Service層的業(yè)務(wù)方法,而Service層就可以調(diào)用持久層(Hibernate,MyBatis)等數(shù)據(jù)操作的API
Spring是一個(gè)基于IOC的組件工廠,它本身作用不大,但是可以管理不同組件(API,類,接口)之間的依賴關(guān)系,比如說Action跟Service的依賴,Service跟持久層(或者DAO層)的依賴等。
那么我們可以讓Spring來接管Struts2的Action,以達(dá)到最終管理整個(gè)Struts周邊組件依賴的目的。Spring需要怎樣和Struts2配合使用?Spring整合Struts2首先新建一個(gè)webproject,然后分別導(dǎo)入spring包和struts包。
spring包可以去/下載
struts包可以去
/
下載然后在項(xiàng)目中導(dǎo)入相關(guān)依賴包。導(dǎo)入之后,在src下建立struts.xml,applicationContext.xml文件,留待后面配置這兩個(gè)框架。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>
這是配置了一個(gè)ObjectFactory,也就是對象工廠,表示Action由這些工廠幫我們創(chuàng)建。
配置<action>節(jié)點(diǎn)也與之前不太一樣,特別是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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高中生物實(shí)驗(yàn)教學(xué)團(tuán)隊(duì)建設(shè)計(jì)劃
- 2024-2025學(xué)年度小學(xué)三年級班主任教學(xué)計(jì)劃
- 新能源車輛廠IATF16949內(nèi)審計(jì)劃
- 機(jī)械零部件工業(yè)建設(shè)項(xiàng)目報(bào)建流程
- 小學(xué)心理健康年度工作計(jì)劃
- 農(nóng)業(yè)供應(yīng)商綜合評價(jià)表模板范文
- 2025新蘇教版科學(xué)五年級下冊課后輔導(dǎo)計(jì)劃
- 小學(xué)科學(xué)論文發(fā)表范文與實(shí)踐
- 互聯(lián)網(wǎng)企業(yè)個(gè)人有關(guān)事項(xiàng)問題原因剖析及整改措施
- 手術(shù)室患者安全管理參與流程優(yōu)化
- 山西美錦華盛化工新材料有限公司化工新材料生產(chǎn)項(xiàng)目環(huán)評報(bào)告
- 2023年新版衛(wèi)生監(jiān)督技能競賽題庫醫(yī)療執(zhí)法和傳染病防治監(jiān)督
- 2022年高三八省聯(lián)考語文試題與答案
- GB/T 29776-2013紡織品防蟲蛀性能的測定
- GB/T 18998.2-2022工業(yè)用氯化聚氯乙烯(PVC-C)管道系統(tǒng)第2部分:管材
- 最新國家開放大學(xué)電大《調(diào)劑學(xué)》形考任務(wù)4試題及答案
- 中俄文一般貿(mào)易合同范本
- 不合格品退貨處理單
- 國家開放大學(xué)2022春(202207)《2624醫(yī)藥商品營銷實(shí)務(wù)》期末考試真題及答案-開放???/a>
- 大連海事大學(xué)畢業(yè)成績表
- 人防卷材防水層工程檢驗(yàn)批質(zhì)量驗(yàn)收記錄表
評論
0/150
提交評論