springBoot筆記_第1頁
springBoot筆記_第2頁
springBoot筆記_第3頁
springBoot筆記_第4頁
springBoot筆記_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1. Spring Boot 入門Spring Boot是Spring社區(qū)較新的一個項目。該項目的目的是幫助開發(fā)者更容易的創(chuàng)建基于Spring的應用程序和服務,讓更多人的人更快的對Spring進行入門體驗,讓Java開發(fā)也能夠實現(xiàn)Ruby on Rails那樣的生產效率。為Spring生態(tài)系統(tǒng)提供了一種固定的、約定優(yōu)于配置風格的框架。Spring Boot具有如下特性:l 為基于Spring的開發(fā)提供更快的入門體驗l 開箱即用,沒有代碼生成,也無需XML配置。同時也可以修改默認值來滿足特定的需求。l 提供了一些大型項目中常見的非功能性特性,如嵌入式服務器、安全、指標,健康檢測、外部配置等。l

2、Spring Boot并不是對Spring功能上的增強,而是提供了一種快速使用Spring的方式。1.1 簡單例子首先創(chuàng)建一個一般的Maven項目,有一個pom.xml和基本的src/main/java結構。1.1.1 pom.xml 文件<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/POM/4.

3、0.0 /xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.nes.spring.boot</groupId> <artifactId>SpringBootDemo1</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframew

4、ork.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.0.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifact

5、Id> </dependency> </dependencies> <build><plugins><!- Compile -><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.5.1</version><configuration><source>1.7&l

6、t;/source><target>1.7</target></configuration> </plugin> <!- spring boot maven plugin -> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <dependencies> <dependency> <g

7、roupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.5.RELEASE</version> </dependency> </dependencies> </plugin></plugins></build></project>1.1.2 對pom的說明首先是增加了<parent>,增加父pom比較簡單,而且spring-bo

8、ot-starter-parent包含了大量配置好的依賴管理,在自己項目添加這些依賴的時候不需要寫<version>版本號。使用父pom雖然簡單,但是有些情況我們已經有父pom,不能直接增加<parent>時,可以通過如下方式:<dependencyManagement> <dependencies> <dependency> <!- Import dependency management from Spring Boot -> <groupId>org.springframework.boot</gr

9、oupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.2.3.RELEASE</version> <type>pom</type> <scope>import</scope><!這個地方-> </dependency> </dependencies></dependencyManagement>1.1.3 關于java.version屬性上面pom.xml雖然沒有出

10、現(xiàn)這個屬性,這里要特別提醒。Spring默認使用jdk1.6,如果你想使用jdk1.8,你需要在pom.xml的屬性里面添加java.version,如下:<properties> <java.version>1.8</java.version></properties>1.1.4 添加spring-boot-starter-web依賴Spring通過添加spring-boot-starter-*這樣的依賴就能支持具體的某個功能。我們這個示例最終是要實現(xiàn)web功能,所以添加的是這個依賴。更完整的功能列表可以查看:Using-boot-starte

11、r-poms1.1.4 添加spring-boot-maven-plugin插件該插件支持多種功能,常用的有兩種,第一種是打包項目為可執(zhí)行的jar包。在項目根目錄下執(zhí)行mvn package將會生成一個可執(zhí)行的jar包,jar包中包含了所有依賴的jar包,只需要這一個jar包就可以運行程序,使用起來很方便。該命令執(zhí)行后還會保留一個XXX.jar.original的jar包,包含了項目中單獨的部分。生成這個可執(zhí)行的jar包后,在命令行執(zhí)行java -jar xxxx.jar即可啟動項目。另外一個命令就是mvn spring-boot:run,可以直接使用tomcat(默認)啟動項目。在我們開發(fā)過

12、程中,我們需要經常修改,為了避免重復啟動項目,我們可以啟用熱部署。1.1.6 spring-loaded熱部署Spring-Loaded項目提供了強大的熱部署功能,添加/刪除/修改 方法/字段/接口/枚舉 等代碼的時候都可以熱部署,速度很快,很方便。想在Spring Boot中使用該功能非常簡單,就是在spring-boot-maven-plugin插件下面添加依賴:<!- 支持熱部署 -><dependency> <groupId>org.springframework</groupId><artifactId>springload

