電商Web平臺開發(fā) 課件 項目一 搭建電商平臺Spring業(yè)務(wù)層_第1頁
電商Web平臺開發(fā) 課件 項目一 搭建電商平臺Spring業(yè)務(wù)層_第2頁
電商Web平臺開發(fā) 課件 項目一 搭建電商平臺Spring業(yè)務(wù)層_第3頁
電商Web平臺開發(fā) 課件 項目一 搭建電商平臺Spring業(yè)務(wù)層_第4頁
電商Web平臺開發(fā) 課件 項目一 搭建電商平臺Spring業(yè)務(wù)層_第5頁
已閱讀5頁,還剩161頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

模塊一基礎(chǔ)技能訓練模塊《電商web云平臺開發(fā)》思維導圖搭建電商平臺Spring業(yè)務(wù)層搭建電商平臺的Web項目—SpringMVC展示層搭建電商平臺數(shù)據(jù)處理MyBatis項目1目錄CONTENTS23電商平臺SSM三層框架整合4項目一

搭建電商平臺Spring業(yè)務(wù)層項目背景SSM框架是Spring+SpringMVC+MyBatis三大框架的整合,是目前比較主流的JavaEE企業(yè)級框架,用于搭建各種大小型的企業(yè)級應(yīng)用系統(tǒng)。Spring是一個控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架,SpringMVC是一個基于MVC設(shè)計模式的輕量級web框架,MyBatis是一個基于java的持久層框架。SpringSpringMVCMyBatisSSM框架本章節(jié)主要針對Spirng框架的學習和應(yīng)用做詳細的講解,故本章主要研究內(nèi)容如下:研究內(nèi)容認知Spring概念、作用、特性Spring的IOC和依賴注入Spring的AOP實現(xiàn)模式學習目標1.了解Spring結(jié)構(gòu)體系;2.理解Spring與IoC的概念和思想;3.認識SpringAOP(面像切面編程)。知識目標1.能夠熟練使用Spring配置文件進行配置;2.能夠熟練使用BeanFactory等方法實現(xiàn)Bean的裝備;3.能夠熟練使用基于XML方式的DI、基于注解的DI;4.能夠熟練使用自動代理、Spring-Aop的切面、Spring-AspectJ配置事務(wù)管理。技能目標1.培養(yǎng)學生的主動性、執(zhí)行力;2.鍛煉學生工作中膽大心細;3.鍛煉學生邏輯思維能力;4.培養(yǎng)學生有探索創(chuàng)新精神。素養(yǎng)目標任務(wù)一認知Spring概念、作用、特性預備知識一、Spring框架介紹面向切面(AOP)依賴注入(DI)輕量級的控制反轉(zhuǎn)(IoC)Spring框架Spring框架是為了解決企業(yè)應(yīng)用開發(fā)的復雜性而誕生的,它簡化了Java應(yīng)用開發(fā),提高了開發(fā)的可測試性和可重用性。簡單來說,Spring是一個輕量級的控制反轉(zhuǎn)(IoC)、依賴注入(DI)和面向切面(AOP)的容器框架。預備知識一、Spring框架介紹2314控制反轉(zhuǎn)(IoC)控制反轉(zhuǎn)是一種編程思想,也是一種軟件設(shè)計思想。事務(wù)事務(wù)是一系列操作合起來的總稱,是為了保證數(shù)據(jù)的完整性而出現(xiàn)的一種工具。依賴注入(DI)依賴注入使用“反射”等底層技術(shù),根據(jù)類名生成相應(yīng)的對象,注入依賴項和執(zhí)行方法。面向切面編程(AOP)面向切面的編程思想是將這些輔助功能封裝成切面,利用AOP容器的功能將切面織入到主要業(yè)務(wù)邏輯中。Spring框架特點預備知識一、Spring框架介紹原子性(atomicity)AB一致性(consistency)事務(wù)必須具有四大特征C隔離性(isolation)D持久性(durability)預備知識二、Spring概念為代碼“解耦”降低代碼間的耦合度提高靈活性Spring主要作用主業(yè)務(wù)邏輯代碼系統(tǒng)級業(yè)務(wù)邏輯代碼系統(tǒng)代碼分類預備知識二、Spring概念I(lǐng)oC使得主業(yè)務(wù)在相互調(diào)用過程中,不需要再自己創(chuàng)建使用對象了,統(tǒng)一由Spring容器管理,以自動“注入”的方式完成“織入”,使得系統(tǒng)級服務(wù)得到了最大復用,且不用再由程序員手工將系統(tǒng)級服務(wù)“混雜”到主業(yè)務(wù)邏輯中了。IoC

01AOP02降低耦合度的方式預備知識二、Spring概念數(shù)據(jù)訪問/集成Web與遠程調(diào)用面向切面編程應(yīng)用服務(wù)器設(shè)備管理消息發(fā)送核心容器測試Spring框架是由20多個模塊組成預備知識二、Spring概念核心體系中,從下往上,各部分依次是Test、CoreContainer、AOP、Aspects、DataAccess/Integartion五部分。是Spring對數(shù)據(jù)訪問層的統(tǒng)一和封裝DataAccess/Integartion是Spring對AspectJ框架的整合Aspects對應(yīng)spring-aop.jarAOPSpring的核心組件CoreContainerSpring提供的測試工具Test32154實施準備要在Java項目中使用Spring框架,首先需要安裝jdk,來搭建java的開發(fā)環(huán)境,本項目采用的jdk版本為1.8。然后需要前往Spring的官網(wǎng)下載Spring的核心包,最后創(chuàng)建JavaProject并導入下載到本地的Spring框架核心jar包。至此Spring學習的準備工作就好了。任務(wù)實施與分析步驟1:jdk的安裝和環(huán)境變量的配置我的電腦A屬性B高級C環(huán)境變量D系統(tǒng)變量E添加環(huán)境變量F注意:添加和修改的是下面的系統(tǒng)變量,并非上面的用戶變量;“Path”是首字母大寫,不能改成“PATH”,bin后面要有分號“;”;用戶變量中不要有其他“JAVA_HOME”和“Path”,以避免被干擾。任務(wù)實施與分析步驟2:Spring相關(guān)的核心包步驟2.1:下載Spring相關(guān)的核心包進入Spring官網(wǎng)選擇“4.3.14.RELEASE/”選擇“spring-framework-4.3.14.RELEASE-dist.zip”下載解壓并雙擊打開任務(wù)實施與分析步驟2:Spring相關(guān)的核心包步驟2.1:下載Spring相關(guān)的核心包雙擊打開壓縮包之后,會看到有3個文件夾和3個TXT文件,它們分別是:

