版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
JavaWeb編程技術(shù)本章首先介紹Spring框架的基本概念,然后重點(diǎn)介紹Spring的Ioc容器、依賴注入概念和Bean的配置與實(shí)例化。Spring框架簡介Spring容器的概念依賴注入的概念bean的配置與實(shí)例化第9章Spring快速入門Spring是目前最流行的輕量級Java企業(yè)開發(fā)框架,它是為解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。該框架以強(qiáng)大的功能和卓越的性能受到了眾多開發(fā)人員的喜愛。Spring框架簡介Spring框架1.0版于2004年3月發(fā)布。在過去的近20年中,Spring框架一直不斷發(fā)展,目前已成為Java領(lǐng)域中開發(fā)企業(yè)應(yīng)用程序的首選框架。9.1.1Spring框架模塊9.1.2添加Spring依賴模塊9.1Spring框架模塊9.1.1Spring框架是高度模塊化的,它包含20多個不同的模塊。Spring框架模塊提供了Spring反轉(zhuǎn)控制容器、依賴注入(DI)、WebMVC框架、AOP等核心特性。圖9-1列出了Spring框架的主要模塊。Spring框架模塊9.1.1Spring框架的所有模塊都用jar文件存儲,如果需要特定的技術(shù),可以將它們包含在類路徑中。表9-1列出了Spring框架的主要模塊,并簡要描述了每個模塊的內(nèi)容和用于依賴項管理的構(gòu)件名稱。實(shí)際jar文件的名稱可能不同,這取決于如何獲取模塊。模塊組描述CoreContainerspring-core和spring-beans模塊提供了Spring的DI功能和IoC容器實(shí)現(xiàn)。spring-expressions模塊為在Spring應(yīng)用中通過Spring表達(dá)式語言配置應(yīng)用程序?qū)ο筇峁┝酥С諨ataAccess/Integrationspring-jdbc模塊簡化用JDBC與數(shù)據(jù)庫的交互,spring-orm模塊提供了與ORM(對象關(guān)系映射)框架的集成,如JPA和Hibernate。spring-jms模塊簡化了與JMS提供者的交互AOP和Instrumentation包含支持AOP(面向切面編程)的類和工具模塊。spring-aop模塊提供Spring的AOP功能,spring-instrument模塊提供了類工具的支持Web/Remotingspring-web和spring-webmvc模塊是用于開發(fā)Web應(yīng)用和RESTful的Web服務(wù)。spring-webflux為Web應(yīng)用開發(fā)帶來了反應(yīng)式編程能力Test包含spring-test模塊,簡化了創(chuàng)建單元和集成測試添加Spring依賴模塊9.1.2有兩種方式使用Spring框架,一種方法是使用Maven構(gòu)建應(yīng)用程序,可以在其pom.xml文件中添加所依賴的模塊,項目將自動下載Spring框架的模塊,如下所示。<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.2</version></dependency>添加Spring依賴模塊9.1.2使用Maven構(gòu)建工具的一個好處是,下載一個Spring模塊,會自動下載它所依賴的模塊。比如,若在pom.xml文件中添加了spring-context模塊,Maven將自動下載spring-aop、spring-benas、spring-core、spring-jcl和spring-expressions等模塊。這幾個模塊是開發(fā)Spring應(yīng)用的基礎(chǔ)。如果需要開發(fā)Web應(yīng)用程序,應(yīng)該添加spring-webmvc模塊,如下所示。<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.0.2</version></dependency>Spring容器與依賴注入9.2Spring容器和依賴注入是Spring框架的兩個最基本概念,下面我們介紹這兩個概念。9.2.1Spring容器9.2.2依賴注入9.2.3Spring配置文件9.2.4一個簡單的Spring程序9.2.5依賴注入實(shí)現(xiàn)方式Spring容器9.2.1
任何應(yīng)用程序都是由很多組件組成的,每個組件負(fù)責(zé)整個應(yīng)用功能的一部分,這些組件需要與其他的應(yīng)用元素進(jìn)行協(xié)調(diào)以完成自己的任務(wù)。當(dāng)應(yīng)用程序運(yùn)行時,需要以某種方式創(chuàng)建并引入這些組件。Spring的核心是提供了一個容器(container),通常稱為應(yīng)用上下文(applicationcontext),它負(fù)責(zé)創(chuàng)建和管理應(yīng)用中所有組件。Spring容器中管理的對象稱為bean。Spring容器在啟動時通過讀取配置文件(applicationContext.xml)中信息構(gòu)建所有組件對象。容器將這些組件裝配到一起,從而形成一個完整的程序。就像一所房子,由磚瓦、木料、水泥等組成一樣。Spring容器9.2.1將組件裝配在一起,是通過一種基于依賴注入的模式實(shí)現(xiàn)的。依賴注入是Spring框架的核心機(jī)制,它提供了框架的重要功能,包括依賴注入和bean的生命周期管理功能。圖9-2給出了Spring容器中組件管理和依賴注入的示意圖。Spring容器9.2.1
要在Spring中實(shí)現(xiàn)依賴注入,需要一個容器。在Spring中,它是ApplicationContext接口的一個實(shí)例。Spring提供了幾種不同的ApplicationContext實(shí)現(xiàn)。其中,ClassPathXmlApplicationContext,從類加載路徑下的XML文件中獲取上下文定義信息。FileSystemXmlApplicationContext,從文件系統(tǒng)的XML文件中獲取上下文定義信息。XmlWebApplicationContext,從Web系統(tǒng)中的XML文件中獲取上下文定義信息。AnnotationConfigApplicationContext,就需使用Java配置。下面代碼創(chuàng)建一個ClassPathXmlApplicationContext容器對象,它從類加載路徑下的配置文件中獲取上下文信息。StringxmlPath="src/main/webapp//WEB-INF/applicationContext.xml";ApplicationContextcontext=
newClassPathXmlApplicationContext(xmlPath);依賴注入9.2.2
依賴注入是Spring框架的核心特征,其主要目的是降低程序?qū)ο笾g的耦合度。Java應(yīng)用程序通常包括多個相互協(xié)作對象,這些對象相互依賴。
在傳統(tǒng)的程序設(shè)計過程中,當(dāng)某個Java實(shí)例(調(diào)用者)需要另一個Java實(shí)例(被調(diào)用者)時,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實(shí)例。
在依賴注入模式下,創(chuàng)建被調(diào)用者的工作不再由調(diào)用者完成,而是由Spring容器來完成,然后注入給調(diào)用者,這稱為依賴注入(DependencyInjection,簡稱DI)。
假設(shè)開發(fā)一個航班管理應(yīng)用程序,其中包含Passenger(乘客)和Country(國家)兩個實(shí)體。每位乘客都來自一個國家,一個Passenger對象就依賴于一個Country對象(見圖9-3)。在清單9.1和9.2中直接初始化了這個依賴項。Country.java清單9.1publicclassCountry{ privateStringname; privateStringcodeName; publicCountry(Stringname,StringcodeName){ =name; this.codeName=codeName; } publicStringgetName(){ returnname; } publicStringgetCodeName(){ returncodeName; }}Passenger.java清單9.2publicclassPassenger{privateStringname;privateCountrycountry;publicPassenger(Stringname){=name;this.country=newCountry("中國","CHN");}publicStringgetName(){returnname;}publicCountrygetCountry(){returncountry;}}依賴注入9.2.2
為Passenger類定義了一個name字段和它的getter方法,定義一個country字段和它的getter方法。創(chuàng)建一個構(gòu)造方法初始化name和country字段。在Passenger的構(gòu)造方法中,創(chuàng)建并初始化了國家對象,這表明國家和乘客之間存在緊耦合。這種方法的缺點(diǎn)是:Passenger類直接依賴Country類,Passenger類和Country類也不可能分開測試。
正是由于這些缺點(diǎn),就產(chǎn)生了一個新的方法:依賴注入。使用依賴項注入方法,對象被添加到容器中,容器在創(chuàng)建對象時注入依賴項。這一過程基本上與傳統(tǒng)的過程相反,因此也被稱為控制反轉(zhuǎn)(inversionofcontrol)。其基本思想是消除應(yīng)用程序組件對某個實(shí)現(xiàn)的依賴,并將類實(shí)例化的控制權(quán)限委托給容器。對上面示例,要消除對象之間的直接依賴關(guān)系,可重寫Passenger類,如清單9.3所示。修改后的Passenger.java清單9.3publicclassPassenger{privateStringname;privateCountrycountry;publicPassenger(Stringname){=name;}publicStringgetName(){returnname;}publicCountrygetCountry(){returncountry;}publicvoidsetCountry(Countrycountry){this.country=country;}}Spring配置文件9.2.3Spring從1.0版本開始,就支持基于XML的配置文件,從2.5版本開始,增加了使用注解的配置。下面是Spring的配置文件的基本框架。<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-4.3.xsd">…</beans>配置文件的根元素是<beans>,其中可包含其他元素,比如最重要的是使用<bean>元素對容器管理的bean對象進(jìn)行配置。如果需要更強(qiáng)的Spring配置能力,可以在schemaLocation屬性中添加相應(yīng)的schema。一個簡單的Spring程序9.2.4
接下來通過一個示例來演示IoC容器的使用。(1)在IDEA中創(chuàng)建名為chapter09的JakartaEE項目,在pom.xml文件中添加Spring框架所需的依賴項,如下所示。<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency>一個簡單的Spring程序9.2.4(2)在src/main/java目錄中創(chuàng)建com.boda.xy包,在該包中創(chuàng)建Country類和Passenger類。這里使用清單9.1和清單9.3的類。(3)在src/main/resources目錄中創(chuàng)建Spring配置文件applicationContext.xml,配置文件名可以自定義,如清單9.4所示。applicationContext.xml清單9.4<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd"><beanid="country"class="com.boda.xy.Country"><constructor-argname="name"value="中國"/><constructor-argname="codeName"value="CHN"/></bean><beanid="passenger"class="com.boda.xy.Passenger"><constructor-argname="name"value="張大海"/><propertyname="country"ref="country"/></bean></beans>FlightSystemTest.java清單9.5publicclassFlightSystemTest{@TestpublicvoidtestPassenger(){StringxmlPath="src/main/webapp//WEB-INF/applicationContext.xml";ApplicationContextcontext=newFileSystemXmlApplicationContext(xmlPath);Passengerpassenger=(Passenger)context.getBean("passenger");System.out.println(passenger.getName());System.out.println(passenger.getCountry().getName());}}(4)在src\test\java中創(chuàng)建com.boda.xy.FlightTest測試類,并在該類中創(chuàng)建一個名為testPassenger()方法,如清單9.5所示。
在測試類的testPassenger()方法中,首先定義了配置文件的路徑,然后加載配置文件創(chuàng)建Spring容器,并通過容器獲取一個Passenger對象,最后在控制臺將它們打印出來。
要在IDEA中運(yùn)行測試方法,在編輯窗口中單擊testPassenger()方法左側(cè)小三角,在彈出菜單中選擇RuntestPassenger()命令。使用JUnit測試testPassenger()方法,控制臺輸出結(jié)果如圖9-4所示。依賴注入實(shí)現(xiàn)方式9.2.5
在Spring中,通過依賴注入的方式調(diào)用者只需完成較少的工作。當(dāng)調(diào)用者乘客需要一個國家對象時,可以由Spring容器來創(chuàng)建該國家對象并將其注入到調(diào)用對象中。Spring的依賴注入主要有兩種方式實(shí)現(xiàn):設(shè)值注入。Spring容器使用屬性的setter方法來注入被依賴的實(shí)例。構(gòu)造注入。Spring容器使用構(gòu)造方法來注入被依賴的實(shí)例。1.用設(shè)值依賴注入
設(shè)值依賴注入是指Spring容器通過調(diào)用者類的setter方法把所依賴的實(shí)例注入。例如在ProductController類中定義一個ProductService類型的成員,然后定義一個setter方法就可以注入ProductService對象。ProductController.java清單9.6publicclassProductController{privateProductServiceproductService;publicProductController(){}//定義setter方法注入一個ProductService實(shí)例publicvoidsetProductService(ProductServiceproductService){ductService=productService;}publicintaddProduct(Productproduct){productService.addProduct(product);}}這里,不是在ProductController類的構(gòu)造方法中創(chuàng)建ProductService實(shí)例,而是定義一個setter方法,通過該方法注入一個ProductService實(shí)例,而這個實(shí)例是由Spring容器創(chuàng)建的。在Spring項目的src/applicationContext.xml配置文件中添加bean的定義,對設(shè)值注入的屬性使用<property>元素配置,下面文件配置了controller和service兩個bean,代碼如下。<beanid="service"class="com.boda.service.ProductService"></bean><beanid="controller"class="com.boda.controller.ProductController"><propertyname="productServie"ref="service"></property></bean>這里首先配置了ProductService類的一個bean實(shí)例,然后在配置ProductController類的productService屬性時,使用了<property>元素的ref屬性引用ProductService類的一個實(shí)例。ProductService類的bean由service配置。依賴注入實(shí)現(xiàn)方式9.2.5
2.用構(gòu)造方法依賴注入構(gòu)造方法注入是指Spring容器通過調(diào)用者類的構(gòu)造方法把所依賴的實(shí)例注入?;跇?gòu)造方法的注入需要為調(diào)用者類定義帶參數(shù)的構(gòu)造方法實(shí)現(xiàn),每個參數(shù)代表一個依賴。例如,在ProductController類中可以定義構(gòu)造方法,如清單9.7所示。ProductController.java清單9.7publicclassProductController{privateProductServiceproductService;//定義構(gòu)造方法注入ProductService的一個實(shí)例publicProductController(ProductServiceproductService){ductService=productService;}publicintaddProduct(Productproduct){productService.addProduct(product);}}這里,為ProductController類定義一個構(gòu)造方法,將ProductService的一個實(shí)例作為構(gòu)造方法的一個參數(shù)注入。在Spring配置文件applicationContext.xml中,對構(gòu)造注入的屬性使用<constructor-arg>元素配置,下面文件配置了ProductController和ProductService兩個bean,代碼如下。<beanid="service"class="com.boda.service.ProductService"></bean><beanid="controller"class="com.boda.controller.ProductController"><!--為controller對象構(gòu)造方法注入service對象--><constructor-argref="service"/>
</bean>
設(shè)值注入和構(gòu)造方法注入是目前主流的依賴注入實(shí)現(xiàn)方式,這兩種方法各有優(yōu)點(diǎn),也各有缺點(diǎn)。Spring框架對這兩種依賴注入方法都提供了良好的支持,這也為開發(fā)人員提供了更多的選擇。
那么在使用Spring開發(fā)應(yīng)用程序時應(yīng)該選擇哪一種注入方式呢?
就一般項目開發(fā)來說,應(yīng)該以設(shè)值注入為主,輔之以構(gòu)造方法注入作為補(bǔ)充,可以達(dá)到最佳的開發(fā)效率。bean的配置與實(shí)例化9.3可以把Spring容器看做是一個用于生產(chǎn)和管理bean大型工廠。要使用這個工廠生產(chǎn)和管理bean,需要開發(fā)者在配置文件中配置bean。Spring容器一般使用XML配置文件注冊并管理bean之間的依賴關(guān)系。XML配置文件的根元素是<beans>,其中包含多個<bean>子元素,每個<bean>子元素定義一個bean,并描述該bean如何被裝配到Spring容器中。<bean>元素可包含多個屬性和一些子元素,具體如表9-2所示。構(gòu)造方法初始化9.3.1Spring容器可以調(diào)用bean類的無參數(shù)或有參數(shù)構(gòu)造方法實(shí)例化bean,這種方式稱為構(gòu)造方法實(shí)例化。下面代碼就是調(diào)用ProductService類的無參數(shù)構(gòu)造方法創(chuàng)建bean實(shí)例。<beanid="service"class="com.boda.service.ProductService"></bean>向構(gòu)造方法傳遞參數(shù)9.3.2Spring支持通過帶參數(shù)的構(gòu)造方法初始化類。假設(shè)Employee類定義了如下構(gòu)造方法:下面的bean定義使用<constructor-arg>子元素通過參數(shù)名指定傳遞給構(gòu)造方法的參數(shù)值。publicEmployee(Stringname,intage){=name;this.age=age;}<beanid="employee"class="com.boda.xy.Employee"><constructor-argname="name"value="張大海"/><constructor-argname="age"value="20"/></bean>除通過名稱傳遞參數(shù)外,Spring還支持通過索引的方式傳遞參數(shù),第一個參數(shù)的索引值為0,第二個參數(shù)索引值為1,以此類推。具體如下。<beanid="employee"class="org.bu.xxxy.Employee"><constructor-argindex="0"value="張大海"/><constructor-argindex="1"value="20"/></bean>需要說明的是,采用這種方式,必須傳遞對應(yīng)構(gòu)造方法的所有參數(shù),缺一不可。靜態(tài)工廠實(shí)例化9.3.3Spring還支持通過調(diào)用類的一個工廠方法來初始化類。下面代碼創(chuàng)建一個工廠類RobotFactory,該類中定義一個靜態(tài)方法createRobot()用來實(shí)例化Robot對象,代碼如下。在配置文件applicationContext.xml文件中添加配置代碼。下面的bean定義展示了通過工廠方法來實(shí)例化com.boda.xy.Robot。publicclassRobotFactory{publicstaticRobotcreateRobot(){returnnewRobot("教師機(jī)器人");}}<beanname="robot"class="com.boda.RobotFactory"
factory-method="createRobot"/>使用下面代碼返回配置的Robot實(shí)例。StringxmlPath="applicationContext.xml";ApplicationContextcontext=newClassPathXmlApplicationContext(xmlPath);Robotrobot=(Robot)context.getBean("robot");System.out.println(robot.getName());實(shí)例工廠實(shí)例化9.3.4在使用實(shí)例工廠實(shí)例化bean時,要求在開發(fā)者在工廠類中創(chuàng)建一個實(shí)例方法來創(chuàng)建bean的實(shí)例。在配置bean時需要使用factory-bean屬性指定配置的工廠,同時還需要使用factory-method屬性指定實(shí)例工廠中的實(shí)例方法。下面創(chuàng)建一個工廠類RobotFactory,該類中定義一個實(shí)例方法createRobot()用來實(shí)例化Robot對象,代碼如下。publicclassRobotFactory{publicRobotcreateRobot(){returnnewRobot("教師機(jī)器人");;}}實(shí)例工廠實(shí)例化9.3.4在applicationContext.xml配置文件中添加配置代碼。下面的bean定義展示了通過實(shí)例工廠方法來實(shí)例化com.boda.Robot。該例中使用facory-bean屬性指定實(shí)例工廠,使用facory-method屬性指定實(shí)例方法。下面是測試代碼:<beanname="robotFactory"class="com.boda.RobotFactory"/><beanname="robot"factory-bean="robotFactory"factory-method="createRobot"/>StringxmlPath="applicationContext.xml";ApplicationContextcontext=newClassPathXmlApplicationContext(xmlPath);Robotrobot=(Robot)context.getBean("robot");System.out.println(robot.getName());銷毀方法的使用9.3.5有時,希望類在銷毀之前執(zhí)行某些操作,這可以在bean定義中使用destroy-method屬性,來指定在bean銷毀前要被執(zhí)行的方法。下例bean定義通過java.util.concurrent.Executors的newCachedThreadPool()靜態(tài)方法創(chuàng)建一個java.util.concurrent.ExecutorService實(shí)例,通過destroy-method屬性指定銷毀方法shutdown()。這樣,Spring會在銷毀ExecutorService實(shí)例前,調(diào)用其shutdown()方法。<beanid="executorService"class="java.util.concurrent.Executors"factory-method="newCachedThreadPool"
destroy-method="shutdown"/>bean的裝配方式9.4bean的裝配可以理解為如何在Spring容器中創(chuàng)建bean及注入依賴關(guān)系,bean的裝配方式即bean依賴注入的方式。Spring容器支持多種形式的裝配方式,包括基于XML的裝配、基于注解的裝配和基于Java代碼的裝配。9.4.1基于XML的裝配9.4.2基于注解的裝配基于XML的裝配9.4.1
基于XML的裝配是指在Spring的配置文件中聲明bean以及依賴注入。9.2節(jié)中介紹的依賴注入就是屬于這種方式。
使用XML配置文件有兩種依賴注入方式:構(gòu)造注入和設(shè)值注入。使用設(shè)值注入時,在Spring的配置文件中,需要使用<bean>元素的<property>子元素為每個子元素注入值。設(shè)值注入要求bean類必須滿足以下兩點(diǎn)要求:bean類必須提供一個默認(rèn)的構(gòu)造方法。bean類必須為需要注入的屬性提供對應(yīng)的setter方法。對于使用構(gòu)造注入時,在Spring的配置文件中,需要使用<bean>元素的<constructor-arg>子元素類定義構(gòu)造方法的參數(shù),可以使用其value屬性或子元素設(shè)置參數(shù)值。構(gòu)造注入要求bean類必須提供帶參數(shù)的構(gòu)造
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度定制工作服設(shè)計與生產(chǎn)服務(wù)合同15篇
- 2025年房產(chǎn)項目管理合同8篇
- 二零二五版主題餐廳投資與管理合作協(xié)議3篇
- 二零二五版智慧城市基礎(chǔ)設(shè)施維保綜合服務(wù)協(xié)議3篇
- 2025年無菌包裝用包裝材料項目規(guī)劃申請報告
- 2025年腹瀉治療藥項目規(guī)劃申請報告
- 2025年計量標(biāo)準(zhǔn)器具:化學(xué)計量標(biāo)準(zhǔn)器具項目申請報告模板
- 2025年硅-鋁絲材項目提案報告模稿
- 二零二五年度船員福利待遇及晉升服務(wù)合同3篇
- 二零二五版合資公司100%股權(quán)轉(zhuǎn)讓及管理權(quán)移交協(xié)議3篇
- 《道路交通安全法》課件完整版
- 向女朋友認(rèn)錯保證書范文
- 五分?jǐn)?shù)加法和減法(課件)-數(shù)學(xué)五年級下冊
- 2024年四川省綿陽市中考語文試卷(附真題答案)
- 設(shè)計材料與工藝課程 課件 第1章 產(chǎn)品設(shè)計材料與工藝概述
- 幼兒園反恐防暴技能培訓(xùn)內(nèi)容
- 食品企業(yè)質(zhì)檢員聘用合同
- 中醫(yī)診所內(nèi)外部審計制度
- 自然辯證法學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 2024年國家危險化學(xué)品經(jīng)營單位安全生產(chǎn)考試題庫(含答案)
- 護(hù)理員技能培訓(xùn)課件
評論
0/150
提交評論