13、ed</artifactId> <version>1.2.5.RELEASE</version></dependency> 添加以后,通過mvn spring-boot:run啟動就支持熱部署了。注意:使用熱部署的時候,需要IDE編譯類后才能生效,你可以打開自動編譯功能,這樣在你保存修改的時候,類就自動重新加載了。1.2 創(chuàng)建一個應用類我們創(chuàng)建一個Application類:RestControllerEnableAutoConfigurationpublic class Application RequestMapping("/&quo

14、t;) String home() return "Hello World!" RequestMapping("/now") String hehe() return "現(xiàn)在時間:" + (new Date().toLocaleString(); public static void main(String args) SpringApplication.run(Application.class, args); 1.2.1 注意Spring Boot建議將我們main方法所在的這個主要的配置類配置在根包名下。com +- examp

15、le +- myproject +- Application.java +- domain | +- Customer.java | +- CustomerRepository.java +- service | +- CustomerService.java +- web +- CustomerController.java在Application.java中有main方法。因為默認和包有關的注解,默認包名都是當前類所在的包,例如ComponentScan, EntityScan, SpringBootApplication注解。(都是安當前Application.java所在包作為Scan

16、掃描)1.2.2 RestController因為我們例子是寫一個web應用,因此寫的這個注解,這個注解相當于同時添加Controller和ResponseBody注解。1.2.3 EnableAutoConfigurationSpring Boot建議只有一個帶有該注解的類。EnableAutoConfiguration作用:Spring Boot會自動根據你jar包的依賴來自動配置項目。例如當你項目下面有HSQLDB的依賴時,Spring Boot會創(chuàng)建默認的內存數(shù)據庫的數(shù)據源DataSource,如果你自己創(chuàng)建了DataSource,Spring Boot就不會創(chuàng)建默認的DataSour

17、ce。如果你不想讓Spring Boot自動創(chuàng)建,你可以配置注解的exclude屬性,例如:ConfigurationEnableAutoConfiguration(exclude=DataSourceAutoConfiguration.class)public class MyConfiguration 1.2.4 SpringBootApplication由于大量項目都會在主要的配置類上添加Configuration,EnableAutoConfiguration,ComponentScan三個注解。因此Spring Boot提供了SpringBootApplication注解,該注解可以

18、替代上面三個注解(使用Spring注解繼承實現(xiàn))。1.2.5 啟動項目SpringApplication.run啟動Spring Boot項目最簡單的方法就是執(zhí)行下面的方法:SpringApplication.run(Application.class, args);該方法返回一個ApplicationContext對象,使用注解的時候返回的具體類型是AnnotationConfigApplicationContext或AnnotationConfigEmbeddedWebApplicationContext,當支持web的時候是第二個。除了上面這種方法外,還可以用下面的方法:SpringAp

19、plication application = new SpringApplication(Application.class);application.run(args);SpringApplication包含了一些其他可以配置的方法,如果你想做一些配置,可以用這種方式。除了上面這種直接的方法外,還可以使用SpringApplicationBuilder:new SpringApplicationBuilder() .showBanner(false) .sources(Application.class) .run(args);當使用SpringMVC的時候由于需要使用子容器,就需要用到S

20、pringApplicationBuilder,該類有一個child(xxx.)方法可以添加子容器。1.3 運行在IDE中直接直接執(zhí)行main方法,然后訪問http:/localhost:8080即可。另外還可以用上面提到的mvn,可以打包為可執(zhí)行jar包,然后執(zhí)行java -jar xxx.jar。或者執(zhí)行mvn spring-boot:run運行項目。2. Spring Boot 屬性配置和使用 Spring Boot 允許通過外部配置讓你在不同的環(huán)境使用同一應用程序的代碼,簡單說就是可以通過配置文件來注入屬性或者修改默認的配置。2.1 Spring Boot 支持多種外部配置方

21、式這些方式優(yōu)先級如下:1. 命令行參數(shù)2. 來自java:comp/env的JNDI屬性3. Java系統(tǒng)屬性(System.getProperties())4. 操作系統(tǒng)環(huán)境變量5. RandomValuePropertySource配置的random.*屬性值6. jar包外部的perties或application.yml(帶file)配置文件7. jar包內部的perties或application.yml(帶file)配置文件8. jar包外部的appl

22、perties或application.yml(不帶file)配置文件9. jar包內部的perties或application.yml(不帶file)配置文件10. Configuration注解類上的PropertySource11. 通過SpringApplication.setDefaultProperties指定的默認屬性2.1.1 命令行參數(shù)通過java -jar app.jar -name="Spring" -server.port=9090方式來傳遞參數(shù)。參數(shù)用-xx

23、x=xxx的形式傳遞。可以使用的參數(shù)可以是我們自己定義的,也可以是Spring Boot中默認的參數(shù)。很多人可能會關心如web端口如何配置這樣的問題,這些都是Spring Boot中提供的參數(shù),部分可用參數(shù)如下:# LOGGINGlogging.path=/var/logslogging.file=myapp.loglogging.config= # location of config file (default classpath:logback.xml for logback)logging.level.*= # levels for loggers, e.g. "loggin

24、.springframework=DEBUG" (TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF)# EMBEDDED SERVER CONFIGURATION (ServerProperties)server.port=8080server.address= # bind to a specific NICserver.session-timeout= # session timeout in secondsserver.context-parameters.*= # Servlet context init param

25、eters, e.g. server.context-parameters.a=alphaserver.context-path= # the context path, defaults to '/'server.servlet-path= # the servlet path, defaults to '/'更多常見的應用屬性請瀏覽這里注意:命令行參數(shù)在app.jar的后面!可以通過SpringApplication.setAddCommandLineProperties(false)禁用命令行配置。2.1.2 Java系統(tǒng)屬性注意Java系統(tǒng)屬性位置jav

26、a -Dname="isea533" -jar app.jar,可以配置的屬性都是一樣的,優(yōu)先級不同。例如java -Dname="isea533" -jar app.jar -name="Spring!"中name值為Spring!2.1.3 操作系統(tǒng)環(huán)境變量配置過JAVA_HOME的應該都了解這一個。這里需要注意的地方,有些OS可以不支持使用.這種名字,如server.port,這種情況可以使用SERVER_PORT來配置。2.1.4 RandomValuePropertySource系統(tǒng)中用到隨機數(shù)的地方,例如:my.secre

27、t=$random.valuemy.number=$my.bignumber=$random.longmy.number.less.than.ten=$(10)my.number.in.range=$1024,65536 *支持value參數(shù)和,max參數(shù),當提供max參數(shù)的時候,value就是最小值。2.1.5 應用配置文件(.properties或.yml)在配置文件中直接寫:name=Isea533server.port=8080 .yml格式的配置文件如:name: Isea533server: port:

28、 8080當有前綴的情況下,使用.yml格式的配置文件更簡單。關于.yml配置文件用法請看這里注意:使用.yml時,屬性名的值和冒號中間必須有空格,如name: Isea533正確,name:Isea533就是錯的。 屬性配置文件的位置spring會從classpath下的/config目錄或者classpath的根目錄查找perties或application.yml。/config優(yōu)先于classpath根目錄2.1.6 PropertySource這個注解可以指定具體的屬性配置文件,優(yōu)先級比較低。2.1.7 SpringApplication.

29、setDefaultProperties例如:SpringApplication application = new SpringApplication(Application.class);Map<String, Object> defaultMap = new HashMap<String, Object>();defaultMap.put("name", "Isea-Blog");/還可以是Properties對象application.setDefaultProperties(defaultMap);application

30、.run(args);2.2 應用(使用)屬性2.2.1 Value(“$xxx”)這種方式是最簡單的,通過Value注解可以將屬性值注入進來。2.2.2 ConfigurationPropertiesSpring Boot 可以方便的將屬性注入到一個配置對象中。例如:=Isea533my.port=8080my.servers0=my.servers1=對應對象:ConfigurationProperties(prefix="my")public class Config private String name; private Integer port;

31、private List<String> servers = new ArrayList<String>(); public String geName() return ; public Integer gePort() return this.port; public List<String> getServers() return this.servers; Spring Boot 會自動將prefix="my"前綴為my的屬性注入進來。Spring Boot 會自動轉換類型,當使用List的時候需要注意在配置中對

32、List進行初始化!Spring Boot 還支持嵌套屬性注入,例如:name=isea533jdbc.username=rootjdbc.password=root.對應的配置類:ConfigurationPropertiespublic class Config private String name; private Jdbc jdbc; class Jdbc private String username; private String password; /getter. public Integer gePort() return this.port; public Jdbc ge

33、tJdbc() return this.jdbc; jdbc開頭的屬性都會注入到Jdbc對象中。2.2.3 在Bean方法上使用ConfigurationProperties例如:ConfigurationProperties(prefix = "foo")Beanpublic FooComponent fooComponent() .Spring Boot 會將foo開頭的屬性按照名字匹配注入到FooComponent對象中。2.2.4 屬性占位符例如:=MyAppapp.description=$ is a Spring Boot app

34、lication可以在配置文件中引用前面配置過的屬性(優(yōu)先級前面配置過的這里都能用)。通過如$:默認名稱方法還可以設置默認值,當找不到引用的屬性時,會使用默認的屬性。由于$方式會被Maven處理。如果你pom繼承的spring-boot-starter-parent,Spring Boot 已經將maven-resources-plugins默認的$方式改為了 方式,例如name。如果你是引入的Spring Boot,你可以修改使用其他的分隔符2.2.5 通過屬性占位符還能縮短命令參數(shù)例如修改web默認端口需要使用-server.port=9090方式,如果在配置中寫上:ser

35、ver.port=$port:8080 那么就可以使用更短的-port=9090,當不提供該參數(shù)的時候使用默認值8080。2.2.6 屬性名匹配規(guī)則例如有如下配置對象:ComponentConfigurationProperties(prefix="person")public class ConnectionSettings private String firstName;firstName可以使用的屬性名如下:person.firstName,標準的駝峰式命名person.first-name,虛線(-)分割方式,推薦在.properties和.yml配置文件中使用P

36、ERSON_FIRST_NAME,大寫下劃線形式,建議在系統(tǒng)環(huán)境變量中使用2.2.7 屬性驗證可以使用JSR-303注解進行驗證,例如:ComponentConfigurationProperties(prefix="connection")public class ConnectionSettings NotNull private InetAddress remoteAddress; / . getters and setters2.3 最后以上是Spring Boot 屬性配置和使用的內容,有些不全面的地方或者讀者有更多疑問,可以查看Spring Boot完整文檔&#

37、160;或 Externalized Configuration。3. Spring Boot 集成MyBatis3.1. Spring Boot 集成druiddruid有很多個配置選項,使用Spring Boot 的配置文件可以方便的配置druid。在application.yml配置文件中寫上:spring: datasource: name: test url: jdbc:mysql:/37:3306/test username: root password: # 使用druid數(shù)據源 type: com.alibaba.druid.pool.Drui

38、dDataSource driver-class-name: com.mysql.jdbc.Driver filters: stat maxActive: 20 initialSize: 1 maxWait: 60000 minIdle: 1 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: select 'x' testWhileIdle: true testOnBorrow: false testOnReturn: false poolPrepar

39、edStatements: true maxOpenPreparedStatements: 20這里通過type: com.alibaba.druid.pool.DruidDataSource配置即可!3.2. Spring Boot 集成MyBatisSpring Boot 集成MyBatis有兩種方式,一種簡單的方式就是使用MyBatis官方提供的:mybatis-spring-boot-starter另外一種方式就是仍然用類似mybatis-spring的配置方式,這種方式需要自己寫一些代碼,但是可以很方便的控制MyBatis的各項配置。3.2.1. mybatis-spring-boo

40、t-starter方式在pom.xml中添加依賴:<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.0.0</version></dependency>mybatis-spring-boot-starter依賴樹如下: 其中mybatis使用的3.3.0版本,可以通過:<mybatis.version>

41、;3.3.0</mybatis.version>屬性修改默認版本。 mybatis-spring使用版本1.2.3,可以通過: <mybatis-spring.version>1.2.3</mybatis-spring.version>修改默認版本。在application.yml中增加配置:mybatis: mapperLocations: classpath:mapper/*.xml typeAliasesPackage: tk.mapper.model 除了上面常見的兩項配置,還有:mybatis.config:mybatis-co

42、nfig.xml配置文件的路徑mybatis.typeHandlersPackage:掃描typeHandlers的包mybatis.checkConfigLocation:檢查配置文件是否存在mybatis.executorType:設置執(zhí)行模式(SIMPLE, REUSE, BATCH),默認為SIMPLE3.2.2 mybatis-spring方式這種方式和平常的用法比較接近。需要添加mybatis依賴和mybatis-spring依賴。然后創(chuàng)建一個MyBatisConfig配置類:/* * MyBatis基礎配置 * * author liuzh * since 2015-12-19

43、10:11 */ConfigurationEnableTransactionManagementpublic class MyBatisConfig implements TransactionManagementConfigurer Autowired DataSource dataSource; Bean(name = "sqlSessionFactory") public SqlSessionFactory sqlSessionFactoryBean() SqlSessionFactoryBean bean = new SqlSessionFactoryBean();

44、 bean.setDataSource(dataSource); bean.setTypeAliasesPackage("tk.mybatis.springboot.model"); /分頁插件 PageHelper pageHelper = new PageHelper(); Properties properties = new Properties(); properties.setProperty("reasonable", "true"); properties.setProperty("supportMethod

45、sArguments", "true"); properties.setProperty("returnPageInfo", "check"); properties.setProperty("params", "count=countSql"); pageHelper.setProperties(properties); /添加插件 bean.setPlugins(new InterceptorpageHelper); /添加XML目錄 ResourcePatternResolver

46、 resolver = new PathMatchingResourcePatternResolver(); try bean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"); return bean.getObject(); catch (Exception e) e.printStackTrace(); throw new RuntimeException(e); Bean public SqlSessionTemplate sqlSessionTemplate(SqlSessionF

47、actory sqlSessionFactory) return new SqlSessionTemplate(sqlSessionFactory); Bean Override public PlatformTransactionManager annotationDrivenTransactionManager() return new DataSourceTransactionManager(dataSource); 上面代碼創(chuàng)建了一個SqlSessionFactory和一個SqlSessionTemplate,為了支持注解事務,增加了EnableTransactionManagemen

48、t注解,并且反回了一個PlatformTransactionManagerBean。另外應該注意到這個配置中沒有MapperScannerConfigurer,如果我們想要掃描MyBatis的Mapper接口,我們就需要配置這個類,這個配置我們需要單獨放到一個類中。/* * MyBatis掃描接口 * * author liuzh * since 2015-12-19 14:46 */Configuration/注意,由于MapperScannerConfigurer執(zhí)行的比較早,所以必須有下面的注解AutoConfigureAfter(MyBatisConfig.class)public c

49、lass MyBatisMapperScannerConfig Bean public MapperScannerConfigurer mapperScannerConfigurer() MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); mapperScannerConfigurer.setBasePackage(&

50、quot;tk.mybatis.springboot.mapper"); /配置通用mappersProperties properties = new Properties(); properties.setProperty("mappers", "tk.mybatis.springboot.util.MyMapper"); properties.setProperty("notEmpty", "false"); properties.setProperty("IDENTITY",

51、"MYSQL"); /這里使用的通用Mapper的MapperScannerConfigurer,所有有下面這個方法 mapperScannerConfigurer.setProperties(properties); return mapperScannerConfigurer; 這個配置一定要注意AutoConfigureAfter(MyBatisConfig.class),必須有這個配置,否則會有異常。原因就是這個類執(zhí)行的比較早,由于sqlSessionFactory還不存在,后續(xù)執(zhí)行出錯。做好上面配置以后就可以使用MyBatis了。3.3. 關于分頁插件和通用Map