docs:文檔文件夾

libs:jar包文件夾

schema:約束文件夾

license.txt:許可

notice.txt:注意

readme.txt:說明在我們的生活中,有很多的人都會使用盜版軟件,使用盜版軟件對正版公司的權(quán)力受到了侵害,那么使用盜版的軟件侵害的是對方的著作權(quán)嗎?思政小課堂從法律的角度來看,如果是使用盜版軟件的話一般屬于侵權(quán),但是情節(jié)比較輕微。從目前的市場上的大眾行為來看,常見的盜版行為主要有生產(chǎn)商仿制軟件光盤、銷售商在所售計算機中預裝軟件、互聯(lián)網(wǎng)在線軟件盜版、用戶未經(jīng)著作權(quán)人授權(quán)使用軟件、將只讀光盤中的軟件進行復制并銷售等。如果已經(jīng)使用了盜版的軟件,這個時候侵害的就是對方的著作權(quán),也是知識產(chǎn)權(quán),但是使用軟件只是侵權(quán)行為非常輕微的情況,一般不需要承擔比較嚴重的法律責任。拓展知識一、Spring中jar包的作用Spring中有很多包,使用Spring框架不必引入所有的jara包,要使用基本功能的話,只需要圖中選中的最基本的四個jar包即可。拓展知識一、Spring中jar包的作用

spring-core.jar:spring其他組件都要使用到這個包里的類,是其他組件的基本核心

spring-beans.jar:所有應(yīng)用都需要使用

spring-aop.jar:使用基于AOP的Spring特性,如聲明型事務(wù)管理等

spring-context.jar:為Spring核心提供了大量擴展

spring-jdbc.jar:包含對Spring對JDBC數(shù)據(jù)訪問進行封裝的所有類

SpringAspects:提供的對AspectJ框架的整合

Springexpression:Spring表達式語言

SpringInstrument:Spring對服務(wù)器的代理接口拓展知識一、Spring中jar包的作用

spring-instrument-tomcat:Spring對tomcat連接池的集成

SpringJMS:為簡化Jmsapi的使用做的簡單封裝

Springorm:封裝第三方orm實現(xiàn)

Springoxm:Spring對于Object/XML映射的支持,可以讓JAVA與XML之間來回切換

Springtest:對JUnit等測試框架的簡單封裝

Springtx:為JDBC、Hibernate、JDO、JPA等提供的一致的聲明式和編程式事務(wù)管理

Springweb:包含Web應(yīng)用開發(fā)時,用到Spring框架時所需的核心類

Springwebmvc:包含SpringMVC框架相關(guān)的所有類拓展知識二、Spring中都用到了哪些設(shè)計模式裝飾器模式適配器模式觀察者模式模板方法模式代理模式工廠設(shè)計模式單例設(shè)計模式思考與總結(jié)什么是Spring框架?其特點是什么?能力提升本章開始我們將建立一個電商網(wǎng)站項目,該項目基于SSM框架開發(fā),通過各個章節(jié)的學習將逐步完善該電商網(wǎng)站項目,本章將引導同學們創(chuàng)建項目并引入Spring框架,請同學們完善電商網(wǎng)站項目的以下內(nèi)容:

搭建java運行環(huán)境,保證jdk安裝成功,查看jdk版本狀態(tài);

創(chuàng)建JavaProject項目;

從官網(wǎng)下載Spring相關(guān)的jar包;

將Spring相關(guān)的jar包導入項目,并添加至構(gòu)建路徑。任務(wù)訓練1.在開發(fā)工具中創(chuàng)建自己的電商網(wǎng)站項目Javaproject;2.將下載好的Spring相關(guān)jar包導入到項目中?!峨娚蘷eb云平臺開發(fā)》感謝觀看!模塊一基礎(chǔ)技能訓練模塊《電商web云平臺開發(fā)》思維導圖搭建電商平臺Spring業(yè)務(wù)層搭建電商平臺的Web項目—SpringMVC展示層搭建電商平臺數(shù)據(jù)處理MyBatis項目1目錄CONTENTS23電商平臺SSM三層框架整合4項目一

