《Java EE框架(SSM + Spring Boot + Vue.js 3)整合開發》 課件 第6章 Spring Boot核心_第1頁
《Java EE框架(SSM + Spring Boot + Vue.js 3)整合開發》 課件 第6章 Spring Boot核心_第2頁
《Java EE框架(SSM + Spring Boot + Vue.js 3)整合開發》 課件 第6章 Spring Boot核心_第3頁
《Java EE框架(SSM + Spring Boot + Vue.js 3)整合開發》 課件 第6章 Spring Boot核心_第4頁
《Java EE框架(SSM + Spring Boot + Vue.js 3)整合開發》 課件 第6章 Spring Boot核心_第5頁
已閱讀5頁,還剩61頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

J

a

v

a

E

E框架整合開發創新·協作·分享T

I

P

C

C教案第六章Spring

Boot核心T

I

P

C

C教案本章目標理解Spring

Boot的自動配置原理了解Spring

Boot的條件注解掌握Spring

Boot的核心注解掌握Spring

Boot的基本配置T

I

P

C

C教案本章內容Spring

Boot的基本配置讀取應用配置日志配置Spring

Boot的自動配置原理Spring

Boot的條件注解T

I

P

C

C教案6.1

Spring

Boot的基本配置6.1.1啟動類和核心注解@SpringBootApplication6.1.2關閉某個特定的自動配置6.1.3定制Banner6.1.4關閉banner6.1.5

Spring

Boot的全局配置文件6.1.6

Spring

Boot的StartersT

I

P

C

C教案6.1.1啟動類和核心注解@SpringBootApplicationSpring

Boot應用通常都有一個名為*Application的程序入口類,該入口類需要使用Spring

Boot的核心注解

@SpringBootApplication標注為應用的啟動類。Spring

Boot的核心注解@SpringBootApplication是一個組合注解,主要組合了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan注解。源代碼可以從spring-boot-autoconfigure-2.4.1.jar依賴包中查看

org/springframework/boot/autoconfigure/SpringBootApplication.java。T

I

P

C

C教案1.@SpringBootConfiguration注解@SpringBootConfiguration是Spring

Boot應用的配置注解,該注解也是一個組合注解,源代碼可以從spring-boot-2.4.1.jar依賴包中查看

org/springframework/boot/SpringBootConfiguration.java。

在Spring

Boot應用中推薦使用@SpringBootConfiguration注解替代@Configuration注解。T

I

P

C

C教案2.@EnableAutoConfiguration注解@EnableAutoConfiguration注解可以讓Spring

Boot根據當前應用項目所依賴的jar自動配置項目的相關配置。例如,在Spring

Boot項目的pom.xml文件中添加了spring-boot-starter-web依賴,Spring

Boot項目會自動添加Tomcat和Spring

MVC的依賴,同時對Tomcat和Spring

MVC進行自動配置。T

I

P

C

C教案3.@ComponentScan注解該注解的功能是讓Spring

Boot自動掃描

@SpringBootApplication所在類的同級包以及它的子包中的配置,所以建議將@SpringBootApplication注解的入口類放置在項目包下(Group

Id+Artifact

Id組合的包名),這樣可以保證

Spring

Boot自動掃描項目所有包中的配置。這樣就不需要在配置文件中配置包的掃描。T

I

P

C

C教案6.1

Spring

Boot的基本配置6.1.1啟動類和核心注解@SpringBootApplication6.1.2關閉某個特定的自動配置6.1.3定制Banner6.1.4關閉banner6.1.5

Spring

Boot的全局配置文件6.1.6

Spring

Boot的StartersT

I

P

C

C教案6.1.2關閉某個特定的自動配置使用@EnableAutoConfiguration注解可以讓Spring

Boot根據當前應用項目所依賴的jar自動配置項目的相關配置。如果開發者不需要Spring

Boot的某一項自動配置,該如何實現呢?通過查看@SpringBootApplication的源代碼可知,應該使用

