![java android整套學(xué)習(xí)spring3企業(yè)開發(fā)_第1頁(yè)](http://file4.renrendoc.com/view/9092a433e6d3a86b720a12d5d37b64fc/9092a433e6d3a86b720a12d5d37b64fc1.gif)
![java android整套學(xué)習(xí)spring3企業(yè)開發(fā)_第2頁(yè)](http://file4.renrendoc.com/view/9092a433e6d3a86b720a12d5d37b64fc/9092a433e6d3a86b720a12d5d37b64fc2.gif)
![java android整套學(xué)習(xí)spring3企業(yè)開發(fā)_第3頁(yè)](http://file4.renrendoc.com/view/9092a433e6d3a86b720a12d5d37b64fc/9092a433e6d3a86b720a12d5d37b64fc3.gif)
![java android整套學(xué)習(xí)spring3企業(yè)開發(fā)_第4頁(yè)](http://file4.renrendoc.com/view/9092a433e6d3a86b720a12d5d37b64fc/9092a433e6d3a86b720a12d5d37b64fc4.gif)
![java android整套學(xué)習(xí)spring3企業(yè)開發(fā)_第5頁(yè)](http://file4.renrendoc.com/view/9092a433e6d3a86b720a12d5d37b64fc/9092a433e6d3a86b720a12d5d37b64fc5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
北京傳智播客教育Spring3企業(yè)開發(fā)講師:馮威北京傳智播客教育
第一章開始spring之旅北京傳智播客教育
知識(shí)1:Spring介紹Spring是一個(gè)非常活躍的開源框架;它是一個(gè)基于IOC和AOP來構(gòu)架多層JavaEE系統(tǒng)的框架,它的主要目地是簡(jiǎn)化企業(yè)開發(fā).Spring以一種非侵入式的方式來管理你的代碼,Spring提倡”最少侵入”,這也就意味著你可以適當(dāng)?shù)臅r(shí)候安裝或卸載Spring北京傳智播客教育
知識(shí)2:Spring模塊介紹Spring框架是一個(gè)分層架構(gòu),它包含一系列的功能要素,并被分為大約20個(gè)模塊。這些模塊分為CoreContainer、DataAccess/Integration、Web、AOP(AspectOrientedProgramming)、Instrumentation和測(cè)試部分,如下圖所示:
北京傳智播客教育知識(shí)3:理解控制反轉(zhuǎn)(IOC)IOC就是InversionofControl
public
classGirl{privateBoyboy=newBoy();public
voidkiss(){System.out.println(boy.getBoyObject());}}boy是在應(yīng)用內(nèi)部創(chuàng)建及維護(hù)的。所謂控制反轉(zhuǎn)就是應(yīng)用本身不負(fù)責(zé)依賴對(duì)象的創(chuàng)建及維護(hù),依賴對(duì)象的創(chuàng)建及維護(hù)是由外部容器負(fù)責(zé)的。這樣控制權(quán)就由應(yīng)用轉(zhuǎn)移到了外部容器,控制權(quán)的轉(zhuǎn)移就是所謂反轉(zhuǎn),目的是為了獲得更好的擴(kuò)展性和良好的可維護(hù)性。北京傳智播客教育知識(shí)4:理解依賴注入(DependencyInjection)當(dāng)我們把依賴對(duì)象交給外部容器負(fù)責(zé)創(chuàng)建,那么Girl類可以改成如下:public
classGirl{privateBoyboy;public
voidkiss(){System.out.println(boy.getBoyObject());}}所謂依賴注入就是指:在運(yùn)行期,由外部容器動(dòng)態(tài)地將依賴對(duì)象注入到組件中。北京傳智播客教育知識(shí)點(diǎn)5:實(shí)現(xiàn)IOC*org.springframework.asm-3.0.2.RELEASE.jarSpring獨(dú)立的asm程序,Spring2.5.6的時(shí)候需要asmJar包,3.0開始提供他自己獨(dú)立的asmJar。*org.springframework.beans-3.0.2.RELEASE.jar所有應(yīng)用都要用到的,它包含訪問配置文件、創(chuàng)建和管理bean以及進(jìn)行InversionofControl/DependencyInjection(IoC/DI)操作相關(guān)的所有類*org.springframework.context-3.0.2.RELEASE.jarSpring提供在基礎(chǔ)IoC功能上的擴(kuò)展服務(wù),此外還提供許多企業(yè)級(jí)服務(wù)的支持,如郵件服務(wù)、任務(wù)調(diào)度、JNDI定位、EJB集成、遠(yuǎn)程訪問、緩存以及各種視圖層框架的封裝等。*org.springframework.core-3.0.2.RELEASE.jar包含Spring框架基本的核心工具類,Spring其它組件要都要使用到這個(gè)包里的類,是其它組件的基本核心。*org.springframework.expression-3.0.2.RELEASE.jarSpring表達(dá)式語言*mons.logging-1.1.1.jar第三方的主要用于處理日志1:到下載spring,然后進(jìn)行解壓縮,在解壓目錄中找到下面jar文件,拷貝到類路徑下北京傳智播客教育
知識(shí)點(diǎn)5:實(shí)現(xiàn)IOC2:創(chuàng)建java類public
classBoy{public
voiddisplay(){
System.out.println("隨便");}}北京傳智播客教育
知識(shí)點(diǎn)5:實(shí)現(xiàn)IOC3:創(chuàng)建spring的配置模板<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns=""xmlns:xsi=""xsi:schemaLocation="/spring-beans-3.0.xsd“></beans>該配置模版可以從spring的參考手冊(cè)或spring的例子中得到。配置文件的取名可以任意,文件可以存放在任何目錄下,但考慮到通用性,一般放在類路徑下。北京傳智播客教育
知識(shí)點(diǎn)5:實(shí)現(xiàn)IOC4:在spring的配置文件中增加如下配置<beanid="boy"class="cn.itcast.ioc.Boy"></bean>北京傳智播客教育知識(shí)點(diǎn)5:實(shí)現(xiàn)IOC5:加載spring的配置文件測(cè)試public
classApp{
public
static
voidmain(String[]args){
//在類路徑下,初始化spring容器
ApplicationContextctx=newClassPathXmlApplicationContext("beans.xml");
//從spring容器中獲取boy對(duì)象<beanid="boy"class="cn.itcast.ioc.Boy"></bean>Boyboy=(Boy)ctx.getBean("boy");
//調(diào)用boy對(duì)象的display方法
boy.display();}}北京傳智播客教育知識(shí)點(diǎn)6:實(shí)現(xiàn)DI1.創(chuàng)建girl類public
classGirl{privateBoyboy;public
voidsetBoy(Boyboy){System.out.println("setBoy"+boy);this.boy=boy;}public
voidkiss(){boy.display();}}北京傳智播客教育
知識(shí)點(diǎn)6:實(shí)現(xiàn)DI2.在spring的beans.xml文件中增加如下配置,紅色的為新增加的<beanid="boy"class="cn.itcast.di.Boy"></bean>
<!--創(chuàng)建girl的對(duì)象-->
<beanid="girl"class="cn.itcast.di.Girl"><!--依賴注入把boy對(duì)象傳遞給girlpropertyname="boy1"使用publicvoidsetBoy1(Boyboy1)<propertyname="boy"><!--引用beanid="boy"中的boy--><refbean="boy"/></property></bean>北京傳智播客教育
知識(shí)點(diǎn)6:實(shí)現(xiàn)DI3.測(cè)試public
classApp{
public
static
voidmain(String[]args){
//加載spring的xml文件,初始化spring容器
ApplicationContextctx=newClassPathXmlApplicationContext("cn/itcast/di/beans.xml");
//從spring容器中獲取Girl對(duì)象<beanid="girl"class="cn.itcast.di.Girl">Girlgirl=(Girl)ctx.getBean("girl");
//調(diào)用boy對(duì)象的display方法
girl.kiss();}}北京傳智播客教育知識(shí)點(diǎn)7:從spring容器中得到bean當(dāng)spring容器啟動(dòng)后,因?yàn)閟pring容器可以管理bean對(duì)象的創(chuàng)建,銷毀等生命周期,所以我們只需從容器直接獲取Bean對(duì)象就行,而不用編寫一句代碼來創(chuàng)建bean對(duì)象。從容器獲取bean對(duì)象的代碼如下:ApplicationContextctx=newClassPathXmlApplicationContext("beans.xml");
Girlgirl=(Girl)ctx.getBean("girl");北京傳智播客教育知識(shí)點(diǎn)8:實(shí)例化spring容器的方式實(shí)例化Spring容器常用的兩種方式:方法一:在類路徑下尋找配置文件來實(shí)例化容器ApplicationContextctx=newClassPathXmlApplicationContext(newString[]{"beans.xml"});可以在整個(gè)類路徑中尋找xml文件*通過這種方式加載。需要將spring的配置文件放到當(dāng)前項(xiàng)目的classpath路徑下*classpath路徑指的是當(dāng)前項(xiàng)目的src目錄,該目錄是java源文件的存放位置。方法二:在文件系統(tǒng)路徑下尋找配置文件來實(shí)例化容器ApplicationContextctx=newFileSystemXmlApplicationContext(newString[]{“d:\\beans.xml“});Spring的配置文件可以指定多個(gè),可以通過String數(shù)組傳入。北京傳智播客教育知識(shí)點(diǎn)9:為何要使用Spring至少在我看來,在項(xiàng)目中引入spring立即可以帶來下面的好處降低組件之間的耦合度,實(shí)現(xiàn)軟件各層之間的解耦。
可以使用容器提供的眾多服務(wù),如:事務(wù)管理服務(wù)、消息服務(wù)等等。當(dāng)我們使用容器管理事務(wù)時(shí),開發(fā)人員就不再需要手工控制事務(wù).也不需處理復(fù)雜的事務(wù)傳播。容器提供單例模式支持,開發(fā)人員不再需要自己編寫實(shí)現(xiàn)代碼。容器提供了AOP技術(shù),利用它很容易實(shí)現(xiàn)如權(quán)限攔截、運(yùn)行期監(jiān)控等功能。容器提供的眾多輔作類,使用這些類能夠加快應(yīng)用的開發(fā),如:JdbcTemplate、HibernateTemplate。Spring對(duì)于主流的應(yīng)用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,這樣更便于應(yīng)用的開發(fā)。ControllerServiceDAO北京傳智播客教育
知識(shí)點(diǎn)9:使用Spring的好處當(dāng)使用spring時(shí),我們可以使用容器提供的眾多服務(wù)北京傳智播客教育
第二章裝配Bean北京傳智播客教育知識(shí)點(diǎn)1:三種實(shí)例化bean的方式1.使用類構(gòu)造器實(shí)例化(默認(rèn)無參數(shù))<beanid=“personService"class="cn.itcast.bean.impl.PersonServiceImpl"/>2.使用靜態(tài)工廠方法實(shí)例化(簡(jiǎn)單工廠模式)<beanid="personService"class="com.itcast.factory.PersonServiceFactory"factory-method="createPersonService"/>public
classPersonServiceFactory{public
staticPersonServicecreatePersonService(){return
newPersonServiceImpl();}}3.使用實(shí)例工廠方法實(shí)例化(工廠方法模式):<beanid=“personServiceFactory"class="com.itcast.factory.PersonServiceFactory"/><beanid="personService"factory-bean=“personServiceFactory"factory-method="createPersonService"/>publicclassPersonServiceFactory{publicPersonServicecreatePersonService(){returnnewPersonServiceImpl();}}北京傳智播客教育知識(shí)點(diǎn)2:Bean的作用域*singleton(默認(rèn)值)
在每個(gè)SpringIoC容器中一個(gè)bean定義只有一個(gè)對(duì)象實(shí)例(共享)。默認(rèn)情況下會(huì)在容器啟動(dòng)時(shí)初始化bean,但我們可以指定Bean節(jié)點(diǎn)的lazy-init=“true”來延遲初始化bean,這時(shí)候,只有第一次獲取bean會(huì)才初始化bean。如:
<beanid="xxx"class="cn.itcast.OrderServiceBean"lazy-init="true"/>如果想對(duì)所有bean都應(yīng)用延遲初始化,可以在根節(jié)點(diǎn)beans設(shè)置default-lazy-init=“true“,如下:<beansdefault-lazy-init="true“...>*prototype
允許bean可以被多次實(shí)例化(使用一次就創(chuàng)建一個(gè)實(shí)例)*request*session*globalsession(Portlet規(guī)范將portlet定義為一種“基于Java技術(shù)的web組件,由處理請(qǐng)求和生成動(dòng)態(tài)內(nèi)容的portlet容器管理”)北京傳智播客教育知識(shí)點(diǎn)3:指定Bean的初始化方法和銷毀方法Spring初始化bean或銷毀bean時(shí),有時(shí)需要作一些處理工作,因此spring可以在創(chuàng)建和拆卸bean的時(shí)候調(diào)用bean的兩個(gè)生命周期方法。
<beanid=“foo”class=“...Foo”init-method=“setup”destory-method=“teardown”/>當(dāng)bean被載入到容器的時(shí)候調(diào)用setup當(dāng)bean從容器中刪除的時(shí)候調(diào)用teardown(scope=singleton有效)北京傳智播客教育知識(shí)點(diǎn)4:依賴注入*手工裝配
*使用xml配置文件
*使用屬性setter方法注入
4.1
*使用構(gòu)造器注入
4.2
*使用注解
*autowired注解
4.3
*resource注解
4.4
*自動(dòng)裝配
4.5
*byType:按類型裝配
*byName:按名稱裝配
*constructor裝配,*autodetect
不確定裝配。注入依賴對(duì)象可以采用手工裝配或自動(dòng)裝配,在實(shí)際應(yīng)用中建議使用手工裝配,因?yàn)樽詣?dòng)裝配會(huì)產(chǎn)生未知情況,開發(fā)人員無法預(yù)見最終的裝配結(jié)果。北京傳智播客教育知識(shí)點(diǎn)4:依賴注入
4.1:手工裝配
--使用xml配置文件--使用屬性setter方法注入通過setter方法注入依賴<bean>元素的<property>子元素指明了使用它們的set方法來注入??梢宰⑷肴魏螙|西,從基本類型到集合類,甚至是應(yīng)用系統(tǒng)的bean。北京傳智播客教育知識(shí)點(diǎn)4:依賴注入通過setter方法注入依賴
*簡(jiǎn)單bean配置配置bean的簡(jiǎn)單屬性,基本數(shù)據(jù)類型和String。<beanid="personService"class="com.itcast.bean.impl.PersonServiceImpl"><!--基本類型,string類型--><propertyname="age"value="20"></property><propertyname="name"value="張無忌"></property></bean>
4.1:手工裝配
--使用xml配置文件--使用屬性setter方法注入北京傳智播客教育知識(shí)點(diǎn)4:依賴注入通過setter方法注入依賴引用其它bean<beanid="person"class="com.itcast.bean.Person"/><beanid="personService"class="com.itcast.bean.impl.PersonServiceImpl"><!--引用類型--><propertyname="person"ref="person"/></bean>
4.1:手工裝配
--使用xml配置文件--使用屬性setter方法注入北京傳智播客教育知識(shí)點(diǎn)4:依賴注入通過setter方法注入依賴
*內(nèi)部bean
<beanid="personService"class="com.itcast.bean.impl.PersonServiceImpl"><!--內(nèi)部bean注入-->
<propertyname="personClass">
<beanclass="com.itcast.bean.PersonClass"/></propert></bean>這種方式的缺點(diǎn)是你無法在其它地方重用這個(gè)personClass實(shí)例,原因是它是專門為personService而用。4.1:手工裝配
--使用xml配置文件--使用屬性setter方法注入北京傳智播客教育依賴注入--手工裝配--XML方式通過setter方法注入依賴*裝配集合
若bean的屬性是集合類型,按如下處理:
A、裝配List和數(shù)組:<!--裝配數(shù)組--><propertyname="obj"><list><value>obj1</value><value>obj2</value><refbean="person"/></list></property><!--裝配list--><propertyname="lists"><list><value>list1</value><value>list2</value><refbean="person"/></list></property>4.1:手工裝配
--使用xml配置文件--使用屬性setter方法注入北京傳智播客教育知識(shí)點(diǎn)4:依賴注入通過setter方法注入依賴
*裝配集合
B、裝配set:
set使用方法和list一樣,不同的是對(duì)象被裝配到set中,而list是裝配到List或數(shù)組中裝配。<!--裝配set--><propertyname="sets"><set><value>set1</value><value>set2</value><refbean="person"/></set></property>4.1:手工裝配
--使用xml配置文件--使用屬性setter方法注入北京傳智播客教育知識(shí)點(diǎn)4:依賴注入通過setter方法注入依賴*裝配集合
C、裝配map:map中的<entry>的數(shù)值和<list>以及<set>的一樣,可以使任何有效的屬性元素,需要注意的是key值必須是String的。<!--裝配map--><propertyname="maps"><map><entrykey="01"><value>map01</value></entry><entrykey="02"><value>map02</value></entry></map></property>4.1:手工裝配
--使用xml配置文件--使用屬性setter方法注入北京傳智播客教育知識(shí)點(diǎn)4:依賴注入通過setter方法注入依賴*裝配集合D、裝配Properties:
<!--裝配Properties--><propertyname="props"><props><propkey="01">prop1</prop><propkey="02">prop2</prop></props></property>4.1:手工裝配
--使用xml配置文件--使用屬性setter方法注入北京傳智播客教育知識(shí)點(diǎn)4:依賴注入通過setter方法注入依賴
*裝配集合E、設(shè)置null:
<!--裝配null--><propertyname="listnull"><null/></property>4.1:手工裝配
--使用xml配置文件--使用屬性setter方法注入北京傳智播客教育知識(shí)點(diǎn)4:依賴注入通過構(gòu)造函數(shù)注入依賴
通過參數(shù)的順序:<constructor-argindex="0"><value>張三</value></constructor-arg><constructor-argindex="1"><value>56</value></constructor-arg>4.2:手工裝配
--使用xml配置文件--通過構(gòu)造函數(shù)注入北京傳智播客教育知識(shí)點(diǎn)4:依賴注入通過構(gòu)造函數(shù)注入依賴通過參數(shù)的類型:
<!--通過參數(shù)的類型--><constructor-argtype="java.lang.Integer"><value>56</value></constructor-arg><constructor-argtype="java.lang.String"><value>張三</value></constructor-arg>4.2:手工裝配
--使用xml配置文件--通過構(gòu)造函數(shù)注入北京傳智播客教育知識(shí)點(diǎn)4:依賴注入.在java代碼中使用@Autowired或@Resource注解方式進(jìn)行裝配的前提條件是。1、引入context命名空間需要在xml配置文件中配置以下信息:<beansxmlns=""xmlns:xsi=""xmlns:context=""xsi:schemaLocation="/spring-beans-3.0.xsd
/spring-context-3.0.xsd"><context:annotation-config/></beans>2、在配置文件中添加context:annotation-config標(biāo)簽<context:annotation-config/>這個(gè)配置隱式注冊(cè)了多個(gè)對(duì)注釋進(jìn)行解析處理的處理器AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor注:@Resource注解在spring安裝目錄的spring-framework-3.0.2.RELEASE-dependencies\javax.annotation\com.springsource.javax.annotation\1.0.0包下com.springsource.javax.annotation-1.0.0.jar手工裝配
--使用注解方式北京傳智播客教育知識(shí)點(diǎn)4:依賴注入.注意:*如果使用jdk1.5,需要引入com.springsource.javax.annotation-1.0.0.jar包
*如果使用jdk1.6,不需要引入
com.springsource.javax.annotation-1.0.0.jar包c(diǎn)om.springsource.javax.annotation-1.0.0.jar該jar包在spring-framework-3.0.2.RELEASE-dependencies\javax.annotation\com.springsource.javax.annotation\1.0.0包下手工裝配
--使用注解方式北京傳智播客教育知識(shí)點(diǎn)4:依賴注入Autowired標(biāo)注在字段上
*@Autowired注解默認(rèn)按類型進(jìn)行裝配*獲取該注解標(biāo)注的字段的類型---PersonDao類型*以該類型為條件到spring容器(beans.xml)中去查找bean的id節(jié)點(diǎn)的類型是PersonDao類型.*找到以后,獲取該節(jié)點(diǎn)對(duì)應(yīng)的對(duì)象,利用反射直接為personDao變量賦值
*@Qualifier(“personDao”)該注解以名字為條件查找依賴對(duì)象*以該注解的的參數(shù)personDao條件到spring容器(beans.xml)中去查找bean的id節(jié)點(diǎn)的值是personDao的對(duì)象*找到以后,獲取該節(jié)點(diǎn)對(duì)應(yīng)的對(duì)象,利用反射直接為personDao變量賦值如果不存在該名稱,拋出異常4.3:手工裝配
--使用注解方式-autowired注解@AutowiredprivatePersonDaopersonDao;//用于字段上
@Autowired
@Qualifier("personDao")privatePersonDaopersonDao;//用于字段上北京傳智播客教育知識(shí)點(diǎn)4:依賴注入@AutowiredpublicvoidsetPersonDao(PersonDaopersonDao){//用于屬性的set方法上this.personDao=personDao;}@AutowiredpublicvoidsetPersonDao(@Qualifier("personDao")PersonDaopersonDao){//用于屬性的set方法上this.personDao=personDao;}4.3:手工裝配
--使用注解方式autowired注解Autowired標(biāo)注在setter方法上
@Autowired注解默認(rèn)按類型進(jìn)行裝配
*獲取setPersonDao()方法的參數(shù)的類型---PersonDao類型
*以該類型為條件到spring容器(beans.xml)中去查找bean的id節(jié)點(diǎn)的類型是PersonDao類型. *找到以后,獲取該節(jié)點(diǎn)對(duì)應(yīng)的對(duì)象,把該對(duì)象作為實(shí)參傳遞給該setPersonDao(
PersonDaopersonDao)的形參.
*@Qualifier("personDao")該注解以名字為條件查找依賴對(duì)象
*以該注解的的參數(shù)personDao條件到spring容器(beans.xml)中去查找bean的id節(jié)點(diǎn)的 值是PersonDao的對(duì)象
*
找到以后,獲取該節(jié)點(diǎn)對(duì)應(yīng)的對(duì)象,把該對(duì)象作為實(shí)參傳遞給該setPersonDao(
PersonDaopersonDao)的形參. *如果不存在該名稱,拋出異常北京傳智播客教育知識(shí)點(diǎn)4:依賴注入Resource注解標(biāo)注在字段上
*@Resource注解默認(rèn)按名稱裝配。*如果沒有指定name屬性*獲取該注解標(biāo)注的字段值---personDao *以該字段值為條件到spring容器(beans.xml)中去查找bean的id節(jié)點(diǎn)的值是personDao的節(jié)點(diǎn) *找到以后,獲取該節(jié)點(diǎn)對(duì)應(yīng)的對(duì)象,利用反射直接為personDao變量賦值 *如果沒有找到.并且按照默認(rèn)的名稱找不到依賴對(duì)象時(shí),@Resource注解會(huì)回退到按類型裝配 *獲取該注解標(biāo)注的字段類型--PersonDao *以該類型為條件到spring容器(beans.xml)中去查找bean的節(jié)點(diǎn)的類型是PersonDao類型的對(duì)象 *找到以后,獲取該節(jié)點(diǎn)對(duì)應(yīng)的對(duì)象,利用反射直接為personDao變量賦值*如果指定name屬性只能按名稱裝配 *獲取name屬性的值personDao *以該值為條件到spring容器(beans.xml)中去查找bean的id節(jié)點(diǎn)的值是PersonDao的對(duì)象 *找到以后,獲取該節(jié)點(diǎn)對(duì)應(yīng)的對(duì)象,利用反射直接為personDao變量賦值 *如果不存在該名稱,拋出異常4.4:手工裝配
--使用注解方式-resource注解
@Resource(name="personDao")privatePersonDaopersonDao;;//用于字段上北京傳智播客教育知識(shí)點(diǎn)4:依賴注入@Resource(name="personDao")publicvoidsetPersonDao(PersonDaopersonDao){this.personDao=personDao;}4.4:手工裝配
--使用注解方式resource注解resource注解標(biāo)注在setter方法上
*@Resource注解默認(rèn)按名稱裝配。*如果沒有指定name屬性*獲取setPersonDao()方法的屬性名---personDao *以該屬性名為條件到spring容器(beans.xml)中去查找bean的id節(jié)點(diǎn)的值是personDao的節(jié)點(diǎn) *找到以后,獲取該節(jié)點(diǎn)對(duì)應(yīng)的對(duì)象,把該對(duì)象作為實(shí)參傳遞給該setPersonDao( PersonDaopersonDao)的形參. *如果沒有找到.并且按照默認(rèn)的名稱找不到依賴對(duì)象時(shí),@Resource注解會(huì)回退到按類型裝配 *獲取setPersonDao()方法的參數(shù)類型---PersonDao *以該類型為條件到spring容器(beans.xml)中去查找bean的節(jié)點(diǎn)的類型是PersonDao類型對(duì)象 *找到以后,獲取該節(jié)點(diǎn)對(duì)應(yīng)的對(duì)象,把該對(duì)象作為實(shí)參傳遞給該setPersonDao( PersonDaopersonDao)方法的形參 *如果指定name屬性只能按名稱裝配 *獲取name屬性的值 *以該值為條件到spring容器(beans.xml)中去查找bean的id節(jié)點(diǎn)的值是PersonDao的對(duì)象 *找到以后,獲取該節(jié)點(diǎn)對(duì)應(yīng)的對(duì)象,把該對(duì)象作為實(shí)參傳遞給該setPersonDao( PersonDaopersonDao)的形參. *如果不存在該名稱,拋出異常北京傳智播客教育知識(shí)點(diǎn)4:依賴注入對(duì)于自動(dòng)裝配,大家了解一下就可以了,實(shí)在不推薦大家使用。例子:<beanid=“foo”class=“...Foo”autowire=“autowiretype”>autowire屬性取值如下*byType:按類型裝配,可以根據(jù)屬性的類型,在容器中尋找跟該類型匹配的bean。如果發(fā)現(xiàn)多個(gè),那么將會(huì)拋出異常。如果沒有找到,即屬性值為null。*byName:按名稱裝配,可以根據(jù)屬性的名稱,在容器中尋找跟該屬性名相同的bean,如果沒有找到,即屬性值為null。*constructor與byType的方式類似,不同之處在于它應(yīng)用于構(gòu)造器參數(shù)。如果在容器中沒有找到與構(gòu)造器參數(shù)類型一致的bean,那么將會(huì)拋出異常。*autodetect:首先嘗試使用constructor來自動(dòng)裝配,然后使用byType方式。不確定性的處理與constructor方式和byType方式一致。4.5:自動(dòng)裝配北京傳智播客教育
知識(shí)點(diǎn)5:指定Bean的初始化方法和銷毀方法(注解)Spring初始化bean或銷毀bean時(shí),有時(shí)需要作一些處理工作,因此spring可以在創(chuàng)建和拆卸bean的時(shí)候調(diào)用bean的兩個(gè)生命周期方法。
<beanid=“foo”class=“...Foo”init-method=“setup”destory-method=“teardown”/>當(dāng)bean被載入到容器的時(shí)候調(diào)用setup注解方式下:
@PostConstruct初始化當(dāng)bean從容器中刪除的時(shí)候調(diào)用teardown(scope=singleton有效)注解方式如下:
@PreDestroy銷毀北京傳智播客教育知識(shí)點(diǎn)6:classpath自動(dòng)掃描把組件納入spring容器中管理前面的例子我們都是使用XML的bean定義來配置組件。在一個(gè)稍大的項(xiàng)目中,通常會(huì)有上百個(gè)組件,如果這些組件采用xml的bean定義來配置,顯然會(huì)增加配置文件的體積,查找及維護(hù)起來也不太方便。spring2.5為我們引入了組件自動(dòng)掃描機(jī)制,它可以在類路徑底下尋找標(biāo)注了ponent、@Service、@Controller、@Repository注解的類,并把這些類納入進(jìn)spring容器中管理。它的作用和在xml文件中使用bean節(jié)點(diǎn)配置組件是一樣的。要使用自動(dòng)掃描機(jī)制,我們需要打開以下配置信息:1、引入context命名空間需要在xml配置文件中配置以下信息:<beansxmlns=""xmlns:xsi=""xmlns:context=""xsi:schemaLocation="/spring-beans-3.0.xsd
/spring-context-3.0.xsd"><ponent-scanbase-package="cn.itcast"/></beans>北京傳智播客教育知識(shí)點(diǎn)6:classpath自動(dòng)掃描把組件納入spring容器中管理2、在配置文件中添加ponent-scan標(biāo)簽<ponent-scanbase-package="cn.itcast"/>其中base-package為需要掃描的包(含子包)。注:1、在使用組件掃描元素時(shí),AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor會(huì)隱式地被包括進(jìn)來。也就是說,連個(gè)組件都會(huì)被自動(dòng)檢測(cè)并織入-所有這一切都不需要在XML中提供任何bean配置元數(shù)據(jù)。2、功能介紹@Service用于標(biāo)注業(yè)務(wù)層組件、@Controller用于標(biāo)注控制層組件(如struts中的action)、@Repository用于標(biāo)注數(shù)據(jù)訪問組件,即DAO組件。而ponent泛指組件,當(dāng)組件不好歸類的時(shí)候,我們可以使用這個(gè)注解進(jìn)行標(biāo)注。北京傳智播客教育通過在classpath自動(dòng)掃描方式把組件納入spring容器中管理//Dao層importorg.springframework.stereotype.Repository;importcom.itcast.dao.PersonDao;@Repository("personDao")public
classPersonDaoBeanimplementsPersonDao{}//業(yè)務(wù)層importjavax.annotation.Resource;importorg.springframework.stereotype.Service;importcom.itcast.dao.PersonDao;importcom.itcast.service.PersonService;@Service("personService")public
classPersonServiceBeanimplementsPersonService{
@Resource(name="personDao")privatePersonDaopersonDao;}北京傳智播客教育
第三章面向切面編程北京傳智播客教育
知識(shí)點(diǎn)1:AOP--代理對(duì)象代理模式:代理模式的英文叫做Proxy或Surrogate,中文都可譯為”代理“,所謂代理,就是一個(gè)人或者一個(gè)機(jī)構(gòu)代表另一個(gè)人或者另一個(gè)機(jī)構(gòu)采取行動(dòng)。在一些情況下,一個(gè)客戶不想或者不能夠直接引用一個(gè)對(duì)象,而代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用抽象主題角色:聲明了真實(shí)主題和代理主題的共同接口,這樣一來在任何可以使用真實(shí)主題的地方都可以是使用代理主題代理主題(Proxy)角色:代理主題角色內(nèi)部含有對(duì)真實(shí)主題的引用,從而可以在任何時(shí)候操作真實(shí)主題對(duì)象;代理主題角色提供一個(gè)與真實(shí)主題角色相同的接口,以便可以在任何時(shí)候都可以替代真實(shí)主題控制對(duì)真實(shí)主題的引用,負(fù)責(zé)在需要的時(shí)候創(chuàng)建真實(shí)主題對(duì)象(和刪除真實(shí)主題對(duì)象);代理角色通常在將客戶端調(diào)用傳遞給真實(shí)的主題之前或之后,都要執(zhí)行某個(gè)操作,而不是單純地將調(diào)用傳遞給真實(shí)主題對(duì)象。真實(shí)主題角色:定義了代理角色所代表地真實(shí)對(duì)象代理對(duì)象代理主題目標(biāo)對(duì)象真實(shí)主題客戶端代理模式示意圖北京傳智播客教育
知識(shí)點(diǎn)2:JDK動(dòng)態(tài)代理importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.Proxy;public
classJDKProxyimplementsInvocationHandler{privateObjecttargerObject;//代理的目標(biāo)對(duì)象
/***創(chuàng)建代理對(duì)象*@paramtargerObject目標(biāo)對(duì)象*@return*/publicObjectcreateProxyInstance(ObjecttargerObject){
this.targerObject=targerObject;
/**第一個(gè)參數(shù)設(shè)置代碼使用的類加載器,一般采用跟目標(biāo)類相同的類加載器*第二個(gè)參數(shù)設(shè)置代理類實(shí)現(xiàn)的接口,跟目標(biāo)類使用相同的接口*第三個(gè)參數(shù)設(shè)置回調(diào)對(duì)象,當(dāng)代理對(duì)象的方法被調(diào)用時(shí),會(huì)調(diào)用該參數(shù)指定對(duì)象的invoke方法*/
returnProxy.newProxyInstance(targerObject.getClass().getClassLoader(),targerObject.getClass().getInterfaces(),this);}北京傳智播客教育
JDK動(dòng)態(tài)代理
/***@paramproxy目標(biāo)對(duì)象的代理類實(shí)例*@parammethod對(duì)應(yīng)于在代理實(shí)例上調(diào)用接口方法的Method實(shí)例*@paramargs傳入到代理實(shí)例上方法參數(shù)值的對(duì)象數(shù)組*@return
方法的返回值沒有返回值時(shí)是null*/
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{System.out.println("代理類實(shí)例"+proxy.getClass());System.out.println("方法名稱"+method.getName());if(args!=null&&args.length>0){//方法的參數(shù)值
for(inti=0;i<args.length;i++){System.out.println("方法參數(shù)值"+args[i].toString());}}Objectreturnvalue=null;//定義方法的返回值沒有返回值時(shí)是nullreturnvalue=method.invoke(this.targerObject,args);//調(diào)用目標(biāo)對(duì)象的方法System.out.println("方法的返回值"+returnvalue);returnreturnvalue;}}北京傳智播客教育
知識(shí)點(diǎn)3:AOP中的概念A(yù)spect(切面):
是通知和切入點(diǎn)的結(jié)合,通知和切入點(diǎn)共同定義了關(guān)于切面的全部?jī)?nèi)容---它的功能、在何時(shí)和何地完成其功能joinpoint(連接點(diǎn)):所謂連接點(diǎn)是指那些被攔截到的點(diǎn)。在spring中,這些點(diǎn)指的是方法,因?yàn)閟pring只支持方法類型的連接點(diǎn).Pointcut(切入點(diǎn)):所謂切入點(diǎn)是指我們要對(duì)那些joinpoint進(jìn)行攔截的定義.通知定義了切面的”什么”和”何時(shí)”,切入點(diǎn)就定義了”何地”.Advice(通知):所謂通知是指攔截到j(luò)oinpoint之后所要做的事情就是通知.通知分為前置通知,后置通知,異常通知,最終通知,環(huán)繞通知(切面要完成的功能)Target(目標(biāo)對(duì)象):代理的目標(biāo)對(duì)象Weaving(織入):是指把切面應(yīng)用到目標(biāo)對(duì)象來創(chuàng)建新的代理對(duì)象的過程.切面在指定的連接點(diǎn)織入到目標(biāo)對(duì)象Introduction(引入):在不修改類代碼的前提下,Introduction可以在運(yùn)行期為類動(dòng)態(tài)地添加一些方法或Field.北京傳智播客教育
知識(shí)點(diǎn)4:代理總結(jié)spring在運(yùn)行期創(chuàng)建代理,不需要特殊的編譯器.spring有兩種代理方式:1.若目標(biāo)對(duì)象實(shí)現(xiàn)了若干接口,spring使用JDK的java.lang.reflect.Proxy類代理。2.若目標(biāo)對(duì)象沒有實(shí)現(xiàn)任何接口,spring使用CGLIB庫(kù)生成目標(biāo)對(duì)象的子類。使用該方式時(shí)需要注意:1.對(duì)接口創(chuàng)建代理優(yōu)于對(duì)類創(chuàng)建代理,因?yàn)闀?huì)產(chǎn)生更加松耦合的系統(tǒng)。對(duì)類代理是讓遺留系統(tǒng)或無法實(shí)現(xiàn)接口的第三方類庫(kù)同樣可以得到通知,這種方式應(yīng)該是備用方案。2.標(biāo)記為final的方法不能夠被通知。spring是為目標(biāo)類產(chǎn)生子類。任何需要被通知的方法都被復(fù)寫,將通知織入。final方法是不允許重寫的。
spring只支持方法連接點(diǎn):不提供屬性接入點(diǎn),spring的觀點(diǎn)是屬性攔截破壞了封裝。面向?qū)ο蟮母拍钍菍?duì)象自己處理工作,其他對(duì)象只能通過方法調(diào)用的得到的結(jié)果。北京傳智播客教育知識(shí)點(diǎn)5:使用CGLIB生成代理CGlib是一個(gè)強(qiáng)大的,高性能,高質(zhì)量的Code生成類庫(kù)。它可以在運(yùn)行期擴(kuò)展Java類與實(shí)現(xiàn)Java接口。importjava.lang.reflect.Method;xy.Enhancer;xy.MethodInterceptor;xy.MethodProxy;public
classUserManagerCglibProxyimplementsMethodInterceptor{privateObjecttargerObject;//代理的目標(biāo)對(duì)象
/***創(chuàng)建目標(biāo)對(duì)象的代理對(duì)象*@paramtargerObject目標(biāo)對(duì)象*@return*/
publicObjectcreateProxyInstance(ObjecttargerObject){
this.targerObject=targerObject;Enhancerenhancer=newEnhancer();//該類用于生成代理對(duì)象
enhancer.setSuperclass(this.targerObject.getClass());//設(shè)置父類
enhancer.setCallback(this);//設(shè)置回調(diào)用對(duì)象為本身
returnenhancer.create();//創(chuàng)建代理對(duì)象}北京傳智播客教育
使用CGLIB生成代理/***@paramobj目標(biāo)對(duì)象代理類的實(shí)例*@parammethod代理實(shí)例上調(diào)用父類方法的Method實(shí)例*@paramargs傳入到代理實(shí)例上方法參數(shù)值的對(duì)象數(shù)組*@parammethodProxy使用它調(diào)用父類的方法*@return*@throwsThrowable*/publicObjectintercept(Objectobj,Methodmethod,Object[]args,MethodProxymethodProxy)throwsThrowable{System.out.println("代理類"+obj.getClass());System.out.println("方法名稱"+method.getName());if(args!=null&&args.length>0){//方法的參數(shù)值
for(inti=0;i<args.length;i++){System.out.println("方法參數(shù)"+args[i]);}}Objectreturnvalue=null;//方法的返回值,無返回類型時(shí),為nullreturnvalue=methodProxy.invoke(this.targerObject,args);//調(diào)用目標(biāo)對(duì)象的方法System.out.println("方法的返回值"+returnvalue);returnreturnvalue;}}北京傳智播客教育
使用Spring進(jìn)行面向切面(AOP)編程要進(jìn)行AOP編程,首先我們要在spring的配置文件中引入aop命名空間:<beansxmlns=""xmlns:xsi=""xmlns:aop=""xsi:schemaLocation="/spring-beans-2.5.xsd/spring-aop-3.0.xsd"></beans>Spring提供了兩種切面使用方式,實(shí)際工作中我們可以選用其中一種:基于XML配置方式進(jìn)行AOP開發(fā)?;谧⒔夥绞竭M(jìn)行AOP開發(fā)。北京傳智播客教育
使用Spring進(jìn)行面向切面(AOP)編程要進(jìn)行AOP編程,需要引入的jar包*.sf.cglib-2.2.0.jarcglib代理*.aopalliance-1.0.0.jar*.aspectj.tools-1.6.6.RELEASE.jar*org.springframework.aop-3.0.2.RELEASE.jarspring的面向切面編程,提供AOP(面向切面編程)實(shí)現(xiàn)*org.springframework.aspects-3.0.2.RELEASE.jarspring提供對(duì)AspectJ框架的整合北京傳智播客教育
知識(shí)點(diǎn)6:基于XML配置—前置通知切面類定義如下publicclassSecurity{//切面publicvoidcheckSecurity(Stringusername,Stringpsw){//通知System.out.println("進(jìn)行安全檢查"+username+""+psw);}}配置文件如下<beanid="security"class="com.itcast.service.Security"/><!--定義切面對(duì)象--><beanid="userManager"class="com.itcast.service.UserManagerImpl"/><!--創(chuàng)建接口實(shí)現(xiàn)類對(duì)象--><aop:config><!--所有的切面和通知都必須定義在aop:config元素內(nèi)部--><aop:aspectref="security"><!--配置切面-->
<!--聲明切入點(diǎn)--><aop:pointcutid="userManagerPointcut"expression="execution(*com.itcast.service..*.save*(..))andargs(username,psw)"/>
<!--聲明前置通知,在匹配方法執(zhí)行前運(yùn)行--><aop:beforemethod="checkSecurity"pointcut-ref="userManagerPointcut"/></aop:aspect></aop:config>北京傳智播客教育
知識(shí)點(diǎn)7:基于XML配置—后置通知切面類定義如下publicclassSecurity{//切面publicvoidcheckSecurity(){//通知System.out.println("進(jìn)行安全檢查");}}配置文件如下<beanid="security"class="com.itcast.service.Security"/><!--定義切面對(duì)象--><beanid="userManager"class="com.itcast.service.UserManagerImpl"/><!--創(chuàng)建接口實(shí)現(xiàn)類對(duì)象-->
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年水電工程招投標(biāo)代理服務(wù)合同
- 2025年帶燈座項(xiàng)目投資可行性研究分析報(bào)告
- 制作度服務(wù)合同范例
- 2025年度綠色建筑項(xiàng)目施工資料審核承包合同范本
- 車輛出質(zhì)抵押合同范本
- 個(gè)人股東合作合同范本
- 2025年三相中頻電源行業(yè)深度研究分析報(bào)告
- 臨建混凝土勞務(wù)合同范本
- 2025年度工程合同風(fēng)險(xiǎn)預(yù)警與防控策略
- 加工彈簧合同范本
- 《工作場(chǎng)所安全使用化學(xué)品規(guī)定》
- 2022年菏澤醫(yī)學(xué)專科學(xué)校單招綜合素質(zhì)考試筆試試題及答案解析
- 市政工程設(shè)施養(yǎng)護(hù)維修估算指標(biāo)
- 課堂嵌入式評(píng)價(jià)及其應(yīng)用
- 《管理學(xué)基礎(chǔ)》完整版課件全套ppt教程(最新)
- 短視頻:策劃+拍攝+制作+運(yùn)營(yíng)課件(完整版)
- 基金會(huì)財(cái)務(wù)報(bào)表審計(jì)指引
- 藍(lán)色卡通風(fēng)好書推薦教育PPT模板
- 2022年江蘇省泰州市中考數(shù)學(xué)試題及答案解析
- 石家莊鐵道大學(xué)四方學(xué)院畢業(yè)設(shè)計(jì)46
- 智能化系統(tǒng)培訓(xùn)
評(píng)論
0/150
提交評(píng)論