搭建電商平臺Spring業(yè)務(wù)層項目背景SSM框架是Spring+SpringMVC+MyBatis三大框架的整合,是目前比較主流的JavaEE企業(yè)級框架,用于搭建各種大小型的企業(yè)級應(yīng)用系統(tǒng)。Spring是一個控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架,它最主要的使命就是為了簡化java開發(fā),通過其核心的的Beanfactory實現(xiàn)底層類的實例化和生命周期管理。SpringMVC是一個基于MVC設(shè)計模式的輕量級web框架,由于SpringMVC是Spring框架的一部分,所以可以與Spring框架無縫集成。MyBatis是一個基于java的持久層框架,因為它的內(nèi)部封裝了JDBC,所以MyBatis可以通過注解或XML的方式進行配置,最后執(zhí)行SQL語句并將結(jié)果映射成Java對象返回。本章節(jié)主要針對Spirng框架的學習和應(yīng)用做詳細的講解,故本章主要研究內(nèi)容如下:研究內(nèi)容認知Spring概念、作用、特性Spring的IOC和依賴注入Spring的AOP實現(xiàn)模式學習目標1.了解Spring結(jié)構(gòu)體系;2.理解Spring與IOC的概念和思想;3.認識SpringAOP(面像切面編程)。知識目標1.能夠熟練使用Spring配置文件進行配置;2.能夠熟練使用BeanFactory等方法實現(xiàn)Bean的裝備;3.能夠熟練使用基于XML方式的DI;4.能夠熟練使用基于注解的DI;5.能夠熟練使用自動代理;6.能夠熟練使用Spring-Aop的切面;7.能夠熟練使用Spring-AspectJ配置事務(wù)管理。技能目標1.培養(yǎng)學生的主動性、執(zhí)行力;2.鍛煉學生工作中膽大心細;3.鍛煉學生邏輯思維能力;4.培養(yǎng)學生有探索創(chuàng)新精神。素養(yǎng)目標任務(wù)二Spring的IoC和依賴注入預備知識一、控制反轉(zhuǎn)和依賴注入的概念控制反轉(zhuǎn)(IoC):控制權(quán)的轉(zhuǎn)移就是所謂的反轉(zhuǎn),指依賴對象的控制權(quán)從應(yīng)用程序本身轉(zhuǎn)移到外部容器,其實現(xiàn)策略一般有依賴查找和依賴注入兩種。依賴查找(DL):是JavaEE中傳統(tǒng)的依賴管理方式,首先需要注冊依賴或服務(wù),然后再通過容器提供的API查找依賴對象和資源。依賴查找依賴注入控制反轉(zhuǎn)預備知識一、控制反轉(zhuǎn)和依賴注入的概念依賴注入:依賴對象通過注入的方式進行創(chuàng)建,由容器負責組建和注入,即程序在運行時,若需要調(diào)用另一個對象進行協(xié)助時,不用重新創(chuàng)建被調(diào)用者代碼,直接依賴外部容器創(chuàng)建后傳遞給程序,這是更為流行的IoC實現(xiàn)策略。實施準備

認識了Spring容器在框架中的作用及配置,掌握了Spring的基礎(chǔ)配置及Jar包目錄結(jié)構(gòu)相關(guān)的知識點,通過下載安裝jdk,配置環(huán)境變量,為本任務(wù)的開展做好前期準備工作。接下來,將開啟Spring的IoC和依賴注入的相關(guān)學習任務(wù)。任務(wù)實施與分析創(chuàng)建javaproject步驟1.1步驟1.3步驟1.2導入核心jar包導入日志相關(guān)的jar包步驟1:導入核心jar包任務(wù)實施與分析步驟3.1創(chuàng)建Spring配置文件。步驟2.1:步驟3.2在applicationContext.xml配置文件中注冊Service。步驟2.2步驟2:定義接口與實體類新建com.freamwork.service包,在com.freamwork.service包下定義ISomeService接口。創(chuàng)建SomeServiceImpl實現(xiàn)類實現(xiàn)ISomeService接口。步驟3:創(chuàng)建Spring配置文件任務(wù)實施與分析步驟4定義測試類在src下建立com.framework.test包,并創(chuàng)建MyTest.java類編寫測試內(nèi)容后執(zhí)行。步驟4.1步驟5.1查看ApplicationContext與BeanFactory接口容器并掌握他們的區(qū)別步驟4.2創(chuàng)建SomeServiceImpl實現(xiàn)類實現(xiàn)ISomeService接口。步驟5.2配置注冊Service。步驟5.3創(chuàng)建ISomeService接口的doSome方法。步驟5掌握bean的默認裝配方式步驟5.4編寫測試類。任務(wù)實施與分析步驟9:bean后處理器步驟9.1:創(chuàng)建ISomeService接口。步驟9.2:創(chuàng)建SomeServiceImpl實現(xiàn)類實現(xiàn)ISomeService接口。步驟9.3:創(chuàng)建MyBeanPostProcessor類實現(xiàn)BeanPostProcessor。步驟9.4:實現(xiàn)執(zhí)行目標方法。步驟9.5:配置注冊Bean后處理器。步驟9.6:編寫測試類測試。步驟6:動態(tài)工廠Bean步驟6.1:將動態(tài)工廠Bean作為普通Bean使用。步驟6.2:使用Spring的動態(tài)工廠Bean。步驟7:靜態(tài)工廠Bean步驟8:容器中bean的作用域步驟8.1:注冊Service單例模式。步驟8.2:編寫測試類并運行。任務(wù)實施與分析步驟10:了解并定制bean的生命始末步驟11:bean的生命周期步驟11.1:注冊Service,為adao和bdao注入指aaa,bbb步驟11.2:SomeServiceImpl的實現(xiàn)步驟12:注入分類步驟12.1:設(shè)值注入步驟12.2:構(gòu)造注入步驟13:對于域?qū)傩宰詣幼⑷氩襟E14:使用SpEL注入步驟15:使用同類抽象Bean注入步驟16:使用異類抽象Bean注入步驟17:為應(yīng)用指定多個Spring配置文件步驟18:定義Bean@Component注解步驟18.1:導入AOP的Jar包步驟18.2:更換配置文件頭步驟18.3:在Spring配置文件中配置組件掃描器步驟18.4:在類上使用注解@Component任務(wù)實施與分析步驟21:按類型注入域?qū)傩訞Autowired步驟19:Bean的作用域@Scope步驟20:基本類型屬性注入@Value步驟22:按名稱注入域?qū)傩訞Autowired與@Qualifier步驟23:域?qū)傩宰⒔釦Resource拓展知識一、實例化Bean的三種方式實例化Bean的方式默認無參構(gòu)造函數(shù)(推薦)靜態(tài)工廠模式動態(tài)工廠模式<beanid="StudentBeanFactory"class="com.framework.di07.StudentBeanFactory"></bean><beanid="myStudent3"factory-bean=”StudentBeanFactory”factory-method=”constructorStudentBean”></bean><beanid="myStudent2"class="com.framework.di07.StudentBeanFactory"factory-method=”staticStudentBean”></bean><beanid="myStudent"class="com.framework.di07.Student"></bean>拓展知識二、IoC和DI常用的幾個注解(一)IoC注解■@Component:屬性有value,指定bean的id,如果不指定value屬性,默認bean的id是當前類的類名,首字母小寫?!鯜Controller:一般用于表現(xiàn)層;■@Service:用于業(yè)務(wù)層;■@Repository:用于持久層。(二)DI注解■@Autowired(默認按類型裝配)相當于<propertyname=""ref="">?!鯜Resource(默認按名稱裝配)相當于<propertyname=""value="">。拓展知識三、Spring擴展接口BeanPostProcessor接口BeanFactoryPostProcessor接口InitializingBean接口FactoryBean接口思考與總結(jié)同學們通過以上操作,完成了對Spring的IoC和DI的學習,請同學們在此基礎(chǔ)上,體會學習過程,進行思考并回答以下問題:Spring的作用是什么?Bean工廠創(chuàng)建Bean的三種方式都有哪些?請回答IoC最大的好處是什么?能力提升在上一節(jié)中,我們已經(jīng)對電商網(wǎng)站項目引入了Spring框架開發(fā)的相關(guān)jar包,本節(jié)將對電商網(wǎng)站項目的商品類別業(yè)務(wù)進行實現(xiàn),請同學們結(jié)合本節(jié)所學內(nèi)容,繼續(xù)完成電商網(wǎng)站項目的以下內(nèi)容:能力提升1.創(chuàng)建商品類別的業(yè)務(wù)接口CategoryService,定義商品類別查詢方法;2.創(chuàng)建商品類別的接口實現(xiàn)類CategoryServiceImpl,實現(xiàn)商品類別的查詢方法,輸出任意字符串;3.創(chuàng)建Spring的配置文件并進行Service注冊;4.定義測試類,執(zhí)行商品類別查詢方法。1234任務(wù)訓練1.練習在Spring配置文件中對Service類進行注冊。2.創(chuàng)建商品查詢的業(yè)務(wù)接口與業(yè)務(wù)實現(xiàn)類。3.驗證商品業(yè)務(wù)表的查詢結(jié)果,在控制臺中輸出查詢結(jié)果。任務(wù)訓練掃碼進入課程網(wǎng)站,獲取對應(yīng)任務(wù)單,閱讀任務(wù)目標,根據(jù)任務(wù)步驟,完成拓展任務(wù)并提交?!峨娚蘷eb云平臺開發(fā)》感謝觀看!模塊一基礎(chǔ)技能訓練模塊《電商web云平臺開發(fā)》思維導圖目錄CONTENTS搭建電商平臺Spring業(yè)務(wù)層搭建電商平臺的Web項目—SpringMVC展示層搭建電商平臺數(shù)據(jù)處理MyBatis項目123電商平臺SSM三層框架整合4項目一

