2019年12月16日更新
- 新建類后,要用@controller注解聲明將該類通過(guò)springboot進(jìn)行統(tǒng)一controller管理。
- 通過(guò)@getmapper('')注解聲明一個(gè)函數(shù)為路由函數(shù),將路由地址傳入,在瀏覽器通過(guò)localhost:8080(默認(rèn))路徑進(jìn)行訪問(wèn)。
- 直接通過(guò)return返回?cái)?shù)據(jù)的話是無(wú)效的,需要將其封裝在ServletResponse中,通過(guò)實(shí)例化ServletResponse,調(diào)用getWriter().write()方法將數(shù)據(jù)寫(xiě)入。
- 可以直接通過(guò)ResponseBody注解,省去自己手寫(xiě)ServletResponse處理過(guò)程,這個(gè)注解同時(shí)會(huì)自動(dòng)處理字符串編碼問(wèn)題。而且大多數(shù)情況下,返回的并不是簡(jiǎn)單的字符串,而是一個(gè)Object。若使用ServletResponse.Object.getWriter().write()方法還需要自己將Object轉(zhuǎn)換成字符串才能返回,而使用注解會(huì)自動(dòng)處理成json字符串。
- 測(cè)試方式:⑴ POSTman. ⑵ 單元測(cè)試
- 一般文本的header是text/plain,而object的header是application/json
- 熱重啟配置:
pom設(shè)置中需要加入devtool依賴,并配置ide進(jìn)行自動(dòng)編譯。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.zhujiankai</groupId>
<artifactId>app</artifactId>
<version>1.0</version>
<name>webAPP</name>
<description>WebAPP API process</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtool</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
自動(dòng)編譯:setting==>build==>compiler==>勾選Build Project Automatically
- 常用注解
get:GetMapping
put:PutMapping
delete:DeleteMapping
...全注解:RequestMapping(url,method)。默認(rèn)不填寫(xiě)method是可以進(jìn)行處理全部的動(dòng)作的。也可以通過(guò)RequestMethod指定注解動(dòng)作,如{RequestMethod.GET}
如果在class上加入ResponseBody注解,而不是在某個(gè)方法上加,則意味著這個(gè)類下面的所有方法都是以ServletResponse方式處理
可以通過(guò)RestController來(lái)代替Controller+ResponseBody兩個(gè)注解,簡(jiǎn)化書(shū)寫(xiě)。
- url路由地址需要有自解釋性。一般建議格式為
host:port/version/resource/function
(版本號(hào)一般可以寫(xiě)在url中間,也可以通過(guò)header指定,也可以通過(guò)?version查詢參數(shù)指定)
- 所有軟件的復(fù)雜性,都是為了代碼的可維護(hù)性。
- 軟件工程中的一些關(guān)鍵原則:
開(kāi)閉原則(OCP open closed principle):對(duì)擴(kuò)展開(kāi)放,對(duì)修改封閉。
里氏替換原則、狄米特法則,都是開(kāi)閉原則的子原則,不需要特別關(guān)注。
IOC/DI也是為了實(shí)現(xiàn)開(kāi)閉原則而產(chǎn)生的。 - 實(shí)現(xiàn)開(kāi)閉原則,最基本的準(zhǔn)則就是面向抽象編程(interface,abstract),這樣三大特性之一的多態(tài)性才能得到實(shí)現(xiàn)。
- oic/di出現(xiàn)的過(guò)程:
interface==>設(shè)計(jì)模式中的工廠模式==>ioc/di - 單純的interface接口無(wú)法實(shí)現(xiàn)對(duì)象實(shí)例化的統(tǒng)一,只能夠完成方法調(diào)用的統(tǒng)一。
- 面向?qū)ο笾饕褪峭瓿蓪?duì)象實(shí)例化和方法調(diào)用兩件事情。
- 只有一段代碼中沒(méi)有new的出現(xiàn)才能實(shí)現(xiàn)代碼的穩(wěn)定,才能實(shí)現(xiàn)ocp(實(shí)質(zhì)是一段代碼如果要保持穩(wěn)定,就不應(yīng)該負(fù)責(zé)對(duì)象的實(shí)例化.)。但是對(duì)象實(shí)例化是不可能消除的,因此需要把實(shí)例化的代碼轉(zhuǎn)移到其他地方的代碼片段中去。
- 工程模式:簡(jiǎn)單工廠模式、普通工廠模式、抽象工廠模式。
2019年12月20日更新
- 代碼中總會(huì)存在不穩(wěn)定。需要隔離不穩(wěn)定的代碼片段,保證其他代碼是穩(wěn)定的。是需要把變化隔離封裝起來(lái)的。
- 由于使用簡(jiǎn)單工程模式時(shí),在代碼中還是需要實(shí)例化工廠或使用工廠的靜態(tài)方法,依然存在不穩(wěn)定性,因此可以使用抽象工廠。但是一般來(lái)說(shuō)不需要再引入抽象工廠模式,使用簡(jiǎn)單工廠即可,因?yàn)榉€(wěn)定性總是相對(duì)的,不存在完全的穩(wěn)定。
- 變化是導(dǎo)致不穩(wěn)定的原因。變化包括用戶輸入、用戶操作、軟件的技術(shù)選擇、業(yè)務(wù)需求的更改等。隔離不穩(wěn)定其實(shí)就是在隔離變化。
- 工廠模式下需要通過(guò)if、switch case等判斷用戶輸入,并生成返回對(duì)應(yīng)的對(duì)象??梢酝ㄟ^(guò)反射機(jī)制來(lái)消除這種因輸入不同帶來(lái)的不穩(wěn)定性,即直接通過(guò)用戶輸入字符串找到對(duì)應(yīng)的類并返回實(shí)例化的對(duì)象。
# string class_name
# 反射需要傳入的是一個(gè)完整的類(或包)的路徑,而不是類名或包名。
string classname ="(path)"+class_name
Class<?> cls = class.forName(classname);
Object obj = cls.newInstance();
return (接口)obj
- <?>表示的是一個(gè)元類。類是對(duì)象的抽象,元類是對(duì)類的描述。
- 使用上述方法(工廠模式+反射機(jī)制),解決了代碼的穩(wěn)定性問(wèn)題。但是這依然是正向思維只是解決了OCP的問(wèn)題,并沒(méi)有應(yīng)用到控制反轉(zhuǎn)依賴注入思想。
- 配置文件是屬于外部文件,不是系統(tǒng)內(nèi)部文件(即可以理解為用戶的輸入)。因此改動(dòng)配置文件并不是違反OCP原則。
2020年01月05日更新
- Spring、SpringMVC、SpringBoot的關(guān)系
初期,java常用框架為SSM,即Spring+SpringMVC+Mybatis。但是實(shí)際上SpringMVC是Spring的一個(gè)模塊,是屬于Spring的,也就是說(shuō)SSM實(shí)際上是兩個(gè)框架的組合。
Spring全稱是Spring Framework,即SSM是Spring Framework+Mybatis,其中SpringMVC是Spring Framework中一個(gè)專門(mén)用于開(kāi)發(fā)web的模塊。 - Spring Framework和Spring Boot
Spring Boot是Spring Framework的一個(gè)應(yīng)用。或者說(shuō)Spring Frame是Spring Boot的基礎(chǔ)。
因此說(shuō)"因?yàn)镾pring Framework需要使用xml做依賴注入,而Spring Boot可以使用注解進(jìn)行注入,所以Spring Boot比Spring Framework優(yōu)秀"是一種錯(cuò)誤的理解。 - Spring Boot的核心優(yōu)勢(shì):自動(dòng)配置
什么是自動(dòng)配置?
自動(dòng)配置有什么用?好處和優(yōu)勢(shì)是什么? - IOC的意義
1)具體意義(實(shí)現(xiàn)):起到一個(gè)容器的功能,能夠?qū)⑽覀冃枰念惣尤氲饺萜髦校瑫r(shí)能夠在需要的時(shí)候?qū)㈩悓?duì)象注入進(jìn)指定的位置。
目的:
2)抽象意義:把控制權(quán)交給用戶
靈活地實(shí)現(xiàn)OCP