版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
J
a
v
a
E
E框架整合開發(fā)創(chuàng)新·協(xié)作·分享T
I
P
C
C教案第一章SpringT
I
P
C
C教案本章目標(biāo)了解Spring的體系結(jié)構(gòu)理解Spring
IoC與AOP的基本原理了解Spring
Bean的生命周期、實(shí)例化以及作用域掌握Spring的事務(wù)管理T
I
P
C
C教案本章內(nèi)容Spring概述Spring開發(fā)環(huán)境的構(gòu)建Spring
IoCSpring
AOPSpring
BeanSpring的數(shù)據(jù)庫編程T
I
P
C
C教案1.1
Spring概述1.1.1
Spring的由來1.1.2
Spring的體系結(jié)構(gòu)T
I
P
C
C教案1.1.1
Spring的由來Spring是一個(gè)輕量級(jí)Java
開發(fā)框架,最
由Rod
Johnson創(chuàng)建,目的是為了解決企業(yè)級(jí)應(yīng)用開發(fā)的業(yè)務(wù)邏輯層和其它各層的耦合問題。它是一個(gè)分層的JavaSE/EEfull-stack(一站式)輕量級(jí)開源框架,為開發(fā)Java應(yīng)用程序提供全面的基礎(chǔ)架構(gòu)支持。Spring負(fù)責(zé)基礎(chǔ)架構(gòu),因此Java開發(fā)者可以專注于應(yīng)用程序的開發(fā)。?請(qǐng)思考為什么學(xué)習(xí)Spring框架?T
I
P
C
C教案1.1
Spring概述1.1.1
Spring的由來1.1.2
Spring的體系結(jié)構(gòu)T
I
P
C
C教案1.1.2
Spring的體系結(jié)構(gòu)T
I
P
C
C教案1.Core
Containerspring-beans模塊:提供了BeanFactory,是工廠模式的一個(gè)經(jīng)典實(shí)現(xiàn),Spring將管理對(duì)象稱為Bean。spring-core模塊:提供了框架的基本組成部分,包括控制反轉(zhuǎn)(Inversion
of
Control,IoC)和依賴注入(DependencyInjection,DI)功能。spring-context模塊:建立在spring-beans和spring-core模塊基礎(chǔ)上,提供一個(gè)框架式的對(duì)象訪問方式,是訪問定義和配置的任何對(duì)象媒介。spring-expression模塊:提供了強(qiáng)大的表達(dá)式語言去支持運(yùn)行時(shí)查詢和操作對(duì)象圖。T
I
P
C
C教案2.AOP和Instrumentationspring-aop模塊:提供了一個(gè)符合AOP要求的面向切面的編程實(shí)現(xiàn),允許定義方法攔截器和切入點(diǎn),將代碼按照功能進(jìn)行分離,以便干凈地解耦。spring-aspects模塊:提供了與AspectJ的集成功能,AspectJ是一個(gè)功能強(qiáng)大且成熟的AOP框架。spring-instrument模塊:提供了類植入(Instrumentation)支持和類加載器的實(shí)現(xiàn),可以在特定的應(yīng)用服務(wù)器中使用。
Instrumentation提供了一種虛擬機(jī)級(jí)別支持的AOP實(shí)現(xiàn)方式,使得開發(fā)者無需對(duì)JDK做任何升級(jí)和改動(dòng),就可以實(shí)現(xiàn)某些AOP的功能。T
I
P
C
C教案3.MessagingSpring
4.0以后新增了Messaging(spring-messaging)模塊,該模塊提供了對(duì)消息傳遞體系結(jié)構(gòu)和協(xié)議的支持。!注意:該模塊的版本!T
I
P
C
C教案4.Data
Access/Integration
spring-jdbc模塊:提供了一個(gè)JDBC的抽象層,消除了繁瑣的JDBC編碼和數(shù)據(jù)庫廠商特有的錯(cuò)誤代碼解析。
spring-orm模塊:為流行的對(duì)象關(guān)系映射(Object-RelationalMapping)API提供集成層,包括JPA和Hibernate。使用spring-orm模塊,可以將這些O/R映射框架與Spring提供的所有其它功能結(jié)合使用,例如聲明式事務(wù)管理功能。
spring-oxm模塊:提供了一個(gè)支持對(duì)象/XML映射的抽象層實(shí)現(xiàn),如
JAXB、Castor、JiBX和XStream。
spring-jms模塊(JavaMessagingService):指Java消息傳遞服務(wù),包含用于生產(chǎn)和使用消息的功能。自Spring
4.1后,提供了與
spring-messaging模塊的集成。spring-tx模塊(事務(wù)模塊):支持用于實(shí)現(xiàn)特殊接口和所有POJO(普通Java對(duì)象)類的編程和聲明式事務(wù)管理。T
I
P
C
C教案5.Web
spring-web模塊:提供了基本的Web開發(fā)集成功能。例如:多文件上傳功能、使用Servlet監(jiān)聽器初始化一個(gè)IoC容器以及Web應(yīng)用上下文。
spring-webmvc模塊:也稱為Web-Servlet模塊,包含用于Web應(yīng)用程序的Spring
MVC和REST
Web
Services實(shí)現(xiàn)。Spring
MVC框架提供了領(lǐng)域
模型代碼和Web表單之間的清晰分離,并與Spring
Framework的所有其它功能集成,本書后續(xù)章節(jié)將會(huì)詳細(xì)講解Spring
MVC框架。
spring-websocket模塊:Spring
4.0后新增的模塊,它提供了WebSocket和SockJS的實(shí)現(xiàn),主要是與Web前端的全雙工通訊的協(xié)議。
spring-webflux模塊:spring-webflux是一個(gè)新的非堵塞函數(shù)式ReactiveWeb框架,可以用來建立異步的、非阻塞、事件驅(qū)動(dòng)的服務(wù),并且擴(kuò)展性非常好。(該模塊是Spring
5新增模塊)。T
I
P
C
C教案6.TestTest(spring-test)模塊:支持使用JUnit或TestNG對(duì)Spring組件進(jìn)行單元測(cè)試和集成測(cè)試。T
I
P
C
C教案本章內(nèi)容Spring概述Spring開發(fā)環(huán)境的構(gòu)建Spring
IoCSpring
AOPSpring
BeanSpring的數(shù)據(jù)庫編程T
I
P
C
C教案1.2
Spring開發(fā)環(huán)境的構(gòu)建1.2.1使用Eclipse開發(fā)Java
Web應(yīng)用1.2.2
Spring的下載及目錄結(jié)構(gòu)1.2.3第一個(gè)Spring入門程序T
I
P
C
C教案1.2.1使用Eclipse開發(fā)Java
Web應(yīng)用eclipse-jee-2020-12-R-win32-x86_64自帶Java
SE
15,因此,使用此版本的Eclipse開發(fā)JavaWeb應(yīng)用,僅需對(duì)Web服務(wù)器和Eclipse進(jìn)行一些必要的配置。T
I
P
C
C教案Web服務(wù)器目前,比較常用的Web服務(wù)器包括Tomcat、JRun、Resin、WebSphere、WebLogic等,本書采用的是Tomcat
9.0。登錄Apache軟件基金會(huì)的官方網(wǎng)站
http://jakarta.A/tomcat,下載Tomcat9.0的免安裝版(本書采用的Tomcat是apache-tomcat-9.0.30-windows-x64.zip)。T
I
P
C
C教案安裝EclipseEclipse下載完成后,解壓到自己設(shè)置的路徑下,即可完成安裝。安裝Eclipse后,雙擊Eclipse安裝目錄下的eclipse.exe文件,啟動(dòng)Eclipse。T
I
P
C
C教案集成Tomcat啟動(dòng)Eclipse,選擇Window/Preferences菜單項(xiàng),在彈出的對(duì)話框中選擇Server/Runtime
Environments命令。在彈出的窗口中,單擊Add按鈕,彈出New
Server
RuntimeEnvironment界面,在此可以配置各種版本的Web服務(wù)器。T
I
P
C
C教案1.2
Spring開發(fā)環(huán)境的構(gòu)建1.2.1使用Eclipse開發(fā)Java
Web應(yīng)用1.2.2
Spring的下載及目錄結(jié)構(gòu)1.2.3第一個(gè)Spring入門程序T
I
P
C
C教案Spring的JAR包Spring官方網(wǎng)站升級(jí)后,建議通過Maven和Gradle下載。對(duì)于不使用Maven和Gradle下載的開發(fā)者,本書給出一個(gè)SpringFramework
JAR官方直接下載路徑:
/libs-release-local/org/springframework/spring/。本書采用的是spring-5.3.2-dist.zip。T
I
P
C
C教案commons.logging的JAR包Spring框架依賴于Apache
Commons
Logging組件,該組件的JAR包可以通過官方網(wǎng)站
/proper/commons-
logging/download_logging.cgi下載,本書下載的是
commons-logging-1.2-bin.zip,解壓縮后,即可找到
commons-logging-1.2.jar。對(duì)于Spring框架的初學(xué)者,開發(fā)Spring應(yīng)用時(shí),只需要將
Spring的四個(gè)基礎(chǔ)包和commons-logging-1.2.jar復(fù)制到Web應(yīng)用的WEB-INF/lib目錄下。?請(qǐng)思考當(dāng)您不明白需要哪些包咋辦?T
I
P
C
C教案1.2
Spring開發(fā)環(huán)境的構(gòu)建1.2.1使用Eclipse開發(fā)Java
Web應(yīng)用1.2.2
Spring的下載及目錄結(jié)構(gòu)1.2.3第一個(gè)Spring入門程序T
I
P
C
C教案1.2.3第一個(gè)Spring入門程序1.使用Eclipse創(chuàng)建Web應(yīng)用并導(dǎo)入相關(guān)JAR包2.創(chuàng)建接口TestDao3.創(chuàng)建接口TestDao的實(shí)現(xiàn)類TestDaoImpl4.創(chuàng)建配置文件applicationContext.xml5.創(chuàng)建測(cè)試類T
I
P
C
C教案1.使用Eclipse創(chuàng)建Web應(yīng)用并導(dǎo)入相關(guān)JAR包使用Eclipse創(chuàng)建一個(gè)名為ch1_1的Dynamic
Web
Project,并將Spring的4個(gè)基礎(chǔ)包和第三方依賴包c(diǎn)ommons-logging-1.2.jar復(fù)制到ch1_1的WEB-INF/lib目錄中。!注意:在講解Spring
MVC框架前,本書的實(shí)例并沒有真正運(yùn)行Web應(yīng)用。創(chuàng)建Web應(yīng)用的目的是方便添加相關(guān)JAR包。T
I
P
C
C教案2.創(chuàng)建接口TestDao在src目錄下,創(chuàng)建一個(gè)dao包,并在dao包中創(chuàng)建接口TestDao,接口中定義一個(gè)sayHello()方法。package
dao;public
interface
TestDao
{public
void
sayHello();}T
I
P
C
C教案3.創(chuàng)建接口TestDao的實(shí)現(xiàn)類TestDaoImpl在dao包下創(chuàng)建接口TestDao的實(shí)現(xiàn)類TestDaoImpl。package
dao;public
class
TestDaoImpl
implements
TestDao{@Overridepublic
void
sayHello()
{System.out.println("Hello,
Study
hard!");}}T
I
P
C
C教案4.創(chuàng)建配置文件applicationContext.xml在src目錄下,創(chuàng)建名為config的包,并在該包中,創(chuàng)建Spring的配置文件applicationContext.xml,在配置文件中使用實(shí)現(xiàn)類
TestDaoImpl創(chuàng)建一個(gè)id為test的Bean。<?xml
version="1.0"
encoding="UTF-8"?><beans
xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd"><!--將指定類TestDaoImpl配置給Spring,讓Spring創(chuàng)建其實(shí)例--><bean
id="test"
class="dao.TestDaoImpl"
/></beans>!注意:配置文件的名稱可以自定義,但習(xí)慣上命名為applicationContext.xml,有時(shí)也命名為beans.xml。配置文件信息不需要讀者手寫,可以從Spring的幫助文檔中復(fù)制(首先使用瀏覽器打開\spring-framework-5.3.2\docs\reference\html\index.html,在頁面中單擊超鏈接Core,在1.2.1.Configuration
Metadata小節(jié)下即可找到配置文件的約束信息)。T
I
P
C
C教案5.創(chuàng)建測(cè)試類在src目錄下,創(chuàng)建一個(gè)test包,并在test包中創(chuàng)建Test類。public
class
Test
{public
static
void
main(String[]
args)
{//初始化Spring容器ApplicationContext,加載配置文件//@SuppressWarnings抑制警告的關(guān)鍵字,有泛型未指定類型@SuppressWarnings("resource")ApplicationContext
appCon
=
new
ClassPathXmlApplicationContext("config/applicationContext.x//通過容器獲取test實(shí)例TestDao
tt=(TestDao)appCon.getBean("test");//test為配置文件中的idtt.sayHello();}}T
I
P
C
C教案本章內(nèi)容Spring概述Spring開發(fā)環(huán)境的構(gòu)建Spring
IoCSpring
AOPSpring
BeanSpring的數(shù)據(jù)庫編程T
I
P
C
C教案1.3
Spring
IoC1.3.1
Spring
IoC的基本概念1.3.2
Spring的常用注解1.3.3基于注解的依賴注入T
I
P
C
C教案1.3.1
Spring
IoC的基本概念
控制反轉(zhuǎn)(IOC)是一個(gè)比較抽象的概念,是Spring框架的核心,用來消減計(jì)算機(jī)程序的耦合問題。依賴注入(DI)是IoC的另外一種說法,只是從不同的角度,描述相同的概念。?請(qǐng)思考:想吃面包,在沒有面包店和有面包店兩種情況下,您會(huì)怎么做??請(qǐng)思考:想調(diào)用一個(gè)Java類的對(duì)象,您怎么做?
當(dāng)Spring框架出現(xiàn)后,對(duì)象的實(shí)例不再由調(diào)用者來創(chuàng)建,而是由
Spring容器(比如面包店)來創(chuàng)建。Spring容器會(huì)負(fù)責(zé)控制程序之間的關(guān)系(比如面包店負(fù)責(zé)控制您與面包的關(guān)系),而不是由調(diào)用者的程序代碼直接控制。這樣,控制權(quán)由調(diào)用者轉(zhuǎn)移到Spring容器,控制權(quán)發(fā)生了反轉(zhuǎn),這就是Spring的控制反轉(zhuǎn)。T
I
P
C
C教案1.3
Spring
IoC1.3.1
Spring
IoC的基本概念1.3.2
Spring的常用注解1.3.3基于注解的依賴注入T
I
P
C
C教案1.3.2
Spring的常用注解在Spring框架中,盡管使用XML配置文件可以很簡(jiǎn)單地裝配
Bean(如1.2.3節(jié)),但如果應(yīng)用中有大量的Bean需要裝配時(shí),會(huì)導(dǎo)致XML配置文件過于龐大,不方便以后的升級(jí)維護(hù)。因此,更多時(shí)候推薦開發(fā)者使用注解(annotation)的方式去裝配
Bean。Spring框架基于AOP編程(1.4節(jié))實(shí)現(xiàn)注解解析,因此,在使用注解編程時(shí),需要導(dǎo)入spring-aop-5.3.2.jar包。T
I
P
C
C教案聲明Bean的注解1)@Component,該注解是一個(gè)泛化的概念,僅僅表示一個(gè)組件對(duì)象(Bean),可以作用在任何層次上,沒有明確的角色。2)@Repository,該注解用于將數(shù)據(jù)訪問層(DAO)的類標(biāo)識(shí)為Bean,即注解數(shù)據(jù)訪問層Bean。3)@Service,該注解用于標(biāo)注一個(gè)業(yè)務(wù)邏輯組件類(Service層。4)@Controller,該注解用于標(biāo)注一個(gè)控制器組件類(SpringMVC的Controller。@Repository、@Service和@Controller與@Component功能相同。T
I
P
C
C教案注入Bean的注解
1)@Autowired,該注解可以對(duì)類的成員變量、方法及構(gòu)造方法進(jìn)行標(biāo)注,完成自動(dòng)裝配的工作。通過@Autowired的使用來消除
setter和getter方法。默認(rèn)按照Bean的類型進(jìn)行裝配。
2)@Resource,該注解與@Autowired功能一樣。區(qū)別在于,該注解默認(rèn)是按照名稱來裝配注入的,只有當(dāng)找不到與名稱匹配的Bean才會(huì)按照類型來裝配注入;而@Autowired默認(rèn)按照Bean的類型進(jìn)行裝配,如果想按照名稱來裝配注入,則需要結(jié)合@Qualifier注解一起使用。Bean的實(shí)例名稱由@Qualifier注解的參數(shù)指定。
@Resource注解有兩個(gè)屬性:name和type。name屬性指定Bean的
實(shí)例名稱,即按照名稱來裝配注入;type屬性指定Bean類型,即按照Bean的類型進(jìn)行裝配。T
I
P
C
C教案1.3
Spring
IoC1.3.1
Spring
IoC的基本概念1.3.2
Spring的常用注解1.3.3基于注解的依賴注入T
I
P
C
C教案1.3.3基于注解的依賴注入Spring
IoC容器(ApplicationContext)負(fù)責(zé)創(chuàng)建和注入Bean。Spring提供使用XML配置、注解、Java配置以及groovy配置實(shí)
現(xiàn)Bean的創(chuàng)建和注入?!纠?-2】基于注解的依賴注入的使用過程。該實(shí)例的具體要求是:在Controller層中,依賴注入Service層;在Service層中,依賴注入DAO層。T
I
P
C
C教案使用Eclipse創(chuàng)建Web應(yīng)用并導(dǎo)入JAR包使用Eclipse創(chuàng)建一個(gè)名為ch1_2的Dynamic
Web
Project,并
將Spring的4個(gè)基礎(chǔ)包、spring-aop-5.3.2.jar和第三方依賴包
commons-logging-1.2.jar復(fù)制到ch1_2的WEB-INF/lib目錄中。T
I
P
C
C教案創(chuàng)建DAO層在src目錄中,創(chuàng)建名為annotation.dao的包,并在該包中創(chuàng)建
TestDao接口和TestDaoImpl實(shí)現(xiàn)類,并將實(shí)現(xiàn)類TestDaoImpl使用@Repository注解標(biāo)注為數(shù)據(jù)訪問層。T
I
P
C
C教案創(chuàng)建Service層在src目錄中,創(chuàng)建名為annotation.service的包,并在該包中創(chuàng)建TestService接口和TestSeviceImpl實(shí)現(xiàn)類,并將實(shí)現(xiàn)類
TestSeviceImpl使用@Service注解標(biāo)注為業(yè)務(wù)邏輯層。T
I
P
C
C教案創(chuàng)建Controller層在src目錄中,創(chuàng)建名為annotation.controller的包,并在該包中創(chuàng)建TestController類,并將TestController類使用
@Controller注解標(biāo)注為控制器層。T
I
P
C
C教案創(chuàng)建配置文件使用注解時(shí),在Spring的配置文件中需要使用
“<context:component-scan
base-package="Bean所在的包路徑"/>”語句掃描使用注解的包,Spring
IoC容器根據(jù)XML配置文件的掃描信息,提供包以及子包中使用注解的類的實(shí)例供應(yīng)用程序使用。在src目錄中,創(chuàng)建名為config的包,并在該包中創(chuàng)建名為
applicationContext.xml的配置文件。T
I
P
C
C教案創(chuàng)建測(cè)試類在src目錄中,創(chuàng)建名為annotation.test的包,并在該包中創(chuàng)建測(cè)試類TestAnnotation。public
class
TestAnnotation
{public
staticvoidmain(String[]
args)
{@SuppressWarnings("resource")ApplicationContext
appCon
=new
ClassPathXmlApplicationContext("config/applicationContext.xml");TestController
tt
=
(TestController)appCon.getBean("testController");tt.save();}}?請(qǐng)思考各層之間是如何依賴注入的?T
I
P
C
C教案本章內(nèi)容Spring概述Spring開發(fā)環(huán)境的構(gòu)建Spring
IoCSpring
AOPSpring
BeanSpring的數(shù)據(jù)庫編程T
I
P
C
C教案1.4
Spring
AOP1.4.1
Spring
AOP的基本概念1.4.2基于注解開發(fā)AspectJT
I
P
C
C教案AOP的概念A(yù)OP,即面向切面編程。它與OOP(Object-OrientedProgramming,面向?qū)ο缶幊蹋┫噍o相成,提供了與OOP不同的抽象軟件結(jié)構(gòu)的視角。在OOP中,以類作為程序的基本單元,而AOP中的基本單元是Aspect(切面)。AOP采取橫向抽取機(jī)制,即將分散在各個(gè)方法中的重復(fù)代碼提取出來,然后在程序編譯或運(yùn)行階段,再將這些抽取出來的代碼應(yīng)用到需要執(zhí)行的地方。這種橫向抽取機(jī)制,采用傳統(tǒng)的OOP是無法辦到的,因?yàn)镺OP實(shí)現(xiàn)的是父子關(guān)系的縱向重用。但是
AOP不是OOP的替代品,而是OOP的補(bǔ)充,它們相輔相成。T
I
P
C
C教案?請(qǐng)思考AOP的應(yīng)用場(chǎng)景T
I
P
C
C教案AOP的術(shù)語1)切面,切面(Aspect)是指封裝橫切到系統(tǒng)功能(如事務(wù)處理)的類。2)連接點(diǎn),連接點(diǎn)(Joinpoint)是指程序運(yùn)行中的一些時(shí)間點(diǎn),如方法的調(diào)用或異常的拋出。3)切入點(diǎn),切入點(diǎn)(Pointcut)是指那些需要處理的連接點(diǎn)。在Spring
AOP中,所有的方法執(zhí)行都是連接點(diǎn),而切入點(diǎn)是一
個(gè)描述信息,它修飾的是連接點(diǎn),通過切入點(diǎn)確定哪些連接點(diǎn)需要被處理。T
I
P
C
C教案切面、連接點(diǎn)和切入點(diǎn)的關(guān)系T
I
P
C
C教案AOP的術(shù)語
4)通知(增強(qiáng)處理),由切面添加到特定的連接點(diǎn)(滿足切入點(diǎn)規(guī)則)的一段代碼,可以將其理解為切面開啟后,切面的方法,切面的具體實(shí)現(xiàn)。
5)引入,引入(Introduction)允許在現(xiàn)有的實(shí)現(xiàn)類中添加自定義的方法和屬性。
6)目標(biāo)對(duì)象,目標(biāo)對(duì)象(Target
Object)是指所有被通知的對(duì)象。如果
AOP框架使用運(yùn)行時(shí)代理的方式(動(dòng)態(tài)的AOP)來實(shí)現(xiàn)切面,那么通知對(duì)象總是一個(gè)代理對(duì)象。7)代理,代理(Proxy)是通知應(yīng)用到目標(biāo)對(duì)象之后,被動(dòng)態(tài)創(chuàng)建的對(duì)象。
8)組入,組入(Weaving)是將切面代碼插入到目標(biāo)對(duì)象上,從而生成代理對(duì)象的過程。根據(jù)不同的實(shí)現(xiàn)技術(shù),AOP組入有三種方式:編譯器組入,需要有特殊的Java編譯器;類裝載期組入,需要有特殊的類裝載器;動(dòng)態(tài)代理組入,在運(yùn)行期為目標(biāo)類添加通知生成子類的方式。Spring
AOP框架默認(rèn)采用動(dòng)態(tài)代理組入,而AspectJ(基于Java語言的AOP框架)采用編譯器組入和類裝載器組入。T
I
P
C
C教案1.4
Spring
AOP1.4.1
Spring
AOP的基本概念1.4.2基于注解開發(fā)AspectJT
I
P
C
C教案1.4.2基于注解開發(fā)AspectJ
1.環(huán)繞通知,是在目標(biāo)方法執(zhí)行前和執(zhí)行后實(shí)施增強(qiáng),可以應(yīng)用于日志記錄、事務(wù)處理等。2.前置通知,是在目標(biāo)方法執(zhí)行前實(shí)施增強(qiáng),可應(yīng)用于權(quán)限管理等。
3.后置返回通知,是在目標(biāo)方法成功執(zhí)行后實(shí)施增強(qiáng),可應(yīng)用于關(guān)閉流、刪除臨時(shí)文件等。
4.后置(最終)通知,是在目標(biāo)方法執(zhí)行后實(shí)施增強(qiáng),與后置返回通知不同的是,不管是否發(fā)生異常都要執(zhí)行該通知,可應(yīng)用于釋放資源。
5.異常通知,是在方法拋出異常后實(shí)施增強(qiáng),可以應(yīng)用于處理異常、記錄日志等。
6.引入通知,是在目標(biāo)類中添加一些新的方法和屬性,可以應(yīng)用于修改目標(biāo)類(增強(qiáng)類)。T
I
P
C
C教案AspectJ注解注解名稱@Aspect@Pointcut描
述用于定義一個(gè)切面,注解在切面類上用于定義切入點(diǎn)表達(dá)式。在使用時(shí),需要定義一個(gè)切入點(diǎn)方法。該方法是一個(gè)返回值void,且方法體為空的普通方法用于定義前置通知。在使用時(shí),通常為其指定value屬性值,該值可以是已有的切入點(diǎn),也可以直接定義切入點(diǎn)表達(dá)式用于定義后置返回通知。在使用時(shí),通常為其指定value屬性值,該值可以是已有的切入點(diǎn),也可以直接定義切入點(diǎn)表達(dá)式用于定義環(huán)繞通知。在使用時(shí),通常為其指定value屬性值,該值可以是已有的切入點(diǎn),也可以直接定義切入點(diǎn)表達(dá)式用于定義異常通知。在使用時(shí),通常為其指定value屬性值,該值可以是已有的切入點(diǎn),也可以直接定義切入點(diǎn)表達(dá)式。另外,還有一個(gè)throwing屬性用于訪問目標(biāo)方法拋出的異常,該屬性值與異常通知方法中同名的形參一致用于定義后置(最終)通知。在使用時(shí),通常為其指定value屬性值,該值可以是已有的切入點(diǎn),也可以直接定義切入點(diǎn)表達(dá)式@Before@AfterReturning@Around@AfterThrowing@AfterT
I
P
C
C教案實(shí)例講解基于注解開發(fā)AspectJ的過程【例1-3】基于注解開發(fā)AspectJ的過程。該實(shí)例的具體要求是:首先,在DAO層的實(shí)現(xiàn)類中,定義save、modify和delete三個(gè)待增強(qiáng)的方法;然后,使用@Aspect注解定義一個(gè)切面,在該切面中定義各類型通知,增強(qiáng)DAO層中的save、modify和delete方法。T
I
P
C
C教案1.使用Eclipse創(chuàng)建Web應(yīng)用并導(dǎo)入JAR包使用Eclipse創(chuàng)建一個(gè)名為ch1_3的Dynamic
Web
Project,除了將
Spring的4個(gè)基礎(chǔ)包、spring-aop-5.3.2.jar和第三方依賴包
commons-logging-1.2.jar復(fù)制到ch1_3的WEB-INF/lib目錄中外,還需要將Spring為AspectJ框架提供的實(shí)現(xiàn)spring-aspects-5.3.2.jar以及AspectJ框架所提供的規(guī)范包aspectjweaver-xxx.jar復(fù)制到WEB-INF/lib目錄中。AspectJ框架所提供的規(guī)范包aspectjweaver-xxx.jar,可通過地址
“/artifact/org.aspectj/aspectjweaver”下載,本書使用的是aspectjweaver-1.9.6.jar。T
I
P
C
C教案2.創(chuàng)建接口及實(shí)現(xiàn)類在src目錄中,創(chuàng)建一個(gè)名為aspectj.dao的包,并在該包中創(chuàng)建接口TestDao和接口實(shí)現(xiàn)類TestDaoImpl。該實(shí)現(xiàn)類作為目標(biāo)類,在切面類中對(duì)其方法進(jìn)行增強(qiáng)處理。使用注解@Repository將目標(biāo)類aspectj.dao.TestDaoImpl注解為目標(biāo)對(duì)象。T
I
P
C
C教案3.創(chuàng)建切面類在src目錄中,創(chuàng)建一個(gè)名為aspectj.annotation的包,并在該包中創(chuàng)建切面類MyAspect。在該類中,首先使用@Aspect注解
定義一個(gè)切面類,由于該類在Spring中是作為組件使用的,所以還需要使用@Component注解。然后,使用@Pointcut注解定義切入點(diǎn)表達(dá)式,并通過切定面類義My方Aspe法ct來表示切入點(diǎn)名稱。最后在每個(gè)通知方法上添加相應(yīng)的注解,并將切入點(diǎn)名稱作為參數(shù)傳遞給需要執(zhí)行增強(qiáng)的通知方法。?請(qǐng)思考切面類MyAspect被@Component注解的目的是?T
I
P
C
C教案4.創(chuàng)建配置文件在src目錄中,創(chuàng)建一個(gè)名為aspectj.config的包,并在該包中創(chuàng)建配置文件applicationContext.xml,在配置文件中指定需要掃描的包,使注解生效。同時(shí),需要啟動(dòng)基于注解的AspectJ支持。T
I
P
C
C教案5.創(chuàng)建測(cè)試類在src目錄中,創(chuàng)建一個(gè)名為aspectj.test的包,并在該包中創(chuàng)建測(cè)試類AspectjAOPTest。public
static
void
main(String[]
args)
{@SuppressWarnings("resource")ApplicationContext
appCon
=new
ClassPathXmlApplicationContext("aspectj/config/applicationContext.xml");//從容器中,獲取增強(qiáng)后的目標(biāo)對(duì)象TestDao
testDaoAdvice
=
(TestDao)appCon.getBean("testDao");//執(zhí)行方法testDaoAdvice.save();System.out.println("==============");testDaoAdvice.modify();System.out.println("==============");testDaoAdvice.delete();}T
I
P
C
C教案6.運(yùn)行測(cè)試類T
I
P
C
C教案本章內(nèi)容Spring概述Spring開發(fā)環(huán)境的構(gòu)建Spring
IoCSpring
AOPSpring
BeanSpring的數(shù)據(jù)庫編程T
I
P
C
C教案1.5
Spring
Bean1.5.1
Bean的實(shí)例化1.5.2
Bean的作用域1.5.3
Bean的初始化和銷毀T
I
P
C
C教案1.5.1
Bean的實(shí)例化在面向?qū)ο缶幊讨?,想使用某個(gè)對(duì)象時(shí),需要事先實(shí)例化該對(duì)象。同樣,在Spring框架中,想使用Spring容器中的Bean,也需要實(shí)例化Bean。Spring框架實(shí)例化Bean有三種方式:構(gòu)造方法實(shí)
例化、靜態(tài)工廠實(shí)例化和實(shí)例工廠實(shí)例化(其中,最常用的實(shí)例方法是構(gòu)造方法實(shí)例化)。【例1-4】Bean的實(shí)例化過程。該實(shí)例的具體要求是:分別使用構(gòu)造方法、靜態(tài)工廠和實(shí)例工廠實(shí)例化Bean。T
I
P
C
C教案1.使用Eclipse創(chuàng)建Web應(yīng)用并導(dǎo)入相關(guān)JAR包使用Eclipse創(chuàng)建一個(gè)名為ch1_4的Dynamic
Web
Project,并將Spring的4個(gè)基礎(chǔ)包和第三方依賴包c(diǎn)ommons-logging-1.2.jar復(fù)制到ch1_4的WEB-INF/lib目錄中。T
I
P
C
C教案2.創(chuàng)建實(shí)例化Bean的類在src目錄中,創(chuàng)建一個(gè)名為instance的包,并在該包中創(chuàng)建
BeanClass、BeanInstanceFactory以及BeanStaticFactory等實(shí)例化Bean的類。package
instance;public
class
BeanClass
{public
String
message;public
BeanClass()
{message="構(gòu)造方法實(shí)例化Bean";}public
BeanClass(String
s)
{message
=
s;}}package
instance;public
class
BeanInstanceFactory
{public
BeanClass
createBeanClassInstance()
{return
new
BeanClass("調(diào)用實(shí)例工廠方法實(shí)例化Bean");}}package
instance;public
class
BeanStaticFactory
{private
static
BeanClass
beanInstance=new
BeanClass("調(diào)用靜態(tài)工廠方法實(shí)例化Bean");public
static
BeanClass
createInstance()
{return
beanInstance;}}T
I
P
C
C教案3.創(chuàng)建配置文件在src目錄中,創(chuàng)建名為config的包,并在該包中創(chuàng)建名為
applicationContext.xml的配置文件,在配置文件中分別使用
BeanClass、BeanInstanceFactory以及BeanStaticFactory實(shí)例化Bean。<!--構(gòu)造方法實(shí)例化Bean--><bean
id="constructorInstance"
class="instance.BeanClass"/><!--靜態(tài)工廠方法實(shí)例化Bean,createInstance為靜態(tài)工廠類BeanStaticFactory中的靜態(tài)方法--><bean
id="staticFactoryInstance"
class="instance.BeanStaticFactory"
factory-method="createInstance"/><!--配置工廠--><bean
id="myFactory"
class="instance.BeanInstanceFactory"/><!--使用factory-bean屬性指定配置工廠,使用factory-method屬性指定使用工廠中哪個(gè)方法實(shí)例化Bean--><bean
id="instanceFactoryInstance"
factory-bean="myFactory"
factory-method="createBeanClassInstance"/>T
I
P
C
C教案4.創(chuàng)建測(cè)試類在src目錄中,創(chuàng)建test包,并在該包中創(chuàng)建測(cè)試類pubTleicsctlaIsnssTetsatInncstean。ce{public
static
void
main(String[]
args)
{@SuppressWarnings("resource")ApplicationContext
appCon
=new
ClassPathXmlApplicationContext("config/applicationContext.xml");//測(cè)試構(gòu)造方法實(shí)例化BeanBeanClass
b1
=
(BeanClass)appCon.getBean("constructorInstance");System.out.println(b1+
b1.message);//測(cè)試靜態(tài)工廠方法實(shí)例化BeanBeanClass
b2
=
(BeanClass)appCon.getBean("staticFactoryInstance");System.out.println(b2
+
b2.message);//測(cè)試實(shí)例工廠方法實(shí)例化BeanBeanClass
b3
=
(BeanClass)appCon.getBean("instanceFactoryInstance");System.out.println(b3
+
b3.message);}T
I
P
C
C教案5.運(yùn)行測(cè)試類T
I
P
C
C教案1.5
Spring
Bean1.5.1
Bean的實(shí)例化1.5.2
Bean的作用域1.5.3
Bean的初始化和銷毀T
I
P
C
C教案1.5.2
Bean的作用域作用域名稱singleton描述默認(rèn)的作用域,使用singleton定義的Bean在Spring容器中只有一個(gè)Bean實(shí)例。Spring容器每次獲取prototype定義的Bean,容器都將創(chuàng)建一個(gè)新的Bean實(shí)例。在一次HTTP請(qǐng)求中容器將返回一個(gè)Bean實(shí)例,不同的HTTP請(qǐng)求返回不同的Bean實(shí)例。僅在WebSpring應(yīng)用程序上下文中使用。在一個(gè)HTTP
Session中,容器將返回同一個(gè)Bean實(shí)例。僅在Web
Spring應(yīng)用程序上下文中使用。為每個(gè)ServletContext對(duì)象創(chuàng)建一個(gè)實(shí)例,即同一個(gè)應(yīng)用共享一個(gè)Bean實(shí)例。僅在Web
Spring應(yīng)用程序上下文中使用。為每個(gè)WebSocket對(duì)象創(chuàng)建一個(gè)Bean實(shí)例。僅在Web
Spring應(yīng)用程序上下文中使用。prototyperequestsessionapplicationwebsocketT
I
P
C
C教案【例1-5】Bean的作用域該實(shí)例的具體要求是:在應(yīng)用ch1_4中,分別定義作用域?yàn)?/p>
singleton和prototype的兩個(gè)Bean。T
I
P
C
C教案1.添加配置文件內(nèi)容在應(yīng)用ch1_4的配置文件applicationContext.xml中,定義2個(gè)Bean,1個(gè)Bean的作用域?yàn)閟ingleton,1個(gè)Bean的作用域?yàn)?/p>
prototype。<bean
id="scope1"
class="instance.BeanClass"
scope="singleton"/><bean
id="scope2"
class="instance.BeanClass"
scope="prototype"/>T
I
P
C
C教案2.創(chuàng)建測(cè)試類在應(yīng)用ch1_4的test包中,創(chuàng)建測(cè)試類TestScope,在該測(cè)試類中分別獲得id為scope1和scope2的Bean實(shí)例。public
class
TestScope
{public
staticvoid
main(String[]
args)
{@SuppressWarnings("resource")ApplicationContext
appCon
=new
ClassPathXmlApplicationContext("config/applicationContext.xml");BeanClass
b1
=
(BeanClass)appCon.getBean("scope1");System.out.println(b1);BeanClass
b2
=
(BeanClass)appCon.getBean("scope1");System.out.println(b2);System.out.println("==========");BeanClass
b3
=
(BeanClass)appCon.getBean("scope2");System.out.println(b3);BeanClass
b4
=
(BeanClass)appCon.getBean("scope2");System.out.println(b4);}}T
I
P
C
C教案3.運(yùn)行測(cè)試類兩次獲取id為scope1的Bean實(shí)例時(shí),IoC容器返回兩個(gè)相同的Bean實(shí)例;而兩次獲取id為scope2的Bean實(shí)例時(shí),IoC容器返回兩個(gè)不同的Bean實(shí)例。?請(qǐng)思考:為什么是這種現(xiàn)象?T
I
P
C
C教案1.5
Spring
Bean1.5.1
Bean的實(shí)例化1.5.2
Bean的作用域1.5.3
Bean的初始化和銷毀T
I
P
C
C教案1.5.3
Bean的初始化和銷毀在實(shí)際工程應(yīng)用中,經(jīng)常需要在Bean使用之前或之后做些必要的操作,Spring為Bean生命周期的操作提供了支持。在配置文件中定義Bean時(shí),可以使用init-method和destroy-method屬性對(duì)Bean進(jìn)行初始化和銷毀。【例1-6】Bean的初始化和銷毀。該實(shí)例的具體要求是:在應(yīng)用
ch1_4中,首先,定義一個(gè)MyService類,在該類中定義初始化方法和銷毀方法;然后,在配置文件中,使用init-method和destroy-method屬性對(duì)MyService的Bean對(duì)象進(jìn)行初始化和銷毀。T
I
P
C
C教案1.創(chuàng)建Bean的類在應(yīng)用ch1_4的src目錄中,創(chuàng)建一個(gè)名為service的包,并在該包中創(chuàng)建MyService類。package
service;
public
class
MyService
{public
MyService()
{System.out.println("執(zhí)行構(gòu)造方法");}public
void
initService()
{System.out.println("initMethod");}public
void
destroyService()
{System.out.println("destroyMethod");}}T
I
P
C
C教案2.添加配置文件內(nèi)容在應(yīng)用ch1_4的配置文件applicationContext.xml中,配置1個(gè)id為beanLife的Bean,并使用init-method屬性指定初始化方法,使用destroy-method屬性指定銷毀方法。<!--配置bean,使用init-method屬性指定初始化方法,使用destroy-method屬性指定銷毀方法--><bean
id="beanLife"
class="service.MyService"
init-method="initService"
destroy-method="destroyServiceT
I
P
C
C教案3.創(chuàng)建測(cè)試類在應(yīng)用ch1_4的test包中,創(chuàng)建測(cè)試類TestInitAndDestroy。public
class
TestInitAndDestroy
{public
static
void
main(String[]
args)
{//為了方便演示銷毀方法的執(zhí)行,這里使用ClassPathXmlApplicationContextClassPathXmlApplicationContext
appCon=new
ClassPathXmlApplicationContext("config/applicationContext.xml");System.out.println("獲得對(duì)象前");MyService
blife=(MyService)appCon.getBean("beanLife");System.out.println("獲得對(duì)象后"+blife);appCon.close();//關(guān)閉容器,銷毀Bean對(duì)象}}T
I
P
C
C教案4.運(yùn)行測(cè)試類從圖可以看出,加載配置文件時(shí),創(chuàng)建Bean對(duì)象,執(zhí)行了Bean的構(gòu)造方法和
初始化方法initService();獲得對(duì)象后,關(guān)閉容器時(shí),執(zhí)行了Bean的銷毀方法destroyService()。T
I
P
C
C教案本章內(nèi)容Spring概述Spring開發(fā)環(huán)境的構(gòu)建Spring
IoCSpring
AOPSpring
BeanSpring的數(shù)據(jù)庫編程T
I
P
C
C教案1.6
Spring的數(shù)據(jù)庫編程1.6.1
Spring
JDBC的XML配置1.6.2
Spring
JdbcTemplate的常用方法1.6.3基于@Transactional注解的聲明式事務(wù)管理1.6.4如何在事務(wù)處理中捕獲異常T
I
P
C
C教案1.6.1
Spring
JDBC的XML配置Spring數(shù)據(jù)庫編程主要使用Spring
JDBC模塊的core和dataSource包。core包是JDBC的核心功能包,包括常用的
JdbcTemplate類;dataSource包是訪問數(shù)據(jù)源的工具類包。使用Spring
JDBC操作數(shù)據(jù)庫,需要對(duì)其進(jìn)行配置。<!--配置數(shù)據(jù)源--><bean
id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"><!--MySQL數(shù)據(jù)庫驅(qū)動(dòng)--><property
name="driverClassName"
value="com.mysql.jdbc.Driver"/><!--連接數(shù)據(jù)庫的URL--><property
name="url"
value="jdbc:mysql://localhost:3306/springtest?characterEncoding=utf8"/><!--連接數(shù)據(jù)庫的用戶名--><property
name="username"
value="root"/><!--連接數(shù)據(jù)庫的密碼--><property
name="password"
value="root"/></bean><!--配置JDBC模板--><bean
id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate"><property
name="dataSource"
ref="dataSource"/></bean>@Repositorypublic
class
TestDaoImpl
implements
TestDao{@Autowired//使用配置文件中的JDBC模板private
JdbcTemplate
jdbcTemplate;……}T
I
P
C
C教案1.6
Spring的數(shù)據(jù)庫編程1.6.1
Spring
JDBC的XML配置1.6.2
Spring
JdbcTemplate的常用方法1.6.3基于@Transactional注解的聲明式事務(wù)管理1.6.4如何在事務(wù)處理中捕獲異常T
I
P
C
C教案1.6.2
Spring
JdbcTemplate的常用方法(1)public
int
update(String
sql,Object
args[])該方法可以對(duì)數(shù)據(jù)表進(jìn)行增加、修改、刪除等操作。使用args[]設(shè)置SQL語句中的參數(shù),并返回更新的行數(shù)。String
insertSql="insert
into
user
values(null,?,?)";Object
param1[]={"chenheng1","男"};
jdbcTemplate.update(sql,param1);(2)public
List<T>
query
(String
sql,
RowMapper<T>rowMapper,
Object
args[])該方法可以對(duì)數(shù)據(jù)表進(jìn)行查詢操作。rowMapper將結(jié)果集映射到用戶自定義的類中(前提是自定義類中的屬性與數(shù)據(jù)表的字段對(duì)應(yīng))。String
selectSql
="select
*
from
user";RowMapper<MyUser>
rowMapper
=
new
BeanPropertyRowMapper<MyUser>(MyUser.class);List<MyUser>
list
=
jdbcTemplate.query(sql,
rowMapper,
null);T
I
P
C
C教案【例1-7】Spring
JDBC的使用過程。該實(shí)例的具體要求是:首先,在MySQL數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)表
user;然后,使用Spring
JDBC對(duì)數(shù)據(jù)表user進(jìn)行增刪改查。T
I
P
C
C教案1.使用Eclipse創(chuàng)建Web應(yīng)用并導(dǎo)入相關(guān)JAR包使用Eclipse創(chuàng)建一個(gè)名為ch1_5的Dynamic
Web
Project,除了將Spring的4個(gè)基礎(chǔ)包和第三方依賴包c(diǎn)ommons-logging-1.2.jar復(fù)制到ch1_5的WEB-INF/lib目錄中,還需要將MySQL數(shù)據(jù)庫的連接驅(qū)動(dòng)JAR包(mysql-connector-java-5.1.45-bin.jar)、Spring
JDBC(spring-jdbc-5.3.2.jar)、Spring事務(wù)處理(spring-tx-5.3.2.jar)以及Spring
AOP的JAR包(spring-aop-5.3.2.jar)復(fù)制到WEB-INF/lib目錄中。T
I
P
C
C教案2.創(chuàng)建配置文件在src目錄中,創(chuàng)建名為config的包,并在該包中創(chuàng)建名為
applicationContext.xml的配置文件,在配置文件中配置數(shù)據(jù)源和JDBC模板。T
I
P
C
C教案3.創(chuàng)建數(shù)據(jù)表與實(shí)體類package
entity;public
class
MyUser
{private
Integer
uid;private
String
uname;private
String
usex;//省略set和get方法public
String
toString()
{return
"myUser
[uid="
+
uid
+",
uname="
+
uname
+
",
usex="
+
usex
+
"]";}}T
I
P
C
C教案4.創(chuàng)建數(shù)據(jù)訪問層在應(yīng)用ch1_5的src目錄中,創(chuàng)建一個(gè)名為dao的包,在該包中創(chuàng)建數(shù)據(jù)訪問接口TestDao和接口實(shí)現(xiàn)類TestDaoImpl。在實(shí)現(xiàn)類
TestDaoImpl中使用@Repository注解標(biāo)注此類為數(shù)據(jù)訪問層,并使用@Autowired注解依賴注入JdbcTemplate。T
I
P
C
C教案5.創(chuàng)建業(yè)務(wù)邏輯層在應(yīng)用ch1_5的src目錄中,創(chuàng)建一個(gè)名為service的包,在該包
中創(chuàng)建數(shù)據(jù)訪問接口TestService和接口實(shí)現(xiàn)類TestServiceImpl
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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版敬老院土地承包及養(yǎng)老社區(qū)配套設(shè)施改造合同3篇
- 實(shí)驗(yàn)室設(shè)備采購(gòu)與維護(hù)的標(biāo)準(zhǔn)化流程
- 二零二五年度定制家具設(shè)計(jì)、生產(chǎn)及售后服務(wù)合同2篇
- 品牌活動(dòng)中創(chuàng)意思維的融入策略與實(shí)例
- 辦公室電氣設(shè)備安全使用指南
- 小學(xué)生英語口語表達(dá)能力的提升路徑
- 2025年度牛羊購(gòu)銷合同范例(含詳細(xì)內(nèi)容)3篇
- 高中化學(xué)選修四第四章第二節(jié)化學(xué)電源
- 二零二五年度數(shù)據(jù)中心暖通系統(tǒng)建設(shè)合同2篇
- 禮品店前臺(tái)服務(wù)心得體會(huì)
- JTGT H21-2011 公路橋梁技術(shù)狀況評(píng)定標(biāo)準(zhǔn)
- 數(shù)字政府建設(shè)簡(jiǎn)介演示
- 小學(xué)數(shù)學(xué)五年級(jí)下冊(cè)通分練習(xí)100題附答案
- 肛周感染的護(hù)理查房
- 會(huì)計(jì)人員年度個(gè)人工作總結(jié)
- 紅外隱身材料課件
- 2025中國(guó)制造重點(diǎn)領(lǐng)域技術(shù)路線圖
- 八大危險(xiǎn)作業(yè)檢查表
- 村務(wù)監(jiān)督業(yè)務(wù)培訓(xùn)課件
- 初三家長(zhǎng)會(huì)語文教師發(fā)言
- 粵教版科學(xué)四年級(jí)上冊(cè)全冊(cè)試卷(含答案)
評(píng)論
0/150
提交評(píng)論