JAVA-SpringBoot

2019年12月16日更新

  1. 新建類后,要用@controller注解聲明將該類通過(guò)springboot進(jìn)行統(tǒng)一controller管理。
  2. 通過(guò)@getmapper('')注解聲明一個(gè)函數(shù)為路由函數(shù),將路由地址傳入,在瀏覽器通過(guò)localhost:8080(默認(rèn))路徑進(jìn)行訪問(wèn)。
  3. 直接通過(guò)return返回?cái)?shù)據(jù)的話是無(wú)效的,需要將其封裝在ServletResponse中,通過(guò)實(shí)例化ServletResponse,調(diào)用getWriter().write()方法將數(shù)據(jù)寫(xiě)入。
  4. 可以直接通過(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字符串。
  5. 測(cè)試方式:⑴ POSTman. ⑵ 單元測(cè)試
  6. 一般文本的header是text/plain,而object的header是application/json
  7. 熱重啟配置:
    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

  1. 常用注解

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ě)。

  1. url路由地址需要有自解釋性。一般建議格式為

host:port/version/resource/function

(版本號(hào)一般可以寫(xiě)在url中間,也可以通過(guò)header指定,也可以通過(guò)?version查詢參數(shù)指定)

  1. 所有軟件的復(fù)雜性,都是為了代碼的可維護(hù)性。
  2. 軟件工程中的一些關(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)生的。
  3. 實(shí)現(xiàn)開(kāi)閉原則,最基本的準(zhǔn)則就是面向抽象編程(interface,abstract),這樣三大特性之一的多態(tài)性才能得到實(shí)現(xiàn)。
  4. oic/di出現(xiàn)的過(guò)程:
    interface==>設(shè)計(jì)模式中的工廠模式==>ioc/di
  5. 單純的interface接口無(wú)法實(shí)現(xiàn)對(duì)象實(shí)例化的統(tǒng)一,只能夠完成方法調(diào)用的統(tǒng)一。
  6. 面向?qū)ο笾饕褪峭瓿蓪?duì)象實(shí)例化和方法調(diào)用兩件事情。
  7. 只有一段代碼中沒(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)移到其他地方的代碼片段中去。
  8. 工程模式:簡(jiǎn)單工廠模式、普通工廠模式、抽象工廠模式。

2019年12月20日更新

  1. 代碼中總會(huì)存在不穩(wěn)定。需要隔離不穩(wěn)定的代碼片段,保證其他代碼是穩(wěn)定的。是需要把變化隔離封裝起來(lái)的。
  2. 由于使用簡(jiǎn)單工程模式時(shí),在代碼中還是需要實(shí)例化工廠或使用工廠的靜態(tài)方法,依然存在不穩(wěn)定性,因此可以使用抽象工廠。但是一般來(lái)說(shuō)不需要再引入抽象工廠模式,使用簡(jiǎn)單工廠即可,因?yàn)榉€(wěn)定性總是相對(duì)的,不存在完全的穩(wěn)定。
  3. 變化是導(dǎo)致不穩(wěn)定的原因。變化包括用戶輸入、用戶操作、軟件的技術(shù)選擇、業(yè)務(wù)需求的更改等。隔離不穩(wěn)定其實(shí)就是在隔離變化。
  4. 工廠模式下需要通過(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
  1. <?>表示的是一個(gè)元類。類是對(duì)象的抽象,元類是對(duì)類的描述。
  2. 使用上述方法(工廠模式+反射機(jī)制),解決了代碼的穩(wěn)定性問(wèn)題。但是這依然是正向思維只是解決了OCP的問(wèn)題,并沒(méi)有應(yīng)用到控制反轉(zhuǎn)依賴注入思想。
  3. 配置文件是屬于外部文件,不是系統(tǒng)內(nèi)部文件(即可以理解為用戶的輸入)。因此改動(dòng)配置文件并不是違反OCP原則。

2020年01月05日更新

  1. 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的模塊。
  2. 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ò)誤的理解。
  3. Spring Boot的核心優(yōu)勢(shì):自動(dòng)配置
    什么是自動(dòng)配置?
    自動(dòng)配置有什么用?好處和優(yōu)勢(shì)是什么?
  4. IOC的意義

1)具體意義(實(shí)現(xiàn)):起到一個(gè)容器的功能,能夠?qū)⑽覀冃枰念惣尤氲饺萜髦校瑫r(shí)能夠在需要的時(shí)候?qū)㈩悓?duì)象注入進(jìn)指定的位置。
目的:
2)抽象意義:把控制權(quán)交給用戶
靈活地實(shí)現(xiàn)OCP

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容