52、per集成分頁插件作為插件的例子在上面代碼中有。通用Mapper配置實際就是配置MapperScannerConfigurer的時候使用tk.mybatis.spring.mapper.MapperScannerConfigurer即可,配置屬性使用Properties。3.4. Spring Boot集成MyBatis的基礎項目項目地址:分頁插件和通用Mapper的相關信息可以通過上面地址找到。4. Spring Boot 靜態(tài)資源處理Spring Boot 默認的處理方式就已經足夠了,默認情況下Spring Boot 使用WebMvcAutoConfiguration中配置的各種屬性。建議

53、使用Spring Boot 默認處理方式,需要自己配置的地方可以通過配置文件修改。但是如果你想完全控制Spring MVC,你可以在Configuration注解的配置類上增加EnableWebMvc,增加該注解以后WebMvcAutoConfiguration中配置就不會生效,你需要自己來配置需要的每一項。這種情況下的配置方法建議參考WebMvcAutoConfiguration類。本文以下內容針對Spring Boot 默認的處理方式,部分配置通過在application.yml配置文件中設置。1.spring boot默認加載文件的路徑是 /META-INF/resources/ /re

54、sources/ /static/ /public/private static final String CLASSPATH_RESOURCE_LOCATIONS =           "classpath:/META-INF/resources/", "classpath:/resources/",       

55、   "classpath:/static/", "classpath:/public/"   所有本地的靜態(tài)資源都配置在了classpath下面了, 而非在webapp下了 4.1. 配置資源映射Spring Boot 默認配置的/*映射到/static(或/public ,/resources,/META-INF/resources),/webjars/*會映射到classpath:/META-INF/resources/webjars/。注意:上面的/stat

56、ic等目錄都是在classpath:下面。如果你想增加如/mystatic/*映射到classpath:/mystatic/,你可以讓你的配置類繼承WebMvcConfigurerAdapter,然后重寫如下方法:Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) registry.addResourceHandler("/mystatic/*") .addResourceLocations("classpath:/mystatic/");這種方式會在默認的基礎上增加/mystatic/*映射到classpath:/mystatic/,不會影響默認的方式,可以同時使用。靜態(tài)資源映射還有一個配置選項,為了簡單這里用.properties方式書寫:spring.mvc

溫馨提示

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

評論

0/150

提交評論