@SpringBootApplication注解的exclude參數關閉特定的自動配置,以關閉neo4j自動配置為例,代碼如下:@SpringBootApplication(exclude={Neo4jDataAutoConfiguration.class})T

I

P

C

C教案6.1

Spring

Boot的基本配置6.1.1啟動類和核心注解@SpringBootApplication6.1.2關閉某個特定的自動配置6.1.3定制Banner6.1.4關閉banner6.1.5

Spring

Boot的全局配置文件6.1.6

Spring

Boot的StartersT

I

P

C

C教案6.1.3定制Banner首先,在src/main/resources目錄下新建banner.txt文件,并在文件中添加任意字符串內容,如“#Hello,Spring

Boot!”。然后,重新啟動Spring

Boot項目,將發現控制臺啟動信息已經發生改變。如果開發者想把啟動字符串信息換成字符串圖案,具體操作:首先,打開網站/software/taag,輸入自定義字符串,單擊網頁下方的“Select

&

Copy”按鈕。然后,將自

定義banner字符串圖案復制到src/main/resources目錄下的

banner.txt文件中,重新啟動Spring

Boot項目即可。T

I

P

C

C教案6.1

Spring

Boot的基本配置6.1.1啟動類和核心注解@SpringBootApplication6.1.2關閉某個特定的自動配置6.1.3定制Banner6.1.4關閉banner6.1.5

Spring

Boot的全局配置文件6.1.6

Spring

Boot的StartersT

I

P

C

C教案6.1.4關閉banner開發者如果需要關閉banner,可以在src/main/resources目錄下的perties文件中添加如下配置:spring.main.banner-mode

=

offT

I

P

C

C教案6.1

Spring

Boot的基本配置6.1.1啟動類和核心注解@SpringBootApplication6.1.2關閉某個特定的自動配置6.1.3定制Banner6.1.4關閉banner6.1.5

Spring

Boot的全局配置文件6.1.6

Spring

Boot的StartersT

I

P

C

C教案6.1.5

Spring

Boot的全局配置文件Spring

Boot的全局配置文件(perties或application.yml)位于Spring

Boot應用的

src/main/resources目錄下。1.設置端口號server.port=88882.設置Web應用的上下文路徑server.servlet.context-path=/XXX這時應該通過“http://localhost:8080/XXX/testStarters”訪問如下控制器類中的請求處理方法:@RequestMapping("/testStarters")public

String

index()

{}?。?!在Spring

Boot的全局配置文件中,可以配置與修改多個參數,讀者想了解參數的詳細說明和描述可以查看官方文檔說明:https://docs.spring.io/spring-boot/docs/2.4.1/reference/htmlsingle/#common-application-properties。T

I

P

C

C教案6.1

Spring

Boot的基本配置6.1.1啟動類和核心注解@SpringBootApplication6.1.2關閉某個特定的自動配置6.1.3定制Banner6.1.4關閉banner6.1.5

Spring

Boot的全局配置文件6.1.6

Spring

Boot的StartersT

I

P

C

C教案6.1.6

Spring

Boot的StartersSpring

Boot提供了很多簡化企業級開發的“開箱即用”的

Starters。Spring

Boot項目只要使用了所需要的Starters,Spring

Boot即可自動關聯項目開發所需要的相關依賴。例如,我們在ch6_1的pom.xml文件中,添加如下依賴配置:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>Spring

Boot將自動關聯Web開發的相關依賴,如tomcat、spring-webmvc等,進而對Web開發的支持,并將相關技術的配置實現自動配置。通過訪問“https://docs.spring.io/spring-boot/docs/2.4.1/reference/htmlsingle/#using-boot-starter”官網,可以查看Spring

Boot官方提供的StartersT

I

P

C

C教案本章內容Spring

Boot的基本配置讀取應用配置日志配置Spring

Boot的自動配置原理Spring

Boot的條件注解T

I

P

C

C教案6.2讀取應用配置6.2.1

Environment6.2.2

@Value6.2.3

@ConfigurationProperties6.2.4

@PropertySourceT

I

P

C

C教案6.2.1

