




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
SpringAOP概述動(dòng)態(tài)代理基于代理類(lèi)的AOP實(shí)現(xiàn)基于XML的聲明式AspectJ基于注解的聲明式AspectJ第8章
SpringAOP2024/1/29學(xué)習(xí)目標(biāo)/Target2了解AOP的概念和作用
理解AOP術(shù)語(yǔ)
熟悉Spring中兩種動(dòng)態(tài)代理方式的區(qū)別
掌握基于代理類(lèi)的AOP實(shí)現(xiàn)掌握基于XML的聲明式AspectJ和
基于注解的聲明式AspectJ章節(jié)概述/Summary3Spring的AOP模塊是Spring框架體系中十分重要的內(nèi)容,該模塊一般適用于具有橫切邏輯的場(chǎng)景,如訪(fǎng)問(wèn)控制、事務(wù)管理和性能監(jiān)控等,本章將對(duì)SpringAOP的相關(guān)知識(shí)進(jìn)行詳細(xì)講解。目錄/CONTENTSSpringAOP概述基于XML的聲明式AspectJ基于代理類(lèi)的AOP實(shí)現(xiàn)動(dòng)態(tài)代理4基于注解的聲明式AspectJ14325SpringAOP概述01第8章SpringAOP什么是AOP?SpringAOP簡(jiǎn)介6
AOP的全稱(chēng)是Aspect-OrientedProgramming,即面向切面編程(也稱(chēng)面向方面編程)。它是面向?qū)ο缶幊蹋∣OP)的一種補(bǔ)充,目前已成為一種比較成熟的編程方式。在傳統(tǒng)的業(yè)務(wù)處理代碼中,通常都會(huì)進(jìn)行事務(wù)處理、日志記錄等操作。雖然使用OOP可以通過(guò)組合或者繼承的方式來(lái)達(dá)到代碼的重用,但如果要實(shí)現(xiàn)某個(gè)功能(如日志記錄),同樣的代碼仍然會(huì)分散到各個(gè)方法中。這樣,如果想要關(guān)閉某個(gè)功能,或者對(duì)其進(jìn)行修改,就必須要修改所有的相關(guān)方法。這不但增加了開(kāi)發(fā)人員的工作量,而且提高了代碼的出錯(cuò)率。為了解決這一問(wèn)題,AOP思想隨之產(chǎn)生。AOP采取橫向抽取機(jī)制,將分散在各個(gè)方法中的重復(fù)代碼提取出來(lái),然后在程序編譯或運(yùn)行時(shí),再將這些提取出來(lái)的代碼應(yīng)用到需要執(zhí)行的地方。這種采用橫向抽取機(jī)制的方式,采用傳統(tǒng)的OOP思想顯然是無(wú)法辦到的,因?yàn)镺OP只能實(shí)現(xiàn)父子關(guān)系的縱向的重用。雖然AOP是一種新的編程思想,但卻不是OOP的替代品,它只是OOP的延伸和補(bǔ)充。SpringAOP簡(jiǎn)介7未使用AOP的面向切面編程案例
例如,訂單系統(tǒng)中有添加訂單信息、更新訂單信息和刪除訂單信息3個(gè)方法,這3個(gè)方法中都包含事務(wù)管理業(yè)務(wù)代碼,訂單系統(tǒng)的邏輯如圖所示。Spring
AOP概述8SpringAOP簡(jiǎn)介9
AOP的使用,使開(kāi)發(fā)人員在編寫(xiě)業(yè)務(wù)邏輯時(shí)可以專(zhuān)心于核心業(yè)務(wù),而不用過(guò)多的關(guān)注于其他業(yè)務(wù)邏輯的實(shí)現(xiàn),這不但提高了開(kāi)發(fā)效率,而且增強(qiáng)了代碼的可維護(hù)性。類(lèi)與切面的關(guān)系A(chǔ)OP面向切面編程的優(yōu)勢(shì)
由訂單系統(tǒng)可知,添加訂單信息、修改訂單信息、刪除訂單信息的方法體中都包含事務(wù)管理的業(yè)務(wù)邏輯,這就帶來(lái)了一定數(shù)量的重復(fù)代碼并使程序的維護(hù)成本增加。基于AOP的面向切面編程,可以為此類(lèi)問(wèn)題提供解決方案,AOP可以將事務(wù)管理的業(yè)務(wù)邏輯從這三個(gè)方法體中抽取到一個(gè)可重用的模塊,進(jìn)而降低橫向業(yè)務(wù)邏輯之間的耦合,減少重復(fù)代碼。AOP的使用,使開(kāi)發(fā)人員在編寫(xiě)業(yè)務(wù)邏輯時(shí)可以專(zhuān)心于核心業(yè)務(wù),而不用過(guò)多地關(guān)注其他業(yè)務(wù)邏輯的實(shí)現(xiàn),不但提高了開(kāi)發(fā)效率,又增強(qiáng)了代碼的可維護(hù)性。Spring
AOP概述10AOP術(shù)語(yǔ)11Aspect:封裝的用于橫向插入系統(tǒng)功能(如事務(wù)、日志等)的類(lèi)Joinpoint:在程序執(zhí)行過(guò)程中的某個(gè)階段點(diǎn)Pointcut:切面與程序流程的交叉點(diǎn),即那些需要處理的連接點(diǎn)Advice(通知/增強(qiáng)處理):AOP框架在特定的切入點(diǎn)執(zhí)行的增強(qiáng)處理,即在定義好的切入點(diǎn)處所要執(zhí)行的程序代碼??梢詫⑵淅斫鉃榍忻骖?lèi)中的方法。TargetObject(目標(biāo)對(duì)象):指所有被通知的對(duì)象,也被稱(chēng)為被增強(qiáng)對(duì)象。如果AOP框架采用的是動(dòng)態(tài)的AOP實(shí)現(xiàn),那么該對(duì)象就是一個(gè)被代理對(duì)象。Proxy(代理):將通知應(yīng)用到目標(biāo)對(duì)象之后,被動(dòng)態(tài)創(chuàng)建的對(duì)象。Weaving(織入):將切面代碼插入到目標(biāo)對(duì)象上,從而生成代理對(duì)象的過(guò)程。AOP術(shù)語(yǔ)
AOP并不是一個(gè)新的概念,AOP中涉及很多術(shù)語(yǔ),如切面、連接點(diǎn)、切入點(diǎn)、通知/增強(qiáng)處理、目標(biāo)對(duì)象、織入、代理和引介等,下面針對(duì)AOP的常用術(shù)語(yǔ)進(jìn)行簡(jiǎn)單介紹。
Spring
AOP術(shù)語(yǔ)切面(Aspect)切面是指關(guān)注點(diǎn)形成的類(lèi)(關(guān)注點(diǎn)是指類(lèi)中重復(fù)的代碼),通常是指封裝的、用于橫向插入系統(tǒng)的功能類(lèi)(如事務(wù)管理、日志記錄等)。在實(shí)際開(kāi)發(fā)中,該類(lèi)被Spring容器識(shí)別為切面,需要在配置文件中通過(guò)<bean>元素指定。連接點(diǎn)(Joinpoint)連接點(diǎn)是程序執(zhí)行過(guò)程中某個(gè)特定的節(jié)點(diǎn),例如,某方法調(diào)用時(shí)或處理異常時(shí)。在SpringAOP中,一個(gè)連接點(diǎn)通常是一個(gè)方法的執(zhí)行。
切入點(diǎn)(Pointcut)當(dāng)某個(gè)連接點(diǎn)滿(mǎn)足預(yù)先指定的條件時(shí),AOP就能夠定位到這個(gè)連接點(diǎn),在連接點(diǎn)處插入切面,該連接點(diǎn)也就變成了切入點(diǎn)。通知/增強(qiáng)處理(Advice)通知/增強(qiáng)處理就是插入的切面程序代碼。可以將通知/增強(qiáng)處理理解為切面中的方法,它是切面的具體實(shí)現(xiàn)。12AOP術(shù)語(yǔ)
AOP并不是一個(gè)新的概念,AOP中涉及很多術(shù)語(yǔ),如切面、連接點(diǎn)、切入點(diǎn)、通知/增強(qiáng)處理、目標(biāo)對(duì)象、織入、代理和引介等,下面針對(duì)AOP的常用術(shù)語(yǔ)進(jìn)行簡(jiǎn)單介紹。
Spring
AOP術(shù)語(yǔ)目標(biāo)對(duì)象(Target)目標(biāo)對(duì)象是指被插入切面的方法,即包含主業(yè)務(wù)邏輯的類(lèi)對(duì)象。或者說(shuō)是被一個(gè)或者多個(gè)切面所通知的對(duì)象。織入(Weaving)將切面代碼插入到目標(biāo)對(duì)象上,從而生成代理對(duì)象的過(guò)程??椚肟梢栽诰幾g時(shí),類(lèi)加載時(shí)和運(yùn)行時(shí)完成。在編譯時(shí)進(jìn)行織入就是靜態(tài)代理,而在運(yùn)行時(shí)進(jìn)行織入則是動(dòng)態(tài)代理。代理(Proxy)將通知應(yīng)用到目標(biāo)對(duì)象之后,程序動(dòng)態(tài)創(chuàng)建的通知對(duì)象,就稱(chēng)為代理。代理類(lèi)既可能是和原類(lèi)具有相同接口的類(lèi),也可能就是原類(lèi)的子類(lèi),可以采用調(diào)用原類(lèi)相同的方式調(diào)用代理類(lèi)。引介(Introduction)引介是一種特殊的通知,它為目標(biāo)對(duì)象添加一些屬性和方法。這樣,即使一個(gè)業(yè)務(wù)類(lèi)原本沒(méi)有實(shí)現(xiàn)某一個(gè)接口,通過(guò)AOP的引介功能,也可以動(dòng)態(tài)地為該業(yè)務(wù)類(lèi)添加接口的實(shí)現(xiàn)邏輯,讓業(yè)務(wù)類(lèi)成為這個(gè)接口的實(shí)現(xiàn)類(lèi)。13動(dòng)態(tài)代理02第8章SpringAOPJDK動(dòng)態(tài)代理15
JDK動(dòng)態(tài)代理是通過(guò)java.lang.reflect.Proxy
類(lèi)來(lái)實(shí)現(xiàn)的,我們可以調(diào)用Proxy類(lèi)的newProxyInstance()方法來(lái)創(chuàng)建代理對(duì)象。對(duì)于使用業(yè)務(wù)接口的類(lèi),Spring默認(rèn)會(huì)使用JDK動(dòng)態(tài)代理來(lái)實(shí)現(xiàn)AOP。CGLIB代理16
通過(guò)前面的學(xué)習(xí)可知,JDK的動(dòng)態(tài)代理用起來(lái)非常簡(jiǎn)單,但它是有局限性的,使用動(dòng)態(tài)代理的對(duì)象必須實(shí)現(xiàn)一個(gè)或多個(gè)接口。
那么,如何代理沒(méi)有實(shí)現(xiàn)接口的類(lèi)?CGLIB代理17
CGLIB(CodeGenerationLibrary)是一個(gè)高性能開(kāi)源的代碼生成包,它采用非常底層的字節(jié)碼技術(shù),對(duì)指定的目標(biāo)類(lèi)生成一個(gè)子類(lèi),并對(duì)子類(lèi)進(jìn)行增強(qiáng)。
如果想代理沒(méi)有實(shí)現(xiàn)接口的類(lèi),那么可以使用CGLIB代理。
JDK動(dòng)態(tài)代理存在缺陷,它只能為接口創(chuàng)建代理對(duì)象,當(dāng)需要為類(lèi)創(chuàng)建代理對(duì)象時(shí),就需要使用CGLib(CodeGenerationLibrary)動(dòng)態(tài)代理,CGLib動(dòng)態(tài)代理不要求目標(biāo)類(lèi)實(shí)現(xiàn)接口,它采用底層的字節(jié)碼技術(shù),通過(guò)繼承的方式動(dòng)態(tài)創(chuàng)建代理對(duì)象。Spring的核心包已經(jīng)集成了CGLib所需要的包,所以開(kāi)發(fā)中不需要另外導(dǎo)入JAR包。JDK與CGLib動(dòng)態(tài)代理的比較18實(shí)現(xiàn)JDK動(dòng)態(tài)代理與CGLIB動(dòng)態(tài)代理的使用19需求說(shuō)明使用JDK動(dòng)態(tài)代理與CGLIB動(dòng)態(tài)代理,對(duì)業(yè)務(wù)方法的執(zhí)行過(guò)程進(jìn)行模擬權(quán)限檢查、日志記錄。共性問(wèn)題集中講解20常見(jiàn)問(wèn)題及解決辦法代碼規(guī)范問(wèn)題調(diào)試技巧共性問(wèn)題集中講解基于代理類(lèi)的AOP實(shí)現(xiàn)03第8章SpringAOPSpring的通知/增強(qiáng)類(lèi)型22org.springframework.aop.MethodBeforeAdvice(前置通知/增強(qiáng))
在目標(biāo)方法執(zhí)行前實(shí)施增強(qiáng),可以應(yīng)用于權(quán)限管理等功能。org.springframework.aop.AfterReturningAdvice(后置通知/增強(qiáng))
在目標(biāo)方法執(zhí)行后實(shí)施增強(qiáng),可以應(yīng)用于關(guān)閉流、上傳文件、刪除
臨時(shí)文件等功能。ercept.MethodInterceptor(環(huán)繞通知/增強(qiáng))
在目標(biāo)方法執(zhí)行前后實(shí)施增強(qiáng),可以應(yīng)用于日志、事務(wù)管理等功能。org.springframework.aop.ThrowsAdvice(異常拋出通知/增強(qiáng))
在方法拋出異常后實(shí)施增強(qiáng),可以應(yīng)用于處理異常記錄日志等功能。org.springframework.aop.IntroductionInterceptor(引介通知/增強(qiáng))
在目標(biāo)類(lèi)中添加一些新的方法和屬性,可以應(yīng)用于修改老版本程序。
Spring按照通知在目標(biāo)類(lèi)方法的連接點(diǎn)位置,可以分為5種類(lèi)型,具體如下:ProxyFactoryBean23
ProxyFactoryBean是FactoryBean接口的實(shí)現(xiàn)類(lèi),F(xiàn)actoryBean負(fù)責(zé)實(shí)例化一個(gè)Bean,而ProxyFactoryBean負(fù)責(zé)為其他Bean創(chuàng)建代理實(shí)例。在Spring中,使用ProxyFactoryBean是創(chuàng)建AOP代理的基本方式。ProxyFactoryBean類(lèi)中的常用可配置屬性如下:使用基于代理類(lèi)的AOP實(shí)現(xiàn)模擬權(quán)限檢查、
日志記錄功能24需求說(shuō)明使用基于代理類(lèi)的AOP對(duì)業(yè)務(wù)方法的執(zhí)行過(guò)程進(jìn)行模擬權(quán)限檢查、日志記錄。共性問(wèn)題集中講解25常見(jiàn)問(wèn)題及解決辦法代碼規(guī)范問(wèn)題調(diào)試技巧共性問(wèn)題集中講解基于XML的
聲明式AspectJ04第8章SpringAOPAspectJ開(kāi)發(fā)27
AspectJ是一個(gè)基于Java語(yǔ)言的AOP框架,它提供了強(qiáng)大的AOP功能。Spring2.0以后,SpringAOP引入了對(duì)AspectJ的支持,并允許直接使用AspectJ進(jìn)行編程,而Spring自身的AOPAPI也盡量與AspectJ保持一致。新版本的Spring框架,也建議使用AspectJ來(lái)開(kāi)發(fā)AOP。使用AspectJ實(shí)現(xiàn)AOP有兩種方式:一種是基于XML的聲明式AspectJ,另一種是基于注解的聲明式AspectJ。概述使用AOP代理對(duì)象的好處
因?yàn)镾pringAOP中的代理對(duì)象由IoC容器自動(dòng)生成,所以開(kāi)發(fā)者無(wú)須過(guò)多關(guān)注代理對(duì)象生成的過(guò)程,只需選擇連接點(diǎn)、創(chuàng)建切面、定義切點(diǎn)并在XML文件中添加配置信息即可。Spring提供了一系列配置SpringAOP的XML元素。
基于XMl的AOP實(shí)現(xiàn)28配置SpringAOP的XML元素29元素描述<aop:config>SpringAOP配置的根元素<aop:aspect>配置切面<aop:advisor>配置通知器<aop:pointcut>配置切點(diǎn)<aop:before>配置前置通知,在目標(biāo)方法執(zhí)行前實(shí)施增強(qiáng),可以應(yīng)用于權(quán)限管理等功能<aop:after>配置后置通知,在目標(biāo)方法執(zhí)行后實(shí)施增強(qiáng),可以應(yīng)用于關(guān)閉流、上傳文件、刪除臨時(shí)文件等功能<aop:around>配置環(huán)繞方式,在目標(biāo)方法執(zhí)行前后實(shí)施增強(qiáng),可以應(yīng)用于日志、事務(wù)管理等功能<aop:after-returning>配置返回通知,在目標(biāo)方法成功執(zhí)行之后調(diào)用通知<aop:after-throwing>配置異常通知,在方法拋出異常后實(shí)施增強(qiáng),可以應(yīng)用于處理異常記錄日志等功能基于XML的聲明式AspectJ是指通過(guò)XML文件來(lái)定義切面、切入點(diǎn)及通知,所有的切面、切入點(diǎn)和通知都必須定義在<aop:config>元素內(nèi)。基于XML的聲明式AspectJ30<aop:config>元素及其子元素如下:小提示:圖中灰色部分標(biāo)注的元素即為常用的配置元素
XML文件中常用元素的配置方式如下:基于XML的聲明式AspectJ31<beanid="myAspect"class="com.test.aspectj.xml.MyAspect"/><aop:config><aop:aspectid="aspect"ref="myAspect"><aop:pointcutexpression="execution(*com.test.jdk.*.*(..))“id="myPointCut"/><aop:beforemethod="myBefore"pointcut-ref="myPointCut"/><aop:after-returningmethod="myAfterReturning“pointcut-ref="myPointCut" returning="returnVal"/><aop:aroundmethod="myAround"pointcut-ref="myPointCut"/><aop:after-throwingmethod="myAfterThrowing“pointcut-ref="myPointCut" throwing="e"/><aop:aftermethod="myAfter"pointcut-ref="myPointCut"/></aop:aspect></aop:config>定義切面Bean配置切面配置切入點(diǎn)配置通知配置切面
在Spring的配置文件中,配置切面使用的是<aop:aspect>元素,該元素會(huì)將一個(gè)已定義好的SpringBean轉(zhuǎn)換成切面Bean,因此,在使用<aop:aspect>元素之前,要在配置文件中先定義一個(gè)普通的SpringBean。SpringBean定義完成后,通過(guò)<aop:aspect>元素的ref屬性即可引用該Bean。配置<aop:aspect>元素時(shí),通常會(huì)指定id和ref兩個(gè)屬性。
基于XML的聲明式AspectJ32<aop:aspect>元素的id屬性和ref屬性的描述基于XML的聲明式AspectJ33屬性名稱(chēng)描述id用于定義該切面的唯一標(biāo)識(shí)ref用于引用普通的SpringBean配置切入點(diǎn)
在Spring的配置文件中,切入點(diǎn)是通過(guò)<aop:pointcut>元素來(lái)定義的。當(dāng)<aop:pointcut>元素作為<aop:config>元素的子元素定義時(shí),表示該切入點(diǎn)是全局的,它可被多個(gè)切面共享;當(dāng)<aop:pointcut>元素作為<aop:aspect>元素的子元素時(shí),表示該切入點(diǎn)只對(duì)當(dāng)前切面有效。定義<aop:pointcut>元素時(shí),通常會(huì)指定id、expression屬性。
基于XML的聲明式AspectJ34<aop:pointcut>元素的id屬性和expression屬性描述基于XML的聲明式AspectJ35屬性名稱(chēng)描述id用于指定切入點(diǎn)的唯一標(biāo)識(shí)expression用于指定切入點(diǎn)關(guān)聯(lián)的切入點(diǎn)表達(dá)式基于XML的聲明式AspectJ36切入點(diǎn)表達(dá)式
execution(*com.test.jdk.*.*(..))是定義的切入點(diǎn)表達(dá)式,該切入點(diǎn)表達(dá)式的意思是匹配com.test.jdk包中任意類(lèi)的任意方法的執(zhí)行。execution(modifiers-pattern?ret-type-patterndeclaring-type-pattern?name-pattern(param-pattern)throws-pattern?)表達(dá)式的主體返回類(lèi)型,使用*代表所有類(lèi)型需要攔截的包名類(lèi)名,使用*代表所有類(lèi)方法名,使用*代表所有方法方法的參數(shù),其中的“..”表示任意參數(shù)注意:這里有一個(gè)空格切入點(diǎn)表達(dá)式的基本格式:定義的目標(biāo)方法的訪(fǎng)問(wèn)修飾符,如public、private等定義的目標(biāo)方法的返回值類(lèi)型,如void、String等定義的目標(biāo)方法的類(lèi)路徑,如com.test.jdk.UserDaoImpl具體需要被代理的目標(biāo)方法,如add()方法需要被代理的目標(biāo)方法包含的參數(shù)需要被代理的目標(biāo)方法拋出的異常類(lèi)型小提示:帶有問(wèn)號(hào)(?)的部分表示可配置項(xiàng),而其他部分屬于必須配置項(xiàng)。execution表達(dá)式各部分參數(shù)說(shuō)明modifiers-pattern:表示定義的目標(biāo)方法的訪(fǎng)問(wèn)修飾符,如public、private等。ret-type-pattern:表示定義的目標(biāo)方法的返回值類(lèi)型,如void、String等。declaring-type-pattern:表示定義的目標(biāo)方法的類(lèi)路徑,如com.test.jdk.UserDaoImpl。name-pattern:表示具體需要被代理的目標(biāo)方法,如add()方法。param-pattern:表示需要被代理的目標(biāo)方法包含的參數(shù),本章示例中目標(biāo)方法參數(shù)都為空。throws-pattern:表示需要被代理的目標(biāo)方法拋出的異常類(lèi)型。
基于XML的聲明式AspectJ37execution(modifiers-pattern?ret-type-patterndeclaring-type-pattern?name-pattern(param-pattern)throws-pattern?)配置通知
在Spring的配置文件中,使用<aop:aspect>元素配置了5種常用通知,分別為前置通知、后置通知、環(huán)繞通知、返回通知和異常通知。
基于XML的聲明式AspectJ38<aop:aspect>元素的常用屬性基于XML的聲明式AspectJ39屬性描述pointcut該屬性用于指定一個(gè)切入點(diǎn)表達(dá)式,Spring將在匹配該表達(dá)式的連接點(diǎn)時(shí)織入該通知。pointcut-ref該屬性指定一個(gè)已經(jīng)存在的切入點(diǎn)名稱(chēng),如配置代碼中的myPointCut。通常pointcut和pointcut-ref兩個(gè)屬性只需要使用其中一個(gè)即可。method該屬性指定一個(gè)方法名,指定將切面Bean中的該方法轉(zhuǎn)換為增強(qiáng)處理。throwing該屬性只對(duì)<after-throwing>元素有效,它用于指定一個(gè)形參名,異常通知方法可以通過(guò)該形參訪(fǎng)問(wèn)目標(biāo)方法所拋出的異常。returning該屬性只對(duì)<after-returning>元素有效,它用于指定一個(gè)形參名,后置通知方法可以通過(guò)該形參訪(fǎng)問(wèn)目標(biāo)方法的返回值。使用SpringAOP實(shí)現(xiàn)日志記錄功能40需求說(shuō)明使用前置增強(qiáng)處理和后置增強(qiáng)處理對(duì)業(yè)務(wù)方法的執(zhí)行過(guò)程進(jìn)行日志記錄。提示(1)在項(xiàng)目中添加與Spring
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 舊小區(qū)出嫁改造方案
- 樓房分割拆除方案
- 物業(yè)燃?xì)獍踩a(chǎn)方案
- 倉(cāng)庫(kù)電力改造工程方案
- 人員監(jiān)管措施方案模板
- 商業(yè)養(yǎng)老產(chǎn)品測(cè)評(píng)方案
- 醫(yī)院用電接入方案
- 樓梯贈(zèng)送空間裝修方案
- 防物資門(mén)店管理方案
- 2025年綜合類(lèi)-交通運(yùn)輸管理-水路運(yùn)輸歷年真題摘選帶答案(5卷單選題100道)
- 兒科護(hù)士考試試題及答案
- 農(nóng)藥 知識(shí)培訓(xùn)課件下載
- 創(chuàng)新社區(qū)管樂(lè)團(tuán)活動(dòng)方案
- 中國(guó)農(nóng)田水利行業(yè)發(fā)展前景及發(fā)展策略與投資風(fēng)險(xiǎn)研究報(bào)告2025-2028版
- 鴕鳥(niǎo)養(yǎng)殖場(chǎng)管理制度
- 余料使用管理制度
- 小學(xué)生自信成長(zhǎng)的課件
- 農(nóng)業(yè)面源防治課件
- 設(shè)計(jì)院培訓(xùn)管理制度
- 2025至2030中國(guó)氨基吡啶行業(yè)項(xiàng)目調(diào)研及市場(chǎng)前景預(yù)測(cè)評(píng)估報(bào)告
- 2025-2030中國(guó)商業(yè)展示道具市場(chǎng)應(yīng)用前景及投資價(jià)值評(píng)估報(bào)告
評(píng)論
0/150
提交評(píng)論