搭建電商平臺Spring業(yè)務(wù)層項目背景SSM框架是Spring+SpringMVC+MyBatis三大框架的整合,是目前比較主流的JavaEE企業(yè)級框架,用于搭建各種大小型的企業(yè)級應(yīng)用系統(tǒng)。Spring是一個控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架,SpringMVC是一個基于MVC設(shè)計模式的輕量級web框架,MyBatis是一個基于java的持久層框架。SpringSpringMVCMyBatisSSM框架本章節(jié)主要針對Spirng框架的學習和應(yīng)用做詳細的講解,故本章主要研究內(nèi)容如下:研究內(nèi)容認知Spring概念、作用、特性Spring的IOC和依賴注入Spring的AOP實現(xiàn)模式學習目標1.了解Spring結(jié)構(gòu)體系;2.理解Spring與IoC的概念和思想;3.認識SpringAOP(面像切面編程)。知識目標1.能夠熟練使用Spring配置文件進行配置;2.能夠熟練使用BeanFactory等方法實現(xiàn)Bean的裝備;3.能夠熟練使用基于XML方式的DI、基于注解的DI;4.能夠熟練使用自動代理、Spring-Aop的切面、Spring-AspectJ配置事務(wù)管理。技能目標1.培養(yǎng)學生的主動性、執(zhí)行力;2.鍛煉學生工作中膽大心細;3.鍛煉學生邏輯思維能力;4.培養(yǎng)學生有探索創(chuàng)新精神。素養(yǎng)目標任務(wù)三Spring的AOP實現(xiàn)模式預備知識一、AOP簡介ABC日志記錄安全控制參數(shù)校驗GFED事務(wù)處理統(tǒng)一異常處理緩存:實現(xiàn)緩存存取和清除統(tǒng)一發(fā)信、聽通知預備知識二、AOP編程術(shù)語切面(Aspect)泛指交叉業(yè)務(wù)邏輯。實際就是對主業(yè)務(wù)邏輯的一種增強??椚耄╓eaving)是指將切面代碼插入到目標對象的過程。連接點(JoinPoint)指可以被切面織入的方法。通常業(yè)務(wù)接口中的方法均為連接點。切入點(Pointcut)被標記為final的方法是不能作為連接點與切入點的。目標對象(Target)指將要被增強的對象,即包含主業(yè)務(wù)邏輯的類的對象。通知(Advice)是切面的一種實現(xiàn),可以完成簡單織入功能。顧問(Advisor)是切面的另一種實現(xiàn)是將通知包裝為更復雜切面的裝配器。預備知識三、了解AspectJCBA編譯后利用ajc編譯器向.class文件和.jar文件中織入增強代碼編譯時使用ajc編譯器替代javac編譯器,在源文件編譯成.class文件時織入增強代碼加載時利用aspectjweaver.jar,使用動態(tài)dialing的方式在類加載期間織入切面AspectJ不同階段的實現(xiàn)方式:(一)AspectJ的簡介預備知識三、了解AspectJ(二)AspectJ的切入點表達式04010302

[declaring-type-pattern]全限定性類名name-pattern(param-pattern)方法名(參數(shù)名)

execution[modifiers-pattern]訪問權(quán)限類型

