




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第1章SpringBoot開發(fā)入門《SpringBoot企業(yè)級開發(fā)教程(第2版)》全套可編輯PPT課件學習目標/Target了解SpringBoot簡介,能夠簡述SpringBoot的發(fā)展過程了解SpringBoot的特性,能夠簡述SpringBoot的特性掌握SpringBoot入門案例,能夠使用SpringInitializr方式和Maven方式構建SpringBoot項目學習目標/Target了解單元測試與熱部署,能夠對SpringBoot項目進行單元測試和熱部署熟悉SpringBoot項目打包和運行,能夠將SpringBoot項目打包為JAR包和WAR包并運行熟悉SpringBoot原理解析,能夠簡述SpringBoot起步依賴、自動配置和執(zhí)行流程的原理章節(jié)概述/SummarySpring是一個非常優(yōu)秀的組件管理容器,但是為了管理容器中的組件,使用Spring搭建JavaEE應用程序時往往需要進行大量的配置或注解,這些配置工作都屬于項目的基礎搭建,通常與業(yè)務功能無關,并且不熟悉搭建過程的人員在配置時很容易出錯。為了簡化Spring應用的搭建和配置過程,SpringBoot應運而生。SpringBoot是一個基于Spring的全新開源框架,它可以簡化Spring應用的初始搭建和配置過程,使用更加簡單,功能更加豐富。目錄/Contents1.11.2SpringBoot概述SpringBoot入門案例1.3SpringBoot原理解析1.4單元測試與熱部署1.5SpringBoot項目打包和運行SpringBoot概述1.11.1.1
SpringBoot簡介先定一個小目標!
先定一個小目標!了解SpringBoot簡介,能夠簡述SpringBoot的發(fā)展過程1.1.1
SpringBoot簡介在SpringBoot框架出現(xiàn)之前,為了解決Java企業(yè)級應用開發(fā)笨重臃腫的問題,JavaEE最常用的框架是Spring。Spring是2003年興起的輕量級的Java開源框架,旨在簡化Java企業(yè)級開發(fā)。Spring框架是輕量級的,但它的配置卻是重量級的。早期版本的Spring專注于XML配置,開發(fā)一個程序需要配置各種XML配置文件。在Spring中使用注解開發(fā)逐漸占據(jù)了主流地位。SpringSpring4.x版本基本可以脫離XML配置文件進行項目開發(fā)。1.1.1
SpringBoot簡介Pivotal團隊在原有Spring框架的基礎上通過注解的方式進一步簡化了Spring框架的使用,并基于Spring框架開發(fā)了全新的SpringBoot框架。2014年4月正式推出了SpringBoot1.0版本,同時在2018年3月又推出了SpringBoot2.0版本。SpringBoot2.x版本在SpringBoot1.x版本的基礎上進行了諸多功能的改進和擴展,同時進行了大量的代碼重構。1.1.1
SpringBoot簡介提升Spring開發(fā)者體驗的工具SpringBoot并不是替代Spring框架的解決方案,而是和Spring框架緊密結合用于提升Spring開發(fā)者體驗的工具。構建Spring項目SpringBoot框架本身并不提供Spring框架的核心特性以及擴展功能,它只是使構建Spring應用變得簡單。開箱即用SpringBoot集成了大量常用的第三方庫配置,使用SpringBoot開發(fā)程序時,幾乎是開箱即用。約定優(yōu)于配置開發(fā)過程中大量使用約定優(yōu)于配置的思想來擺脫Spring框架中各種復雜的手動配置。SpringBoot1.1.1SpringBoot簡介隨著近幾年微服務開發(fā)的需求增長和火爆,如何快速、簡便地構建一個準生產環(huán)境的Spring應用成為擺在開發(fā)者面前的難題,SpringBoot框架的出現(xiàn)恰好完美解決了這些問題,同時內部還簡化了許多常用的第三方庫配置,使微服務開發(fā)更加便利,這也間接體現(xiàn)了SpringBoot框架的優(yōu)勢和學習SpringBoot的必要性。1.1.2
SpringBoot的特性先定一個小目標!
先定一個小目標!了解SpringBoot的特性,能夠簡述SpringBoot的特性1.1.2
SpringBoot的特性6.無須生成配置代碼和XML配置文件。4.提供了大量的自動化配置類或第三方類庫。5.提供生產就緒功能。1.可快速構建獨立的Spring應用。3.提供固化的“starter”依賴,簡化構建配置。2.直接嵌入Tomcat、Jetty和Undertow等Web容器,無須部署WAR文件。SpringBoot的特性SpringBoot入門案例1.21.2.1
環(huán)境準備先定一個小目標!
先定一個小目標!掌握SpringBoot入門案例環(huán)境準備,能夠獨立搭建SpringBoot入門案例所需要準備的環(huán)境1.2.1
環(huán)境準備SpringBoot2.7.6依賴SpringFramework5.3.24,而運行SpringFramework5.3.24需要Java8及以上版本進行支撐,在此選擇當前使用較為廣泛并運行較為穩(wěn)定的JDK11。1.JDKSpringBoot2.7.6官方聲明支持的項目構建工具包括有Maven和Gradle,其中Maven的版本需要3.5及以上版本。在此采用Maven3.6.3對SpringBoot進行項目構建管理。2.項目構建工具業(yè)界較為常用有Eclipse和IntelliJIDEA,相比Eclipse而言,IntelliJIDEA的開發(fā)效率更高。在此選擇IntelliJIDEA的Ultimate2022.2.2進行項目開發(fā)。3.開發(fā)工具環(huán)境準備先定一個小目標!
先定一個小目標!掌握SpringBoot入門案例,能夠使用SpringInitializr方式構建SpringBoot項目1.2.2
使用SpringInitializr方式構建SpringBoot項目1.2.2
使用SpringInitializr方式構建SpringBoot項目SpringInitializr是一個可以初始化SpringBoot項目的工具,使用SpringInitializr初始化的SpringBoot項目包含了SpringBoot基本的項目結構,可以項目初始化之前對項目所需要的依賴進行選擇。使用SpringInitializr方式構建SpringBoot項目時,需要確保所在主機處于聯(lián)網狀態(tài)下,否則將構建失敗。下面講解如何在IDEA中使用SpringInitializr方式構建SpringBoot項目,并在項目中創(chuàng)建一個SpringMVC程序。1.2.2
使用SpringInitializr方式構建SpringBoot項目1.構建SpringBoot項目啟動IDEA,在IDEA歡迎界面依次選擇“Project”→“NewProject”創(chuàng)建項目,在彈出的對話框中選擇左側“SpringInitializr”選項。ServerURL:初始化SpringBoot項目時SpringInitializr工具所在的服務器地址。Name:所創(chuàng)建項目的名稱。Location:所創(chuàng)建項目在本地存放的路徑。Language:所創(chuàng)建項目使用的開發(fā)語言。Type:使用的項目構建工具。Group:項目的組名。Artifact:項目的名稱。Packagename:包名。JDK:項目使用的JDK。Packaging:項目打包的形式。1.2.2
使用SpringInitializr方式構建SpringBoot項目1.構建SpringBoot項目填寫好項目的相應信息,其中項目打包方式為Jar。單擊“Next”按鈕,進入SpringBoot場景依賴選擇界面。1.2.2
使用SpringInitializr方式構建SpringBoot項目1.構建SpringBoot項目項目中想要添加SpringMVC,可以勾選Web類別下的SpringWeb,創(chuàng)建項目時就會添加SpringWeb的依賴。1.2.2
使用SpringInitializr方式構建SpringBoot項目1.構建SpringBoot項目Chapter01Application.java:項目的啟動類,在該類中可以定義啟動項目的方法。static:靜態(tài)資源文件夾。templates:模板頁面文件夾。perties:全局配置文件。pom.xml:Maven進行工作的主要配置文件。1.2.2
使用SpringInitializr方式構建SpringBoot項目1.構建SpringBoot項目文件1-1Chapter01Application.java源代碼打開Chapter01Application.java,文件中的內容如文件1-1所示。1.2.2
使用SpringInitializr方式構建SpringBoot項目1.構建SpringBoot項目文件1-2pom.xml源代碼打開項目的pom.xml文件,內容如文件1-2所示。1.2.2
使用SpringInitializr方式構建SpringBoot項目2.編寫SpringMVC控制器文件1-3HelloController.java源代碼在項目com.itheima.chapter01包下創(chuàng)建名稱為controller的包,在該包下創(chuàng)建控制器類HelloController,并在該類中編寫處理請求的方法index(),具體如文件1-3所示。1.2.2
使用SpringInitializr方式構建SpringBoot項目3.運行項目運行文件Chapter01Application.java,啟動程序。1.2.2
使用SpringInitializr方式構建SpringBoot項目3.運行項目在瀏覽器上訪問http://localhost:8080/first。1.2.3
使用Maven方式構建SpringBoot項目先定一個小目標!
先定一個小目標!掌握SpringBoot入門案例,能夠使用Maven方式構建SpringBoot項目1.2.3
使用Maven方式構建SpringBoot項目使用SpringInitializr方式構建SpringBoot項目非常便捷,但是如果當前主機不能聯(lián)網的話,就無法自動下載項目所需的一些組件和依賴,導致這種方式無法正常使用。SpringBoot項目可以基于Maven構建,如果構建項目所需要使用的組件和依賴在本地Maven倉庫中已經存在,則無須聯(lián)網也可以構建SpringBoot項目。下面講解如何在IDEA中使用Maven方式構建SpringBoot項目,并在項目中創(chuàng)建一個SpringMVC程序。1.2.3
使用Maven方式構建SpringBoot項目1.構建Maven項目啟動IDEA,在IDEA歡迎界面依次選擇“Project”→“NewProject”創(chuàng)建項目,在彈出的對話框中選擇左側“MavenArchetype”選項。1.2.3
使用Maven方式構建SpringBoot項目1.構建Maven項目單擊“MavenArchetype”選項左側界面最上方的“NewProject”創(chuàng)建一個新的Mave項目。單擊后進入“NewProject”選項對應的界面。1.2.3
使用Maven方式構建SpringBoot項目1.構建Maven項目設置好創(chuàng)建項目的信息后,單擊“Create”按鈕即可創(chuàng)建Maven項目。Maven項目創(chuàng)建好之后,會默認打開項目的pom.xml文件。1.2.3
使用Maven方式構建SpringBoot項目2.添加項目依賴創(chuàng)建一般的Maven項目時,需要手動在pom.xml文件中插入對應的依賴信息。在此參照文件1-2插入項目繼承的工程依賴,以及SpringWeb和測試相關的依賴。<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.6</version><relativePath/></parent>項目繼承的父依賴1.2.3
使用Maven方式構建SpringBoot項目2.添加項目依賴<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>SpringWeb的依賴測試相關的依賴1.2.3
使用Maven方式構建SpringBoot項目在項目pom.xml文件中導入新依賴或修改其他內容后,通常會自動更新而無須手動管理。但有些情況下,依賴文件可能還是無法自動加載,這時候就需要重新手動加載依賴文件,具體操作方法為:右鍵單擊項目名,選擇“Maven”→“Reloadproject”重新加載項目即可。小提示1.2.3
使用Maven方式構建SpringBoot項目3.編寫程序啟動類在java文件夾下創(chuàng)建一個名稱為com.itheima.chapter01maven的包,在該包下參照文件1-1創(chuàng)建啟動類Chapter01MavenApplication,具體如文件1-4所示。文件1-4Chapter01MavenApplication.java源代碼1.2.3
使用Maven方式構建SpringBoot項目4.編寫SpringMVC控制器在項目com.itheima.chapter01maven包下創(chuàng)建名稱為controller的包,在該包下創(chuàng)建控制器類HelloController,該類中代碼與文件1-3一致即可。1.2.3
使用Maven方式構建SpringBoot項目5.運行項目運行文件Chapter01MavenApplication.java,啟動程序。1.2.3
使用Maven方式構建SpringBoot項目5.運行項目在瀏覽器中訪問http://localhost:8080/first。SpringBoot原理解析1.31.3
SpringBoot原理解析通過SpringBoot入門案例的實現(xiàn),相信能夠感受到,與使用Spring整合SpringMVC進行開發(fā)時需要設置煩瑣的依賴和配置信息相比,SpringBoot整合SpringMVC只需添加少量的依賴信息即可,開發(fā)過程也比較簡潔。SpringBoot項目中可以簡化依賴配置和常用工程的相關配置信息,這主要依靠它的起步依賴和自動配置。下面結合SpringBoot入門案例對SpringBoot的起步依賴、自動配置和執(zhí)行流程的原理進行分析和講解。1.3.1
起步依賴先定一個小目標!
先定一個小目標!熟悉SpringBoot起步依賴,能夠簡述SpringBoot起步依賴的原理1.3.1
起步依賴起步依賴本質上是一個Maven項目對象模型,該模型中定義了對其它庫的傳遞依賴,SpringBoot提供了眾多起步依賴來降低項目依賴的復雜度。在SpringBoot入門案例中,項目的pom.xml文件中主要引入了兩個起步依賴,分別是spring-boot-starter-parent和spring-boot-starter-web。1.3.1
起步依賴1.spring-boot-starter-parent依賴spring-boot-starter-parent中定義了很多常見技術的版本信息,組合成一套最優(yōu)搭配的技術版本??梢栽贗DEA中按住Ctrl單擊spring-boot-starter-paren進入對應的源碼文件中查看。2.spring-boot-starter-web依賴spring-boot-starter-web就是使用SpringMVC構建Web應用程序的啟動器。不僅包含SpringMVC的依賴信息和Spring整合SpringMVCWeb開發(fā)的依賴信息,還包含了其他的一些依賴信息。1.3.1
起步依賴SpringBoot官方提供了大量的啟動器,其名稱基本都是通過“spring-boot-starter-技術名稱”這樣的格式命名,通過啟動器的名稱通??梢灾浪峁┑墓δ堋@?,spring-boot-starter-web表示提供Web相關的功能,spring-boot-starter-jdbc表示提供JDBC相關的功能。名稱描述spring-boot-starter-parent核心啟動器,包括自動配置支持、日志記錄和YAML,常被作為父依賴spring-boot-starter-logging提供Logging相關的日志功能spring-boot-starter-thymeleaf使用Thymeleaf視圖構造MVCWeb應用程序的啟動器spring-boot-starter-web使用Spring
MVC構建Web,包括RESTful應用程序,使用Tomcat作為默認的嵌入式容器的啟動器spring-boot-starter-test支持常規(guī)的測試依賴,包括Junit、Hamcrest、Mockito和spring-test模塊spring-boot-starter-jdbc結合JDBC和HikariCP連接池的啟動器,對數(shù)據(jù)源自動裝配,并提供JdbcTemplate簡化數(shù)據(jù)庫操作常見的SpringBoot應用程序啟動器1.3.1
起步依賴名稱描述spring-boot-starter-data-jpa使用SpringJPA與Hibernate的啟動器spring-boot-starter-data-redisRediskey-value數(shù)據(jù)存儲和SpringDataRedis與Jedis客戶端的啟動器spring-boot-starter-log4j2提供Log4j2相關的日志功能spring-boot-starter-mail提供郵件相關功能spring-boot-starter-activemq使用ApacheActiveMQ的JMS啟動器spring-boot-starter-data-mongodb使用MongoDB面向文檔的數(shù)據(jù)庫和SpringDataMongoDB的啟動器spring-boot-starter-actuator提供應用監(jiān)控與監(jiān)控相關的功能spring-boot-starter-security使用Spring
Security的啟動器spring-boot-starter-dubbo提供Dubbo框架的相關功能常見的SpringBoot應用程序啟動器1.3.1
起步依賴SpringBoot官方并沒有為所有場景開發(fā)的技術框架都提供了啟動器,例如,數(shù)據(jù)庫操作框架MyBatis、阿里巴巴的Druid數(shù)據(jù)源等。為了充分利用SpringBoot框架的優(yōu)勢,一些第三方技術廠商主動與SpringBoot框架進行了整合,實現(xiàn)了各自的依賴啟動器,例如,MyBatis提供的啟動器mybatis-spring-boot-starter。不過在項目pom.xml文件中引入這些第三方的啟動器時,需要自行配置對應的依賴版本號。1.3.1
起步依賴spring-boot-starter-parent和普通的starter都使SpringBoot項目簡化了配置,但是他們兩個的功能卻不相同。spring-boot-starter-parent:定義了很多個常見組件或框架的依賴版本號,組合成一套最優(yōu)搭配的技術版本,更便于統(tǒng)一管理依賴的版本,且減少了依賴的沖突。普通的starter:在坐標中定了若干個坐標,減少依賴配置的代碼量。1.3.2自動配置先定一個小目標!
先定一個小目標!熟悉SpringBoot自動配置,能夠簡述SpringBoot自動配置的原理1.3.2自動配置SpringBoot采用約定大于配置的設計思想,將SpringBoot開發(fā)過程中可能會遇到的配置信息提前配置好,寫在自動配置的JAR包中。項目啟動時會自動檢測項目類路徑下所有的依賴JAR包,將檢測到的Bean注冊到Spring容器中,并根據(jù)檢測的依賴進行自動配置。1.3.2
自動配置@SpringBootConfiguration標注當前類是一個配置類,它是一個復合注解。1.@SpringBootConfiguration@EnableAutoConfiguration可以開啟自動配置,它也是一個復合注解。2.@EnableAutoConfiguration@ComponentScan注解是一個組件包掃描器,其主要作用是掃描指定包及其子包下所有注解類文件作為Spring容器的組件使用。3.@ComponentScan@SpringBootApplication注解1.3.2
自動配置1.
@SpringBootConfiguration查看@SpringBootConfiguration的源碼@SpringBootConfiguration是@Configuration的派生注解,擁有@Configuration注解的功能。@Configuration是@Component的派生注解,所以被@SpringBootApplication標注的類可以被掃描到Spring的IoC容器中。1.3.2
自動配置2.@EnableAutoConfiguration@EnableAutoConfiguration主要通過代碼中的@AutoConfigurationPackage和@Import({AutoConfigurationImportSelector.class})實現(xiàn)自動配置。@AutoConfigurationPackage:主要作用是獲取項目啟動類所在根目錄,從而指定組件掃描器掃描的包位置。@Import({AutoConfigurationImportSelector.class}:導入AutoConfigurationImportSelector類,該類中提供了一個獲取自動配置的方法getAutoConfigurationEntry(),用于篩選出當前項目環(huán)境需要啟動的自動配置類,從而實現(xiàn)當前項目運行所需的自動配置環(huán)境。查看@EnableAutoConfiguration的源碼1.3.2
自動配置@Import導入了AutoConfigurationPackages.Registrar類,Registrar類屬于AutoConfigurationPackages類中的靜態(tài)內部類,該類中提供了批量注冊組件到Spring容器的方法。查看@AutoConfigurationPackage的源碼2.@EnableAutoConfiguration1.3.2
自動配置(1)從SpringBoot自動配置JAR包的META-INF/spring.factories和META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中獲取所有候選自動配置類。(2)根據(jù)項目pom.xml文件中加入的依賴篩選出最終符合當前項目運行環(huán)境對應的自動配置類。查看@Import({AutoConfigurationImportSelector.class})的源碼2.@EnableAutoConfiguration1.3.2
自動配置3.
@ComponentScan@ComponentScan注解具體掃描的包的根路徑由SpringBoot項目主程序啟動類所在包位置決定,在掃描過程中由前面介紹的@AutoConfigurationPackage注解進行解析,從而得到SpringBoot項目主程序啟動類所在包的具體位置。@ComponentScan(excludeFilters={@Filter(type=FilterType.CUSTOM,classes={TypeExcludeFilter.class}),@Filter(type=FilterType.CUSTOM,classes={AutoConfigurationExcludeFilter.class})})指定掃描時過濾掉不加載到Spring容器的類。在BeanFactory中查找所有類型為TypeExcludeFilter的組件,并去執(zhí)行其自定義的過濾方法。用于過濾其他同時使用@Configuration和@EnableAutoConfigure的類。1.3.3
執(zhí)行流程先定一個小目標!
先定一個小目標!熟悉SpringBoot執(zhí)行流程,能夠基于SpringBoot入門案例簡述SpringBoot的執(zhí)行流程1.3.3
執(zhí)行流程SpringBoot入門案例啟動類的main()方法只有一行代碼,使用SpringApplication類調用run()方法,執(zhí)行該行代碼時,就啟動了整個SpringBoot項目。為了進一步了解SpringBoot的啟動原理,下面基于SpringBoot入門案例講解SpringBoot的執(zhí)行流程。1.3.3
執(zhí)行流程查看SpringApplication調用的run()方法的源碼SpringApplication的run()方法中調用了另一個重載的run()方法,被調用的重載run()方法內部執(zhí)行了兩個操作,分別是創(chuàng)建SpringApplication實例和調用run()方法。1.3.3
執(zhí)行流程創(chuàng)建SpringApplication實例主要執(zhí)行了如下操作。(1)初始化資源加載器,此處將資源加載器置空。(2)初始化加載資源類集合。(3)推斷當前Web應用類型。(4)設置應用上下文初始化器。(5)設置監(jiān)聽器。(6)推斷主應用類。1.創(chuàng)建SpringApplication實例1.3.3
執(zhí)行流程run()方法的核心代碼執(zhí)行內容。(1)創(chuàng)建啟動上下文對象。(2)獲取并啟動運行監(jiān)聽器。(3)將應用程序參數(shù)封裝為ApplicationArguments類型對象。(4)配置環(huán)境信息ConfigurableEnvironment的基礎的配置信息。(5)配置需要忽略的Bean信息。(6)創(chuàng)建應用程序上下文對象,并設置上下文對象的應用程序啟動器。(7)對應用上下文環(huán)境進行準備。(8)刷新應用程序上下文,初始化IoC容器里面的Bean。(9)調用了監(jiān)聽器的started()方法,通知監(jiān)聽器上下文啟動完成。2.調用run()方法查看run()方法執(zhí)行的過程單元測試與熱部署1.41.4.1
單元測試先定一個小目標!
先定一個小目標!了解單元測試,能夠在SpringBoot項目中進行Web環(huán)境模擬測試和業(yè)務組件測試1.4.1
單元測試單元測試是針對一個獨立的工作單元進行正確性驗證的測試,對程序開發(fā)來說非常重要,通過單元測試不僅能增強程序的健壯性,而且為程序的重構提供了依據(jù)。SpringBoot為項目的單元測試提供了很好的支持。在項目中添加測試依賴啟動器后,可以編寫相關測試代碼對SpringBoot項目中相關功能進行單元測試。根據(jù)測試時候是否需要啟動Web服務器,可以將單元測試分為Web環(huán)境模擬測試和業(yè)務組件測試。1.4.1
單元測試SpringBoot提供了@SpringBootTest用于修飾單元測試用例類。通過@SpringBootTest注解的webEnvironment屬性可以設置在測試用例中啟動Web環(huán)境。webEnvironment屬性可以設置的值有以下4個。MOCK:為webEnvironment屬性的默認值,會加載一個WebApplicationContext并提供一個模擬servlet環(huán)境,屬于適配性的配置,根據(jù)當前的設置確認是否啟動Web環(huán)境,例如,使用了Servlet的API就會啟動Web環(huán)境。DEFINED_PORT:加載一個EmbeddedWebApplicationContext并提供一個真正的servlet環(huán)境,使用自定義的端口作為Web服務器端口。RANDOM_PORT:加載一個EmbeddedWebApplicationContext并提供一個真正的servlet環(huán)境,使用隨機端口作為Web服務器端口。NONE:使用SpringApplication加載ApplicationContext,但不啟動Web環(huán)境。1.Web環(huán)境模擬測試1.4.1
單元測試在項目chapter01測試文件夾下的com.itheima.chapter01包下編寫測試用例類WebTest,在該類中啟動Web環(huán)境,并使用隨機端口作為Web服務器端口。在測試用例類上使用@AutoConfigureMockMvc注解對Web虛擬調用功能開啟,具體如文件1-5所示。文件1-5WebTest.java源代碼1.Web環(huán)境模擬測試1.4.1
單元測試選中單元測試方法testWeb(),鼠標右鍵單擊“Run‘testWeb()’”選項啟動測試方法。1.Web環(huán)境模擬測試1.4.1
單元測試當只需測試Service層或DAO層等業(yè)務組件時,則不需要啟動Web服務器,測試方法直接調用被測試組件的方法。在項目chapter01的com.itheima.chapter01包下創(chuàng)建名稱為service的包,在該包下創(chuàng)建類HelloService,具體如文件1-6所示。文件1-6HelloService.java源代碼2.業(yè)務組件測試1.4.1
單元測試定義測試用例類。在項目chapter01測試文件夾下的com.itheima.chapter01包下編寫測試用例類ServiceTest,在該類中不啟動Web環(huán)境,具體如文件1-7所示。文件1-7ServiceTest.java源代碼2.業(yè)務組件測試1.4.1
單元測試選中單元測試方法testService(),右鍵單擊“Run‘testService()’”選項啟動測試方法。2.業(yè)務組件測試1.4.2熱部署先定一個小目標!
先定一個小目標!了解熱部署,能夠在IDEA中實現(xiàn)SpringBoot項目的熱部署1.4.2熱部署在開發(fā)過程中,可能會不斷地修改業(yè)務代碼,每次修改之后想要測試最新的效果往往需要重啟服務,這種重復的啟動操作極大地降低了程序開發(fā)效率。熱部署指的是不用重啟服務,服務器會自己悄悄地把更新后的程序重新加載一遍。為了提高開發(fā)效率。SpringBoot框架提供了進行熱部署的依賴,用于進行項目熱部署。下面在chapter01項目基礎上講解如何進行熱部署。1.4.2熱部署1.添加熱部署依賴<!--熱部署依賴--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency>在SpringBoot項目進行熱部署測試之前,需要先在項目的pom.xml文件中添加熱部署依賴。1.4.2熱部署2.設置啟動熱部署在IDEA的菜單欄中依次選擇“File”→“Settings”,進入IDEA的設置對話框,然后選擇“Build,Execution,Deployment”的“Compiler”選項。在右側勾選“Buildprojectautomatically”選項將項目設置為自動編譯,然后單擊“Apply”→“OK”按鈕保存設置。1.4.2熱部署2.設置啟動熱部署IDEA的設置對話框中,選中“AdvancedSettings”選項。在右側勾選“Compiler”下的“Allowauto-maketostartevenifdevelopedapplicationiscurrentlyrunning”選項,允許自動啟動當前正在運行的應用程序,然后單擊“Apply”→“OK”按鈕保存設置。1.4.2熱部署啟動chapter01項目,在瀏覽器中訪問“http://localhost:8080/first”。3.熱部署效果測試1.4.2熱部署啟動chapter01項目,在瀏覽器訪問“http://localhost:8080/first”。為了測試配置的熱部署是否有效,接下來,在不關閉當前項目的情況下,將HelloController類中index()方法的返回值修改為“WelcometoSpringBootApplication!developed”。5秒后刷新瀏覽器頁面。3.熱部署效果測試SpringBoot項目打包和運行1.51.5
SpringBoot項目打包和運行在實際開發(fā)中,通常項目完成后不會將源代碼公布給所有人,而是將項目和其依賴的組件組織成一個可執(zhí)行文件分發(fā)到目標系統(tǒng)上運行或者交付給其他人使用,這個組織的過程也稱為打包。項目打包后在其他環(huán)境可以很方便的運行,SpringBoot項目打包時通常會被創(chuàng)建為可執(zhí)行的JAR包或WAR包,這兩種包內部的文件結構不同,其運行的方式也不相同。下面,分別對這兩種方式的打包和運行進行講解。1.5.1
打包為JAR包并運行先定一個小目標!
先定一個小目標!熟悉將SpringBoot項目打包為JAR包并運行,能夠獨立將SpringBoot項目打包為可執(zhí)行的JAR包并運行1.5.1
打包為JAR包并運行SpringBoot應用內嵌了Web服務器,所以基于SpringBoot開發(fā)的Web應用也可以獨立運行,無須部署到其他Web服務器中。下面,以打包chapter01項目為例,將SpringBoot項目打包為可執(zhí)行的JAR包并運行。1.5.1
打包為JAR包并運行1.打包為可執(zhí)行的JAR包(1)添加Maven打包插件。SpringBoot程序是基于Maven創(chuàng)建的,在對SpringBoot項目進行打包前,需要在項目pom.xml文件中加入Maven打包插件。<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>1.5.1
打包為JAR包并運行1.打包為可執(zhí)行的JAR包(2)使用IDEA進行打包。clean命令:可以清除所有在構建過程中生成的文件。test命令:可以使用合適的單元測試框架來測試編譯的源代碼。package命令:可以完成項目編譯、單元測試、打包功能。打包時候跳過測試階段1.5.1
打包為JAR包并運行如果打包成功會在項目的target文件夾下創(chuàng)建項目對應的可執(zhí)行JAR包。1.打包為可執(zhí)行的JAR包1.5.1
打包為JAR包并運行一個可執(zhí)行的JAR包可以由JVM
直接執(zhí)行而無須事先提取文件或者設置類路徑。對此可以直接使用Java命令運行可執(zhí)行的JAR包。2.運行JAR包java–jarJAR包名稱運行JAR包的命令的語法格式1.5.1
打包為JAR包并運行運行JAR包時可以選擇在IDEA中或者在CMD窗口中執(zhí)行,這兩種方式沒有什么區(qū)別,這里選擇在CMD窗口中執(zhí)行。在本地打開項目的target文件夾。2.運行JAR包1.5.1
打包為JAR包并運行項目的target文件夾的地址欄中輸出“CMD”后按下“Enter”鍵,在當前文件夾路徑下打開CMD窗口,并在彈出的CMD窗口中使用Java命令運行chapter01-0.0.1-SNAPSHOT.jar。2.運行JAR包1.5.1
打包為JAR包并運行JAR包運行后,可以對項目進行訪問,以測試打包后的效果,在瀏覽器中訪問http://localhost:8080/first。2.運行JAR包1.5.2打包為WAR包并運行先定一個小目標!
先定一個小目標!了解將SpringBoot項目打包為WAR包并運行,能夠將SpringBoot項目打包為WAR包并部署到Web容器中運行1.5.2打包為WAR包并運行雖然通過SpringBoot內嵌的Tomcat可以將項目打成JAR包后直接運行,但每個JAR包中都會包含獨立的Web容器,對服務器的使用消耗會比較大。當想要在一個Web容器中運行多個項目時,可以把每個項目打包成一個WAR包,然后部署到Web容器中運行。下面,以打包chapter01-maven項目為例,將SpringBoot項目打包為WAR包并運行。1.5.2打包為WAR包并運行1.打包為可執(zhí)行的WAR包(1)聲明打包方式為war。默認情況下創(chuàng)建的SpringBoot項目打包方式為jar,要將項目打包為WAR包,需要在項目的pom.xml文件中聲明當前項目的打包方式為war。打開chapter01-maven項目的pom.xml文件,使用<packaging>標簽聲明項目打包方式為war。<groupId>com.itheima</groupId><artifactId>chapter01-maven</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging>1.5.2打包為WAR包并運行1.打包為可執(zhí)行的WAR包(2)排除內置Tomcat。SpringBoot為項目提供了內嵌的Tomcat服務器,使用外部的Tomcat時,需要在pom.xml文件中排除內置的Tomcat。<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions>
<exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion></exclusions></dependency>1.5.2打包為WAR包并運行1.打包為可執(zhí)行的WAR包(3)添加Tomcat依賴。排除內置的Tomcat后,需要在pom.xml文件中手動添加Tomcat的依賴,以便在后續(xù)開發(fā)中使用對應的API。<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><!--僅在編譯和測試階段使用,不會被打包--><scope>provided</scope></dependency>1.5.2打包為WAR包并運行1.打包為可執(zhí)行的WAR包(4)添加插件。在項目的pom.xml文件中定義打包插件,以及項目打包后包的名稱。<build><finalName>springboot-war</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>1.5.2打包為WAR包并運行1.打包為可執(zhí)行的WAR包(5)修改SpringBoot啟動類。SpringBoot啟動項目的方式有很多種,使用外置Tomcat時,默認啟動類需要繼承SpringBootServletInitializer類,并重寫configure()方法。修改后的SpringBoot啟動類如文件1-8所示。文件1-8Chapter01MavenApplication.java源代碼1.5.2打包為WAR包并運行1.打包為可執(zhí)行的WAR包使用IDEA的Maven工具欄中的命令打包項目,將chapter01-maven項目進行打包。1.5.2打包為WAR包并運行2.運行WAR包將打包好的WAR包拷貝到本地Tomcat安裝目錄下的webapps文件夾下,在CMD窗口中執(zhí)行Tomcat安裝目錄下bin目錄中的startup.bat命令啟動Tomcat。1.5.2打包為WAR包并運行2.運行WAR包在瀏覽器中訪問http://localhost:8080/springboot-web/first。多學一招Tomcat啟動失敗和控制臺亂碼1.Tomcat啟動失敗在CMD窗口執(zhí)行startup.bat命令啟動Tomcat時,可能不能正常啟動Tomcat,并出現(xiàn)響應的提示信息。JRE_HOME環(huán)境變量沒有正確定義。對此,可以在計算機的環(huán)境變量中新增一個名稱為JRE_HOME的環(huán)境變量,變量值設置為JDK的安裝路徑即可。多學一招Tomcat啟動失敗和控制臺亂碼2.Tomcat控制臺輸出亂碼控制臺輸出亂碼通常是編碼不一致導致的。打開Tomcat安裝目錄conf文件夾下的perties文件,將文件中“java.util.logging.ConsoleHandler.encoding”的值修改為GBK即可。本章小結本章主要對SpringBoot開發(fā)入門知識進行了講解。首先講解了SpringBoot概述;然后講解了Spring
Boot入門案例,并結合入門案例對SpringBoot的原理進行了解析;接著講解了單元測試和熱部署;最后講解了SpringBoot項目的打包和運行。通過本章的學習,希望大家可以對SpringBoot有一個初步認識,為后續(xù)學習SpringBoot做好鋪墊。本章小結第2章SpringBoot配置《SpringBoot企業(yè)級開發(fā)教程(第2版)》學習目標/Target掌握perties配置文件,能夠在perties配置文件中正確配置數(shù)據(jù)掌握application.yml配置文件,能夠在application.yml配置文件中正確配置數(shù)據(jù)掌握@Value注解,能夠使用@Value注解為Bean的屬性綁定配置數(shù)據(jù)熟悉Environment對象,能夠使用Environment對象獲取全局配置文件中的屬性學習目標/Target掌握@ConfigurationProperties注解,能夠使用@ConfigurationProperties注解為Bean的屬性綁定配置數(shù)據(jù)了解@Value和@ConfigurationProperties對比分析,能夠說出@Value和@ConfigurationProperties的主要區(qū)別掌握引入配置文件,能夠使用@PropertySource注解和@ImportResource注解引入配置文件掌握定義配置類,能夠使用@Configuration注解定義配置類學習目標/Target掌握多文件中配置Profile,能夠在多文件中配置Profile以實現(xiàn)多環(huán)境配置熟悉@Profile注解,能夠正確使用@Profile注解進行多環(huán)境配置熟悉單一文件中配置Profile,能夠在單一文件中配置Profile以實現(xiàn)多環(huán)境配置章節(jié)概述/SummarySpringBoot極大地簡化了Spring應用的開發(fā),尤其是SpringBoot的自動配置功能,該功能使項目即使不進行任何配置,也能順利運行。當用戶想要根據(jù)自身需求覆蓋SpringBoot的默認配置時,需要使用配置文件修改SpringBoot的默認配置。本章將對SpringBoot的配置進行講解。目錄/Contents2.12.2全局配置文件配置綁定2.3引入配置文件和定義配置類2.4Profile全局配置文件2.12.1
全局配置文件全局配置文件能夠對一些默認配置值進行修改。SpringBoot默認使用的全局配置文件有perties和application.yml,SpringBoot啟動時會自動讀取這兩個文件中的配置,如果文件中存在與默認自動配置相同的配置信息,則覆蓋默認的配置信息。下面對全局配置文件進行講解。2.1.1
perties配置文件先定一個小目標!
先定一個小目標!掌握perties配置文件,能夠在perties配置文件中正確配置數(shù)據(jù)2.1.1
perties配置文件perties文件中可以定義SpringBoot項目的相關屬性,屬性可采用鍵值對格式進行設置,表示形式為“Key=Value”,這些相關屬性可以是系統(tǒng)屬性、環(huán)境變量、命令參數(shù)等信息,也可以是自定義的屬性。address=beijingserver.port=80spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverperties文件中的屬性支持多種類型,常見的有字面量、數(shù)組和集合。2.1.1
perties配置文件1.字面量類型屬性字面量是指單個的不可拆分的值,例如:數(shù)字、字符串、布爾值等。在perties文件中配置字面量的屬性時,直接將字面量作為Value寫在鍵值對中即可,且默認情況下字符串是不需要使用單引號或雙引號進行修飾的。address=beijingage=132.1.1
perties配置文件1.字面量類型屬性如果需要配置的屬性為對象的屬性,可以通過“對象名.屬性名”的方式指定屬性的鍵。對象中可能包含多個屬性,在perties文件中為對象的屬性賦值時,一個屬性對應一對鍵值對。user.username=lisiuser.age=182.1.1
perties配置文件2.數(shù)組類型屬性在perties文件中配置數(shù)組類型屬性時,可以將數(shù)組元素的值寫在一行內,元素值之間使用逗號(,)間隔,也可以在多行分別根據(jù)索引賦值。#方式一user.hobby=swim,travel,cook#方式二user.hobby[0]=swim2user.hobby[1]=travel2user.hobby[2]=cook22.1.1
perties配置文件3.集合類型屬性在perties文件中也可以配置集合類型的屬性,下面分別演示配置List、Set、Map的集合類型屬性。#配置List:方式一user.subject=Chinese,English,Math#配置List:方式二user.subject[0]=Chineseuser.subject[1]=Englishuser.subject[2]=Math2.1.1
perties配置文件3.集合類型屬性#配置Setuser.salary=120,230#配置Map方式一user.order.1001=cookieuser.order.1002=cake#配置Map方式二user.order[1001]=cookieuser.order[1002]=cake2.1.2
application.yml配置文件先定一個小目標!
先定一個小目標!掌握application.yml配置文件,能夠在application.yml配置文件中正確配置數(shù)據(jù)2.1.2
application.yml配置文件application.yml配置文件是使用YAML編寫的文件,YAML是”YAMLAin'tMarkupLanguage“的遞歸縮寫。YAML通常用于表示數(shù)據(jù)結構和配置信息,它使用縮進和外觀依賴的方式表示層級關系,使得配置文件和數(shù)據(jù)結構的表達相對簡潔和易于閱讀。YAML支持的數(shù)據(jù)包括列表、鍵值對和字符串、數(shù)字等。YAML文件的后綴名為.yml或.yaml,編寫時需要遵循如下規(guī)則。使用縮進表示層級關系。
縮進時不允許使用Tab鍵,只允許使用空格。縮進的空格數(shù)不重要,但同級元素必須左側對齊。
大小寫敏感。2.1.2
application.yml配置文件1.字面量類型屬性字面量是指單個的,不可拆分的值,例如:數(shù)字、字符串、布爾值等。在perties文YAML中,使用“Key:Value”的形式表示一對鍵值對,其中Value前面有一個空格,并且該空格不能省略。在配置字面量類型的屬性時,直接將字面量作為Value直接寫在鍵值對中即可,且默認情況下字符串是不需要使用單引號或雙引號的。address:beijingage:132.1.2
application.yml配置文件1.字面量類型屬性如果需要配置的屬性為對象的屬性,配置的方式有縮進式和行內式兩種。#縮進式consumer:username:lisiage:18#行內式consumer:{username:lisi,age:18}2.1.2
application.yml配置文件2.數(shù)組類型和單列集合屬性當YAML配置文件中配置的屬性為數(shù)組類型或單列集合時,也可以使用縮進式寫法和行內式寫法。consumer:hobby:-play-read-sleepconsumer:hobby:[play,read,sleep]or縮進式行內式2.1.2
application.yml配置文件3.Map集合屬性當YAML配置文件中配置的屬性為Map集合時,可以使用縮進式寫法和行內式寫法。consumer:order:1001:cookie1002:cakeconsumer:order:{1001:cookie,1002:cake}or縮進式行內式多學一招默認配置文件SpringBoot項目將perties或application.yml作為項目的默認配置文件。SpringBoot項目中可以存在多個perties或application.yml,SpringBoot啟動時會掃描以下5個位置的perties和application.yml文件,并將掃描到的文件作為SpringBoot的默認配置文件。
file:./config/*/
file:./config/file:./classpath:/config/
classpath:/多學一招默認配置文件SpringBoot項目將perties或application.yml作為項目的默認配置文件。Spring上述5個位置下如果存在perties和application.yml文件,在項目啟動就都會被加載。加載多個perties或application.yml文件時,文件中的配置會根據(jù)文件所處的位置劃分優(yōu)先級,優(yōu)先級規(guī)則如下。上述位置1~位置5的優(yōu)先級依次降低,序號越小優(yōu)先級越高。位于相同位置的perties的優(yōu)先級高于application.yml,application.yml的優(yōu)先級高于application.yaml。存在相同的配置內容時,高優(yōu)先級的內容會覆蓋低優(yōu)先級的內容。存在不同的配置內容時,高優(yōu)先級和低優(yōu)先級的配置內容取并集。配置綁定2.22.2配置綁定使用SpringBoot全局配置文件配置屬性時,如果配置的屬性是SpringBoot內置的屬性(如服務端口server.port),那么SpringBoot會自動掃描并讀取配置文件中的屬性值并覆蓋原有默認的屬性值。如果配置的屬性是用戶自定義的屬性,可以通過Java代碼去讀取該配置屬性,并且把屬性綁定到Bean。在SpringBoot項目中可以通過@Value、Environment對象和@ConfigurationProperties對配置屬性進行綁定,下面分別對這三種方式實現(xiàn)配置綁定進行講解。2.2.1
@Value注解先定一個小目標!
先定一個小目標!掌握@Value注解,能夠使用@Value注解為Bean的屬性綁定配置數(shù)據(jù)2.2.1
@Value注解@Value注解是由Spring框架提供的,SpringBoot框架從Spring框架中對@Value注解進行了默認繼承,通過@Value可以將配置文件中的屬性綁定到Bean對象對應的屬性。@ComponentpublicclassPerson{@Value("${person.id}")privateintid;}將配置文件中屬性person.id的值動態(tài)注入到id屬性2.2.1
@Value注解下面通過案例演示在SpringBoot項目中使用@Value綁定全局配置文件中的屬性。文件2-1Consumer.java源代碼(1)創(chuàng)建實體類。在IDEA中創(chuàng)建一個SpringBoot項目,在項目的java文件夾下創(chuàng)建類包com.itheima.domain,并在該類包下創(chuàng)建一個消費者實體類Consumer,在該類上使用@Component進行標注,并在屬性上使用@Value注解注入配置文件中的屬性,具體如文件2-1所示。2.2.1
@Value注解文件2-2application.yml源代碼(2)添加配置信息。在項目的resource文件夾下創(chuàng)建配置文件application.yml,在配置文件中添加屬性信息,具體如文件2-2所示。2.2.1
@Value注解文件2-3Chapter02ApplicationTests.java源代碼(3)創(chuàng)建測試類。在項目test文件夾下,創(chuàng)建類包com.itheima的類包,在該包下創(chuàng)建測試類Chapter02ApplicationTests,在該測試類中注入Consumer對象,并新增一個測試方法進行輸出測試,具體代碼如文件2-3所示。2.2.1
@Value注解(4)測試程序效果。運行測試方法wiredTest()。2.2.2Environment對象先定一個小目標!
先定一個小目標!熟悉Environment對象,能夠使用Environment對象獲取全局配置文件中的屬性2.2.2Environment對象使用@Value注解時,將該注解標注在Spring管控的Bean的屬性名上方,就可以將某個數(shù)據(jù)綁定到Bean對象的屬性。當Bean的屬性比較多且這些屬性都需要綁定配置的數(shù)據(jù)時,操作起來就比較煩瑣。為此,SpringBoot提供了一個對象Environment,項目啟動時能夠將配置文件中的所有數(shù)據(jù)都封裝到該對象中,這樣就不需要手動對配置數(shù)據(jù)進行綁定。2.2.2Environment對象使用Environment對象獲取配置文件的數(shù)據(jù)時,不需要在提供其他實體類。在文件2-3的Chapter02ApplicationTests類中,通過@Autowired注入Environment對象,并新增測試方法evnTest(),在測試方式中通過Environment對象獲取配置文件中的屬性。@AutowiredprivateEnvironmentenv;@TestvoidevnTest(){System.out.println("consumer.username="+env.getProperty("consumer.username"));System.out.println("consumer.age="+env.getProperty("consumer.age"));System.out.println("consumer.hobby="+env.getProperty("consumer.hobby"));System.out.println("consumer.subject="+env.getProperty("consumer.subject"));}getProperty()方法獲取封裝到Environment對象中封裝的配置文件的數(shù)據(jù)2.2.2Environment對象運行測試方法evnTest(),輸出封裝到Environment對象中的配置文件的數(shù)據(jù)。2.2.3@ConfigurationProperties注解先定一個小目標!
先定一個小目標!掌握@ConfigurationProperties注解,能夠使用@ConfigurationProperties注解為Bean的屬性綁定配置數(shù)據(jù)2.2.3@ConfigurationProperties注解Java是面向對象的語言,很多情況下,人們習慣將具有相同特性的一組數(shù)據(jù)封裝到一個對象中,SpringBoot中就提供了這樣的注解。SpringBoot的@ConfigurationProperties注解可以
可以將配置文件中的一組配置數(shù)據(jù)同時綁定到Bean中。下面通過案例演示在SpringBoot項目中使用@ConfigurationProperties注解綁定全局配置文件中的數(shù)據(jù)。2.2.3@ConfigurationProperties注解(1)修改實體類屬性的綁定方式。在文件2-1的Consumer類上使用@ConfigurationProperties注解進行標注,并且去除屬性上方標注的@Value注解。@Component@ConfigurationProperties(prefix="consumer")publ
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中考英語模刷題擬試卷(含答案)
- 電力電纜敷設施工方案
- 別墅裝修保潔合同范例
- 代理酒類合同范本
- 個人租房合同范例乙方版本
- 物流行業(yè)安全運輸監(jiān)管方案計劃
- 師生互動提升計劃
- 親子溝通與情感交流計劃
- 中學教育教學創(chuàng)新計劃
- 《貴州新仁新能源科技有限公司貴州省六枝特區(qū)大壩螢石礦(新建)礦產資源綠色開發(fā)利用方案(三合一)》評審意見
- 2025年高考百日誓師大會校長致辭(二)
- 2025年高考數(shù)學復習核心考點(新高考專用)專題5.3平面向量的數(shù)量積及其應用【八大題型】特訓(學生版+解析)
- 2025年中國萬寶工程有限公司校園招聘筆試參考題庫附帶答案詳解
- 2025年常州機電職業(yè)技術學院單招職業(yè)適應性測試題庫有完整答案
- 2025年河南機電職業(yè)學院單招職業(yè)技能測試題庫及參考答案
- 第11課《山地回憶》課件-2024-2025學年統(tǒng)編版語文七年級下冊
- 成本經理試用期轉正工作匯報
- 2023年廣西本科對口中職考試中職英語試題
- 閃耀離子束瘢痕治療飛頓醫(yī)療激光公司客戶支持部講解
- 《莖和葉》說課稿-2023-2024學年科學四年級下冊教科版
- 2024年皖西衛(wèi)生職業(yè)學院單招職業(yè)適應性測試題庫及答案解析
評論
0/150
提交評論