EnvironmentEnvironment是一個通用的讀取應用程序運行時的環境變量的類,可以通過key-value方式讀取perties、命令行輸入參數、系統屬性、操作系統環境變量等。

【例6-1】使用Environment類讀取perties配置文件的內容。1.創建Spring

Boot項目ch6_1使用STS快速創建Spring

Web應用ch6_1。2.添加配置文件內容

在src/main/resources目錄下,找到全局配置文件

perties,并添加如下內容:test.msg=read

configT

I

P

C

C教案6.2.1

Environment3.創建控制器類EnvReaderConfigController在src/main/java目錄下,創建名為com.ch6_1.controller的包(是com.ch6_1包(主類所在的包)的子包,保障注解全部被掃描),并在該包下創建控制器類EnvReaderConfigController。在控制器類EnvReaderConfigController中,使用@Autowired注解依賴注入Environment類的對象。@RestControllerpublic

class

EnvReaderConfigController{@Autowiredprivate

Environment

env;@RequestMapping("/testEnv")public

String

testEnv()

{return"方法一:"+env.getProperty("test.msg");//test.msg為配置文件perties中的key}}T

I

P

C

C教案6.2.1

Environment4.啟動Spring

Boot應用運行Ch61Application類的main方法,啟動Spring

Boot應用。5.測試應用啟動Spring

Boot應用后,默認訪問地址為:

http://localhost:8080/,將項目路徑直接設為根路徑,這是

Spring

Boot的默認設置。因此,我們可以通過

http://localhost:8080/testEnv測試應用(testEnv與控制器類

ReaderConfigController中的@RequestMapping("/testEnv")對應)。T

I

P

C

C教案6.2讀取應用配置6.2.1

Environment6.2.2

@Value6.2.3

@ConfigurationProperties6.2.4

@PropertySourceT

I

P

C

C教案6.2.2

@Value使用@Value注解讀取配置文件內容示例代碼如下:@Value("${test.msg}")//test.msg為配置文件perties中的keyprivate

String

msg;//通過@Value注解將配置文件中key對應的value賦值給變量msg@RestControllerpublic

class

ValueReaderConfigController

{@Value("${test.msg}")private

String

msg;@RequestMapping("/testValue")public

String

testValue()

{return"方法二:"+msg;}}http://localhost:8080/testValue測試應用T

I

P

C

C教案6.2讀取應用配置6.2.1

Environment6.2.2

@Value6.2.3

@ConfigurationProperties6.2.4

@PropertySourceT

I

P

C

C教案6.2.3

@ConfigurationProperties使用@ConfigurationProperties首先建立配置文件與對象的映

射關系,然后在控制器方法中使用@Autowired注解將對象注入?!纠?-3】使用@ConfigurationProperties讀取配置文件內容。#

nest

Simple

propertiesobj.sname=chenhengobj.sage=88#List

propertiesobj.hobby[0]=runningobj.hobby[1]=basketball#Map

Propertiesobj.city.cid=dlame=dalianT

I

P

C

C教案建立配置文件與對象的映射關系@Component//使用Component注解,聲明一個組件,被控制器依賴注入@ConfigurationProperties(prefix="obj")//obj為配置文件中key的前綴public

class

StudentProperties{private

String

sname;private

int

sage;private

List<String>

hobby;private

Map<String,

String>

city;//省略set和get方法@Overridepublic

String

toString()

{return

"StudentProperties

[sname="

+

sname+

",

sage="

+

sage+

",

hobby0="

+

hobby.get(0)+

",

hobby1="

+

hobby.get(1)+

",

city="

+

city

+

"]";}}T

I

P

C

C教案創建控制器類ConfigurationPropertiesController@RestControllerpublic

class

ConfigurationPropertiesController

{@AutowiredStudentProperties

studentProperties;@RequestMapping("/testConfigurationProperties")public

String

testConfigurationProperties()

{return

studentProperties.toString();}}通過http://localhost:8080/testConfigurationProperties測試應用T

I

P

C

C教案6.2讀取應用配置6.2.1

Environment6.2.2

@Value6.2.3

@ConfigurationProperties6.2.4

@PropertySourceT

I

P

C

C教案6.2.4

@PropertySource可以使用@PropertySource注解找到項目的其他配置文件,然后結合6.2.1~6.2.3節中任意一種方式讀取即可?!纠?-4】使用@PropertySource+@Value讀取其他配置文件內容。在ch6_1的src/main/resources目錄下創建配置文件

perties和perties,并在perties文件中添加如下內容:your.msg=hello.在perties文件中添加如下內容:my.msg=test

PropertySourceT

I

P

C

C教案創建控制器類PropertySourceValueReaderOhterController在ch6_1項目的com.ch6_1.controller包中,創建名為

PropertySourceValueReaderOhterController的控制器類。在該控制器類中,首先使用@PropertySource注解找到其它配置文件,然后使用@Value注解讀取配置文件內容@RestController@PropertySource({"perties","perties"})public

class

PropertySourceValueReaderOhterController

{@Value("${my.msg}")private

String

mymsg;@Value("${your.msg}")private

String

yourmsg;@RequestMapping("/testProperty")public

String

testProperty()

{return"其他配置文件perties:"+mymsg+"<br>"+"其他配置文件perties:"+yourmsg;}}通過

http://localhost:8080/testProperty測試應用T

I

P

C

C教案本章內容Spring

Boot的基本配置讀取應用配置日志配置Spring

Boot的自動配置原理Spring

Boot的條件注解T

I

P

C

C教案6.3日志配置默認情況下,Spring

Boot應用使用LogBack實現日志,使用

apache

Commons

Logging作為日志接口,因此代碼中通常如下所示使用日志:@RestControllerpublic

class

LogTestController

{private

Log

log

=

LogFactory.getLog(LogTestController.class);@RequestMapping("/testLog")public

String

testLog()

{("測試日志");return"測試日志";}}T

I

P

C

C教案日志級別日志級別有ERROR、WARN、INFO、DEBUG和TRACE。Spring

Boot默認的日志級別為INFO,日志信息可以打印到控制臺。但開發者可以自己設定Spring

Boot項目的日志輸出級別,例如在perties配置文件中加入以下配置:#設定日志的默認級別為infologging.level.root=info#設定org包下的日志級別為warn=warn#設定com.ch.ch4_1包下的日志級別為debug.ch.ch4_1=debugT

I

P

C

C教案輸出日志到文件Spring

Boot項目默認并沒有輸出日志到文件,但開發者可以在

perties配置文件中指定日志輸出到文件,配置示例如下:logging.file=my.log該日志文件位于Spring

Boot項目運行的當前目錄(項目工程目錄下)。將在c:/log目錄下生成一個名為my.log的日志文件。logging.file=c:/log/my.log不管日志文件位于何處,當日志文件大小到達10MB時,將自動生成一個新日志文件。T

I

P

C

C教案日志格式控制logging.pattern.console=%level

%date{yyyy-MM-dd

HH:mm:ss:SSS}

%logger{50}.%M

%L

:%m%nlogging.pattern.file=%level

%date{ISO8601}

%logger{50}.%M

%L

:%m%n文件日志輸出格式

控制臺日志輸出格式logging.pattern.console:指定控制臺日志格式。logging.pattern.file:指定日志文件格式。%level:指定輸出日志級別。%date:指定日志發生的時間。ISO8601表示標準日期,相當于yyyy-MM-dd

HH:mm:ss:SSS。%logger:指定輸出Looger的名字,包名+類名,{n}限定了輸出長度。%M:指定日志發生時的方法名。%L:指定日志調用時所在代碼行,適用于開發調試,線上運行時不建議使用此參數,因為獲取代碼行對性能有消耗。%m:表示日志消息。%n:表示日志換行。T

I

P

C

C教案本章內容Spring

Boot的基本配置讀取應用配置日志配置Spring

Boot的自動配置原理Spring

Boot的條件注解T

I

P

C

C教案6.4

Spring

Boot的自動配置原理從6.1.1節,我們可知Spring

Boot使用核心注解

@SpringBootApplication將一個帶有main方法的類標注為應

用的啟動類。@SpringBootApplication注解最主要的功能之一是為Spring

Boot開啟了一個@EnableAutoConfiguration注解的自動配置功能。@EnableAutoConfiguration注解主要利用了一個類名為

AutoConfigurationImportSelector的選擇器向Spring容器自動配置一些組件。@EnableAutoConfiguration注解的源代碼可以從spring-boot-autoconfigure-2.4.1.jar(org.springframework.boot.autoconfigure)依賴包中查看。T

I

P

C

C教案6.4

Spring

Boot的自動配置原理從源代碼中可以看出,最終Spring

Boot是通過加載所有(inmultiple

JAR

files)META-INF/spring.factories配置文件進行自動配置的。所以,@SpringBootApplication注解通過使用

@EnableAutoConfiguration注解自動配置的原理是:從classpath中搜索所有META-INF/spring.factories配置文件,并將其中

org.springframework.boot.autoconfigure.EnableAutoConfiguration對應的配置項通過Java反射機制進行實例化,然后匯總并加載到Spring的IoC容器。T

I

P

C

C教案本章內容Spring

Boot的基本配置讀取應用配置日志配置Spring

Boot的自動配置原理Spring

Boot的條件注解T

I

P

C

C教案6.5

Spring

Boot的條件注解6.5.1條件注解6.5.2實例分析6.5.3自定義條件6.5.4自定義StartersT

I

P

C

C教案6.5.1條件注解打開spring.factories配置文件中任意一個AutoConfiguration,一般都可以找到條件注解。所謂Spring的條件注解,就是應用程序的配置類在滿足某些特定條件才會被自動啟用此配置類的配置項。Spring

Boot的條件注解位于spring-boot-autoconfigure-2.4.1.jar的org.springframework.boot.autoconfigure.condition包下。條件注解都是組合了@Conditional元注解,只是針對不同的條件去實現。T

I

P

C

C教案6.5

Spring

Boot的條件注解6.5.1條件注解6.5.2實例分析6.5.3自定義條件6.5.4自定義StartersT

I

P

C

C教案6.5.2實例分析從Spring

MVC項目的web.xml文件中過濾器的配置可知,

Spring

Boot自動配置HTTP編碼需要滿足的條件是:配置

CharacterEncodingFilter的Bean,并設置encoding和forceEncoding這兩個參數。通過查看源代碼可知

org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration類,根據條件注解配置了

CharacterEncodingFilter的Bean,并設置了encoding和forceEncoding這兩個參數。T

I

P

C

C教案6.5

Spring

Boot的條件注解6.5.1條件注解6.5.2實例分析6.5.3自定義條件6.5.4自定義StartersT

I

P

C

C教案6.5.3自定義條件Spring的@Conditional注解根據滿足某特定條件創建一個特定

的Bean。例如,當某jar包在類路徑下時,自動配置一個或多個

Bean。即根據特定條件控制Bean的創建行為,這樣我們就可以

利用此特性進行一些自動配置。那么,開發者如何自己構造條件呢?在Spring框架中,可以通過實現Condition接口,并重寫

matches方法來構造條件?!纠?-7】如果類路徑classpath(src/main/resources)下存在文件perties,則輸出“perties文件存在。”;否則輸出“perties文件不存在!”。T

I

P

C

C教案構造條件public

class

MyCondition

implements

Condition{@Overridepublic

boolean

matches(ConditionContext

context,

AnnotatedTypeMetadata

metadata)

{return

context.getResourceLoader().getResource("classpath:perties").exists();}}public

class

YourCondition

implements

Condition{@Overridepublic

boolean

matches(ConditionContext

context,

AnnotatedTypeMetadata

metadata)

{return

!context.getResourceLoader().getResource("classpath:perties").exists()}}T

I

P

C

C教案創建不同條件下Bean的類package

com.ch6_1.conditional;public

interface

MessagePrint

{public

String

showMessage();}package

com.ch6_1.conditional;public

class

MyMessagePrint

implements

MessagePrint{@Overridepublic

String

showMessage()

{return

"perties文件存在。";}}package

com.ch6_1.conditional;public

class

YourMessagePrint

implements

MessagePrint{@Overridepublic

String

showMessage()

{return

"perties文件不存在!";}}T

I

P

C

C教案創建配置類@Configurationpublic

class

ConditionConfig

{@Bean@Conditional(MyCondition.class)public

MessagePrint

myMessage()

{return

new

MyMessagePrint();}@Bean@Conditional(YourCondition.class)public

MessagePrint

yourMessage()

{return

new

YourMessagePrint();}}使用@Bean和@Conditional實例化符合條件的BeanT

I

P

C

C教案創建測試類package

com.ch6_1.conditional;import

org.springframework.context.annotation.AnnotationConfigApplicationContext;public

class

TestMain

{private

static

AnnotationConfigApplicationContext

context;public

static

void

main(String[]

args)

{context

=

new

AnnotationConfigApplicationContext(ConditionConfig.class);MessagePrint

mp

=

context.getBean(MessagePrint.class);System.out.println(mp.showMessage());}}T

I

P

C

C教案運行當Spring

Boot應用ch6_1的src/main/resources目錄下存在

perties文件時,運行測試類,控制臺顯示

“perties文件存在。”;當Spring

Boot應用ch6_1的src/main/resources目錄下不存在perties文件時,運行測試類,控制臺顯示“perties文件不存在!”。T

I

P

C

C教案6.5

Spring

Boot的條件注解6.5.1條件注解6.5.2實例分析6.5.3自定義條件6.5.4自定義StartersT

I

P

C

C教案6.5.4自定義Starters從6.1.6節可知,第三方為Spring

Boot貢獻了許多Starters。那么,我們作為開發者是否也可以貢獻自己的Starters?學習

Spring

Boot的自動配置機制后,答案是肯定的?!纠?-8】自定義一個Starter(spring_boot_mystarters)。要求:當類路徑中存在MyService類時,自動配置該類的Bean,并可以將相應Bean的屬性在perties中配置。T

I

P

C

C教案新建Spring

Boot項目spring_boot_mystarters首先,通過選擇菜單“File->New->Spring

Starter

Project”打開“New

Spring

Starter

Project”對話框。其次,在對話框中輸入項目名稱spring_boot_mystarters。最后,單擊“Next”與“Finish”按鈕。T

I

P

C

C教案修改pom文件修改Spring

Boot項目spring_boot_mystarters的pom文件,增加Spring

Boot自身的自動配置作為依賴。<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency>T

I

P

C

C教案創建屬性配置類MyPropertiespackage

com.ch.spring_boot_mystarters;import

perties.ConfigurationProperties;//在perties中通過my.msg=設置屬性@ConfigurationProperties(prefix="my")

public

class

MyProperties{private

String

msg="默認值";public

String

getMsg()

{return

msg;}public

void

setMsg(String

msg)

{this.msg

=

msg;}}T

I

P

C

C教案創建判斷依據類MyService自定義的Starters將根據該類的存在與否來創建該類的Bean,該類可以是第三方類庫的類。package

com.ch.spring_boot_mystarters;public

class

MyService

{private

String

msg;public

String

sayMsg()

{return

"my

"

+

msg;}public

String

getMsg()

{return

msg;}public

void

setMsg(String

msg)

{this.msg

=

msg;}}T

I

P

C

C教案創建自動配置類MyAutoConfiguration@Configuration//開啟屬性配置類MyProperties提供參數@EnableConfigurationProperties(MyProperties.class)//類加載器(類路徑)中是否存在對應的類@ConditionalOnClass(MyService.class)//應用環境中屬性是否存在指定的值@ConditionalOnProperty(prefix

=

"my",

value

=

"enabled",

matchIfMissing

=

true)public

class

MyAutoConfiguration

{@Autowiredprivate

MyProperties

myProperties;@Bean//當容器中不存在MyService的Bean時,自動配置這個Bean@ConditionalOn

溫馨提示

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

評論

0/150

提交評論