ret-type-pattern返回值類型注意:表達式中加[]的部分表示可省略部分,各部分間用空格分開。預備知識三、了解AspectJ(二)AspectJ的切入點表達式符號意義*0至多個任意字符..用在方法參數(shù)中,標識任意多個參數(shù),用在包名后,表示當前包及其子包路徑+用在類名后,標識當前類及其子類,用在接口后,標識當前接口及其實現(xiàn)類表達式中還可以使用以下符號舉例execution(*set*(..))指定切入點為:任何一個以“set”開始的方法。預備知識四、了解Spring事務(wù)管理的接口(一)事務(wù)管理器接口是PlatformTransactionManager接口對象,其主要功能是實現(xiàn)完成事務(wù)的提交、回滾及獲取事務(wù)的狀態(tài)信息。預備知識四、了解Spring事務(wù)管理的接口(一)事務(wù)管理器接口DataSourceTransactionManager使用JDBC或iBatis進行持久化數(shù)據(jù)時使用HibernateTransactionManager使用Hibernate進行持久化數(shù)據(jù)時使用1.PlatformTransactionManager接口的兩個實現(xiàn)類LOREM預備知識四、了解Spring事務(wù)管理的接口(一)事務(wù)管理器接口2.Spring的回滾方式Throwable類是Java語言中所有錯誤或異常的超類。Error是程序在運行過程中出現(xiàn)的無法處理的錯誤。預備知識四、了解Spring事務(wù)管理的接口(一)事務(wù)管理器接口在代碼編寫時要求必須捕獲或拋出的異常,若不處理則無法通過編譯。受查異常是RuntimeException類或其子類在運行時才出現(xiàn)的異常。運行時異常3.異常預備知識四、了解Spring事務(wù)管理的接口(二)事務(wù)定義接口231事務(wù)隔離級別事務(wù)定義接口TransactionDefinition中定義了事務(wù)描述相關(guān)的三類常量。事務(wù)傳播行為事務(wù)默認超時時限預備知識四、了解Spring事務(wù)管理的接口(二)事務(wù)定義接口1.事務(wù)隔離級別DEFAULT采用DB默認的事務(wù)隔離級別READ_UNCOMMITTED讀未提交。未解決任何并發(fā)問題READ_COMMITTED讀已提交。解決臟讀,存在不可重復讀與幻讀REPEATABLE_READ可重復讀。解決臟讀、不可重復讀,存在幻讀SERIALIZABLE串行化。不存在并發(fā)問題預備知識四、了解Spring事務(wù)管理的接口(二)事務(wù)定義接口2.事務(wù)傳播行為REQUIRED:指定的方法必須在事務(wù)內(nèi)執(zhí)行。NOT_SUPPORTED:指定的方法不能在事務(wù)環(huán)境中執(zhí)行。REQUIRES_NEW:總是新建一個事務(wù)。SUPPORTS:指定的方法支持當前事務(wù)。MANDATORY:指定的方法必須在當前事務(wù)內(nèi)執(zhí)行。NEVER:指定的方法不能在事務(wù)環(huán)境下執(zhí)行。NESTED:指定的方法必須在事務(wù)內(nèi)執(zhí)行。預備知識四、了解Spring事務(wù)管理的接口(二)事務(wù)定義接口3.事務(wù)默認超時時限常量TIMEOUT_DEFAULT定義了事務(wù)底層默認的超時時限和不支持事務(wù)超時時限設(shè)置的none值。它定義了默認事務(wù)的超時時限。需要注意:由于影響事務(wù)超時時限發(fā)揮作用的條件比較多、超時的時間計算比較復雜,該值一般就使用默認值即可。實施準備我們認識了Spring的IoC和依賴注入相關(guān)的知識與開發(fā)技術(shù)之后,需進一步理解并掌握AOP切面的基礎(chǔ)知識,包括AOP應(yīng)用場景、AOP編程術(shù)語、AspectJ的切入點表達式、Spring事務(wù)管理的接口等,為搭建AOP開發(fā)環(huán)境和開發(fā)AOP實現(xiàn)模式提前做好準備。任務(wù)實施與分析步驟1.AOP開發(fā)環(huán)境搭建在原有Spring基本jar包的基礎(chǔ)上再導入AOP聯(lián)盟的規(guī)范(接口)包及Spring對其的實現(xiàn)包。步驟1.1:導入jar包步驟1.2:使用原Beans的約束<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/spring-beans.xsd">任務(wù)實施與分析步驟2:掌握通知adivce//主業(yè)務(wù)接口publicinterfaceISomeService{

//目標方法 voiddoFirst();

//目標方法 voiddoSecond();}//目標類publicclassSomeServiceImplimplementsISomeService{ @Override publicvoiddoFirst(){

System.out.println("執(zhí)行doFirst()方法"); } @Override publicvoiddoSecond(){

System.out.println("執(zhí)行doSecond()方法"); }}在目標方法執(zhí)行之前先執(zhí)行010302不改變目標方法執(zhí)行的結(jié)果不改變目標方法的執(zhí)行流程,前置通知代碼不能阻止目標方法執(zhí)行步驟2.1:學習前置通知MethodBeforeAdvice任務(wù)實施與分析步驟2:掌握通知adivce步驟2.1:學習前置通知MethodBeforeAdvice//前置通知publicclassMyMethodBeforeAdviceimplementsMethodBeforeAdvice{

//當前方法在目標方法執(zhí)行之前執(zhí)行

//method:目標方法 //args:目標方法的參數(shù)列表

//target:目標對象 @Override publicvoidbefore(Methodmethod,Object[]args,Objecttarget) throwsThrowable{

//對于目標方法的增強代碼就應(yīng)該寫在這里

