java課程c第三階段j2ee第三章spring框架_第1頁
java課程c第三階段j2ee第三章spring框架_第2頁
java課程c第三階段j2ee第三章spring框架_第3頁
java課程c第三階段j2ee第三章spring框架_第4頁
java課程c第三階段j2ee第三章spring框架_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論