System.out.println("執(zhí)行前置通知方法"); }}(1)定義前置通知任務(wù)實施與分析步驟2:掌握通知adivce步驟2.1:學習前置通知MethodBeforeAdvice<!--注冊目標對象--><beanid="someService"class="com.framework.aop01.SomeServiceImpl"/><!--注冊切面:通知--><beanid="myAdvice"class="com.framework.aop01.MyMethodBeforeAdvice"/><!--生成代理對象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <!--<propertyname="targetName"value="someService"/>--> <!--指定目標對象--> <propertyname="target"ref="someService"/> <!--指定切面--> <propertyname="interceptorNames"value="myAdvice"/></bean>(2)配置文件配置任務(wù)實施與分析步驟2:掌握通知adivce步驟2.1:學習前置通知MethodBeforeAdvice@Testpublicvoidtest01(){ //創(chuàng)建容器對象,加載Spring配置文件 Stringresource="com/framework/aop01/applicationContext.xml"; ApplicationContextac=newClassPathXmlApplicationContext(resource); ISomeServiceservice=(ISomeService)ac.getBean("serviceProxy"); service.doFirst(); System.out.println("=================="); service.doSecond();}(3)編寫測試類進行測試任務(wù)實施與分析步驟2:掌握通知adivce步驟2.2:學習后置通知AfterReturningAdvice0301

02在目標方法執(zhí)行之后執(zhí)行不改變目標方法執(zhí)行的結(jié)果不改變目標方法的執(zhí)行流程,后置通知代碼不能阻止目標方法執(zhí)行IBAOTU.COMIBAOTU.COMIBAOTU.COM任務(wù)實施與分析步驟2:掌握通知adivce步驟2.2:學習后置通知AfterReturningAdvice@OverridepublicStringdoSecond(){

System.out.println("執(zhí)行doSecond()方法"); return"abcde";}(1)修改業(yè)務(wù)接口與實現(xiàn)類任務(wù)實施與分析步驟2:掌握通知adivce步驟2.2:學習后置通知AfterReturningAdvice//后置通知:可以獲取到目標方法的返回結(jié)果,但無法改變目標方法的結(jié)果publicclassMyAfterReturningAdviceimplementsAfterReturningAdvice{ //在目標方法執(zhí)行之后執(zhí)行 //returnValue:目標方法的返回值 @Override publicvoidafterReturning(ObjectreturnValue,Methodmethod, Object[]args,Objecttarget)throwsThrowable{ System.out.println("執(zhí)行后置通知方法returnValue="+returnValue); if(returnValue!=null){ returnValue=((String)returnValue).toUpperCase(); System.out.println("修改過的結(jié)果returnValue="+returnValue); } }}(2)定義切面:通知任務(wù)實施與分析步驟2:掌握通知adivce步驟2.2:學習后置通知AfterReturningAdvice!--注冊目標對象--><beanid="someService"class="com.framework.aop02.SomeServiceImpl"/><!--注冊切面:通知--><beanid="myAdvice"class="com.framework.aop02.MyAfterReturningAdvice"/><!--生成代理對象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvice"/></bean>(3)修改配置文件配置任務(wù)實施與分析步驟2:掌握通知adivce步驟2.3:環(huán)繞通知MethodInterceptor//環(huán)繞通知:可以修改目標方法的返回結(jié)果publicclassMyMethodInterceptorimplementsMethodInterceptor{ @Override publicObjectinvoke(MethodInvocationinvocation)throwsThrowable{

System.out.println("執(zhí)行環(huán)繞通知:目標方法執(zhí)行之前");

//執(zhí)行目標方法

Objectresult=invocation.proceed();

System.out.println("執(zhí)行環(huán)繞通知:目標方法執(zhí)行之后"); if(result!=null){ result=((String)result).toUpperCase(); } returnresult; }}(1)定義環(huán)繞通知,即方法攔截器。需要注意的是,環(huán)繞通知需要添加MethodInterceptor包。任務(wù)實施與分析步驟2:掌握通知adivce步驟2.3:環(huán)繞通知MethodInterceptor<!--注冊目標對象--><beanid="someService"class="com.framework.aop03.SomeServiceImpl"/><!--注冊切面:通知--><beanid="myAdvice"class="com.framework.aop03.MyMethodInterceptor"/><!--生成代理對象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvice"/></bean>(2)修改配置文件配置為環(huán)繞通知配置。任務(wù)實施與分析步驟2:掌握通知adivce步驟2.3:環(huán)繞通知MethodInterceptor@Testpublicvoidtest01(){ //創(chuàng)建容器對象,加載Spring配置文件 Stringresource="com/framework/aop03/applicationContext.xml"; ApplicationContextac=newClassPathXmlApplicationContext(resource); ISomeServiceservice=(ISomeService)ac.getBean("serviceProxy"); service.doFirst(); System.out.println("=================="); Stringresult=service.doSecond(); System.out.println(result);}(3)執(zhí)行測試類,返回結(jié)果被修改。任務(wù)實施與分析步驟2:掌握通知adivce步驟2.4:異常通知ThrowsAdviceafterThrowing()方法重載的四種形式常用的形式是:publicvoidafterThrowing(自定義的異常類e)。這里的參數(shù)“e”為與具體業(yè)務(wù)相關(guān)的用戶自定義的異常類對象。容器會根據(jù)異常類型的不同,自動選擇不同的該方法執(zhí)行。任務(wù)實施與分析步驟2:掌握通知adivce步驟2.4:異常通知ThrowsAdvice@OverridepublicvoiddoFirst(){

System.out.println("執(zhí)行doFirst()方法"+3/0);}//異常通知publicclassMyThrowsAdviceimplementsThrowsAdvice{ //當目標方法拋出與指定類型的異常具有is-a關(guān)系的異常時,執(zhí)行當前方法 publicvoidafterThrowing(Exceptionex){ System.out.println("執(zhí)行異常通知方法"); }}(1)創(chuàng)建異常方法(2)實現(xiàn)異常通知任務(wù)實施與分析步驟2:掌握通知adivce步驟2.4:異常通知ThrowsAdvice<!--注冊目標對象--><beanid="someService"class="com.framework.aop04.SomeServiceImpl"/><!--注冊切面:通知--><beanid="myAdvice"class="com.framework.aop04.MyThrowsAdvice"/><!--生成代理對象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvice"/></bean>(3)修改配置文件為配置異常任務(wù)實施與分析步驟2:掌握通知adivce步驟2.4:異常通知ThrowsAdvice//創(chuàng)建容器對象,加載Spring配置文件Stringresource="com/framework/aop04/applicationContext.xml";ApplicationContextac=newClassPathXmlApplicationContext(resource);ISomeServiceservice=(ISomeService)ac.getBean("serviceProxy");service.doFirst();(4)創(chuàng)建測試類執(zhí)行異常方法。任務(wù)實施與分析步驟2:掌握通知adivce步驟2.5:學習無接口的CGLIB代理生成(1)配置代理,并去掉實現(xiàn)的接口類<!--生成代理對象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvice"/></bean>(2)在測試類加斷點,查看使用的代理任務(wù)實施與分析步驟2:掌握通知adivce步驟2.6:學習有接口的CGLIB代理生成<!--生成代理對象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvice"/> <!--<propertyname="optimize"value="true"/>--> <propertyname="proxyTargetClass"value="true"/></bean>在配置文件中增加一個proxyTargetClass屬性設(shè)置,指定是否對類進行代理。任務(wù)實施與分析步驟3:掌握顧問AdvisorNameMatchMethodPointcutAdvisor名稱匹配方法切入點顧問ARegexpMethodPointcutAdvisor正則表達式匹配方法切入點顧問BPointcutAdvisor是顧問的一種,可以指定具體的切入點。PointcutAdvisor接口有兩個較為常用的實現(xiàn)類:任務(wù)實施與分析步驟3:掌握顧問Advisor步驟3.1:學習名稱匹配方法切入點顧問<!--注冊切面:顧問--><beanid="myAdvisor"

class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <propertyname="advice"ref="myAdvice"/>

<!--指定切入點:這里匹配的對象是簡單方法名--> <!--<propertyname="mappedName"value="doFirst"/>--> <!--<propertyname="mappedNames"value="doFirst,doSecond"/>--> <propertyname="mappedNames"value="*ir*"/></bean>

<!--生成代理對象--><beanid="serviceProxy"

class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvisor"/></bean>(1)修改配置文件,mappedName配置簡單方法名,mappedNames配置多個數(shù)組方法名。任務(wù)實施與分析步驟3:掌握顧問Advisor步驟3.1:學習名稱匹配方法切入點顧問@Testpublicvoidtest01(){ //創(chuàng)建容器對象,加載Spring配置文件 Stringresource="com/framework/aop07/applicationContext.xml"; ApplicationContextac=newClassPathXmlApplicationContext(resource); ISomeServiceservice=(ISomeService)ac.getBean("serviceProxy"); service.doFirst(); System.out.println("=================="); service.doSecond(); System.out.println("=================="); service.doThird();}(2)運行測試類,輸出結(jié)果調(diào)用doFirst,doThird方法任務(wù)實施與分析步驟3:掌握顧問Advisor步驟3.2:學習正則表達式方法切入點顧問(1)修改配置文件,用正則表達式配置切入點。<!--注冊切面:顧問--><beanid="myAdvisor"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <propertyname="advice"ref="myAdvice"/> <!--這里的正則表達式匹配的對象是全限定性方法名--> <!--<propertyname="pattern"value=".*doFirst"/>--> <!--<propertyname="patterns"value=".*doFirst,.*doSecond"/>--> <!--<propertyname="pattern"value=".*doFirst|.*doSecond"/>--> <propertyname="pattern"value=".*S.*"/></bean><!--生成代理對象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvisor"/></bean>任務(wù)實施與分析步驟3:掌握顧問Advisor步驟3.2:學習正則表達式方法切入點顧問(2)運行測試類測試。@Testpublicvoidtest01(){ //創(chuàng)建容器對象,加載Spring配置文件 Stringresource="com/framework/aop08/applicationContext.xml"; ApplicationContextac=newClassPathXmlApplicationContext(resource); ISomeServiceservice=(ISomeService)ac.getBean("serviceProxy"); service.doFirst(); System.out.println("=================="); service.doSecond(); System.out.println("=================="); service.doThird();}任務(wù)實施與分析步驟4:掌握自動代理生成器,默認advisor、Bean名稱默認advisor自動代理生成器Bean名稱自動代理生成器

需要注意的是:自動代理生成器的Bean也沒有id屬性,客戶類直接使用目標對象Bean的id。任務(wù)實施與分析步驟4:掌握自動代理生成器,默認advisor、Bean名稱步驟4.1配置自動代理生成器<!--注冊切面:顧問--><beanid="myAdvisor"class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <propertyname="advice"ref="myAdvice"/> <propertyname="mappedNames"value="doFirst"/></bean><beanid="myAdvisor2"class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <propertyname="advice"ref="myAdvice"/> <propertyname="mappedNames"value="doSecond"/></bean>

<!--注冊自動代理生成器--><beanclass="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>任務(wù)實施與分析步驟4:掌握自動代理生成器,默認advisor、Bean名稱步驟4.2:Bean名稱自動代理生成器注意:只需要修改配置文件中的代理生成配置,及測試類中的通過getBean()獲取的Bean的id為目標類beanId即可。<!--注冊切面:顧問--><beanid="myAdvisor"class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <propertyname="advice"ref="myAdvice"/> <propertyname="mappedNames"value="doFirst"/></bean><beanid="myAdvisor2"class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <propertyname="advice"ref="myAdvice"/> <propertyname="mappedNames"value="doSecond"/></bean>

<!--注冊自動代理生成器--><beanclass="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <propertyname="beanNames"value="someService"/> <propertyname="interceptorNames"value="myAdvisor"/></bean>(1)修改配置自動代理,只調(diào)用MyAdvisor。任務(wù)實施與分析步驟4:掌握自動代理生成器,默認advisor、Bean名稱步驟4.2:Bean名稱自動代理生成器@Testpublicvoidtest01(){ //創(chuàng)建容器對象,加載Spring配置文件 Stringresource="com/framework/aop10/applicationContext.xml"; ApplicationContextac=newClassPathXmlApplicationContext(resource); ISomeServiceservice=(ISomeService)ac.getBean("someService"); service.doFirst(); System.out.println("=================="); service.doSecond(); System.out.println("=================="); service.doThird(); System.out.println("-----------------------------"); ISomeServiceservice2=(ISomeService)ac.getBean("someService2"); service2.doFirst(); System.out.println("=================="); service2.doSecond(); System.out.println("=================="); service2.doThird();}(2)執(zhí)行測試類測試,了解DefaultAdvisorAutoProxyCreator存在的三個問題。任務(wù)實施與分析步驟5:掌握AspectJ對AOP的實現(xiàn)步驟5.1:搭建AspectJ的開發(fā)環(huán)境

AOP相關(guān)約束

Spring支持庫解壓目錄中的子目錄org.aspectj下的兩個子包任務(wù)實施與分析步驟5:掌握AspectJ對AOP的實現(xiàn)步驟5.2:AspectJ基于注解的AOP的實現(xiàn)//主業(yè)務(wù)接口publicinterfaceISomeService{

//目標方法 voiddoFirst();

//目標方法

StringdoSecond();

//目標方法 voiddoThird();}//目標類publicclassSomeServiceImplimplementsISomeService{ @Override publicvoiddoFirst(){

System.out.println("執(zhí)行doFirst()方法"); } @Override publicStringdoSecond(){

System.out.println("執(zhí)行doSecond()方法"); return"abcde"; } @Override publicvoiddoThird(){

System.out.println("執(zhí)行doThird()方法"+3/0);

System.out.println("執(zhí)行doThird()方法"); }}(1)定義業(yè)務(wù)接口與實現(xiàn)類。任務(wù)實施與分析步驟5:掌握AspectJ對AOP的實現(xiàn)步驟5.2:AspectJ基于注解的AOP的實現(xiàn)@Aspect//表示當前類為切面publicclassMyAspect{ @Before("execution(**..ISomeService.doFirst(..))") publicvoidmyBefore(){ System.out.println("執(zhí)行前置通知方法");}(2)定義切面Pojo類,在定義的Pojo類上添加@Aspect注解任務(wù)實施與分析步驟5:掌握AspectJ對AOP的實現(xiàn)步驟5.2:AspectJ基于注解的AOP的實現(xiàn)@Before("execution(**..ISomeService.doFirst(..))") publicvoidmyBefore(){ System.out.println("執(zhí)行前置通知方法"); } @Before("execution(**..ISomeService.doFirst(..))") publicvoidmyBefore(JoinPointjp){ System.out.println("執(zhí)行前置通知方法jp="+jp); } @AfterReturning("execution(**..ISomeService.doSecond(..))") publicvoidmyAfterReturning(){ System.out.println("執(zhí)行后置通知方法");}(3)在Pojo類的普通方法上上添加通知注解任務(wù)實施與分析步驟5:掌握AspectJ對AOP的實現(xiàn)步驟5.2:AspectJ基于注解的AOP的實現(xiàn)<!--注冊切面--> <beanid="myAspect"class="com.framework.aspectj01.MyAspect"/> <!--注冊目標對象--> <beanid="someService"class="com.framework.aspectj01.SomeServiceImpl"/> <!--注冊AspectJ的自動代理--><aop:aspectj-autoproxy/>}(4)編寫配置文件,注冊目標對象與Pojo切面類,注冊AspectJ的自動代理。其工作原理是:<aop:aspectj-autoproxy/>通過掃描找到@Aspect定義的切面類,再由切面類根據(jù)切入點找到目標類的目標方法,再由通知類型找到切入的時間點。任務(wù)實施與分析步驟5:掌握AspectJ對AOP的實現(xiàn)步驟5.2:AspectJ基于注解的AOP的實現(xiàn)@Testpublicvoidtest01(){ //創(chuàng)建容器對象,加載Spring配置文件 Stringresource="com/framework/aspectj01/applicationContext.xml"; ApplicationContextac=newClassPathXmlApplicationContext(resource); ISomeServiceservice=(ISomeService)ac.getBean("someService"); service.doFirst(); System.out.println("----------------------------"); service.doSecond(); System.out.println("----------------------------"); service.doThird();}(5)編寫測試類進行測試。任務(wù)實施與分析步驟5:掌握AspectJ對AOP的實現(xiàn)步驟5.3:測試類中使用的目標對象及注解知識點。(1)@Before前置通知-增強方法有JoinPoint參數(shù)@AfterReturning后置通知-注解有returning屬性@Before("execution(**..ISomeService.doFirst(..))")publicvoidmyBefore(){

System.out.println("執(zhí)行前置通知方法");}

@AfterReturning(value="execution(**..ISomeService.doSecond(..))",returning="result") publicvoidmyAfterReturning(Objectresult){ System.out.println("執(zhí)行后置通知方法result="+result);}(2)任務(wù)實施與分析步驟5:掌握AspectJ對AOP的實現(xiàn)步驟5.3:測試類中使用的目標對象及注解知識點。@Around("execution(**..ISomeService.doSecond(..))")publicObjectmyAround(ProceedingJoinPointpjp)throwsThrowable{

System.out.println("執(zhí)行環(huán)繞通知方法,目標方法執(zhí)行之前");

//執(zhí)行目標方法

Objectresult=pjp.proceed();

System.out.println("執(zhí)行環(huán)繞通知方法,目標方法執(zhí)行之后"); if(result!=null){ result=((String)result).toUpperCase(); } returnresult;}(3)@Around環(huán)繞通知-增強方法有ProceedingJoinPoint參數(shù)任務(wù)實施與分析步驟5:掌握AspectJ對AOP的實現(xiàn)步驟5.3:測試類中使用的目標對象及注解知識點。(4)@AfterThrowing異常通知-注解中有throwing屬性@AfterThrowing("execution(**..ISomeService.doThird(..))")publicvoidmyAfterThrowing(){ System.out.println("執(zhí)行異常通知方法");}(5)@After最終通知@After("doThirdPointcut()")publicvoidmyAfter(){ System.out.println("執(zhí)行最終通知方法");}任務(wù)實施與分析步驟5:掌握AspectJ對AOP的實現(xiàn)步驟5.3:測試類中使用的目標對象及注解知識點。//定義了一個切入點,叫doThirdPointcut()@Pointcut("execution(**..ISomeService.doThird(..))")publicvoiddoThirdPointcu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論