后端框架技術(shù)學(xué)習(xí)筆記

2020/3/8

認(rèn)識(shí)SpringBoot

SpringBoot的優(yōu)點(diǎn)

  • 創(chuàng)建獨(dú)立的Spring應(yīng)用程序
  • 嵌入TomCat,無需部署WAR文件
  • 無代碼生成,無xml配置要求

StringBoot 的 Hello World

pom文件依賴配置

<?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>

    <groupId>org.example</groupId>
    <artifactId>com.first</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--    spring Boot 依賴-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
    </parent>

    <!--    web場(chǎng)景依賴啟動(dòng)器,引入springMVC的相關(guān)依賴-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>
  • spring-boot-starter-parent作用

它提供依賴管理(類比Android的話窃蹋,作用類似于ben-manes.versions插件鳄哭?破镰?)引入之后来破,聲明其管理范圍內(nèi)的依賴時(shí)不在需要填版本了

  • spring-boot-starter-web作用

    • spring-boot-starter-web:

    默認(rèn)使用嵌套式的TomCat作為Web容器對(duì)開開發(fā)HTTP服務(wù)

    • spring-boot-starter:

    SpringBoot場(chǎng)景啟動(dòng)器,幫我們導(dǎo)入了web模塊支出運(yùn)行的組件

Spring Boot將所有的功能場(chǎng)景都抽取出來货岭,做成一個(gè)個(gè)的starters(啟動(dòng)器)路操,只需要在項(xiàng)目里面 引入這些starter相關(guān)場(chǎng)景的所有依賴都會(huì)導(dǎo)入進(jìn)來。要用什么功能就導(dǎo)入什么場(chǎng)景的啟動(dòng)器

Application&Controller

//Application
/**標(biāo)記為主程序啟動(dòng)類**/
@SpringBootApplication
public class ManualChaptApplication {
  public static void main(String[] args) {
    SpringApplication.run(ManualChaptApplication.class);
  }
}
/**
 *Controller
 * 該注解為組合注解
 * @ResponseBody+Controller
 */
@RestController
public class HelloController {

  /**
   *GetMapping:相當(dāng)于@RequestMapping(value=”/hello“千贯,RequestMethod.Get)
   */
  @GetMapping("/hello")
  public String hello() {
    return "hello World";
  }
}

注解的意思:

  • @SpringBootApplication:
    標(biāo)注在某個(gè)類上屯仗,說明此類為SpringBoot的主配置類,SpringBoot運(yùn)行此類的Main方法來啟動(dòng)StringBoot應(yīng)用搔谴,會(huì)將主配置類(@SpringBootApplication標(biāo)注的類)的所在包及下面所有子包里面的所有組件掃描到 Spring容器魁袜;
  • @RestController
    此注解為組合注解,意味著這個(gè)controller上的所有方法上都加了@ResponseBody

單元測(cè)試

@SpringBootTest  
class DemoApplicationTests {

  @Autowired
  private HelloController helloController;


  @Test
  void contextLoads() {
    String hello = helloController.hello();
    System.out.println("print:  " + hello);
  }
}

注解的意思:

  • @SpringBootTest:
    標(biāo)記springBoot單元測(cè)試敦第,并加載項(xiàng)目的applicationContext的上下文環(huán)境
  • @Autowired
    它可以對(duì)類成員變量峰弹、方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動(dòng)裝配的工作芜果。

SpringBoot執(zhí)行流程

  1. 開始
  2. 初始化Spring Application的實(shí)例
    • 判斷當(dāng)前項(xiàng)目的類型
    • 應(yīng)用的初始化設(shè)置
    • 應(yīng)用的監(jiān)聽設(shè)置
    • 設(shè)置項(xiàng)目的啟動(dòng)類
  3. 初始化Spring Boot項(xiàng)目的啟動(dòng)
    • 獲取并運(yùn)行監(jiān)聽器
    • 準(zhǔn)備項(xiàng)目運(yùn)行環(huán)境
    • 應(yīng)用上下文裝配
    • 啟動(dòng)上下文
    • 運(yùn)行自定義執(zhí)行器
    • 持續(xù)運(yùn)行上下文
  4. 結(jié)束

2020/3/9

使用kotlin的注意事項(xiàng)

  • 因?yàn)榈讓訂栴}鞠呈,所以部分類型的聲明需要注意對(duì)Java的兼容
@JvmOverloads
    @GetMapping("/spica")
    fun spica() = "spica 27"

   @GetMapping("/spica/{name}")
    fun spica(
            @PathVariable(name = "name")
            name: String? = "spica") = "<h1>name=${name.toString()}</h1>"

以下是今天碰見的問題:
- 重寫方法加@JvmOverloads注解
- 類型聲明要加?允許為null,如上直接使用String類型會(huì)報(bào)java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics

單元測(cè)試·JUnit4與JUnit 5對(duì)比

常用注解及其作用對(duì)比:

JUnit4 JUnit5 說明
@Test @Test 表示該方法是一個(gè)測(cè)試方法右钾。JUnit5與JUnit 4的@Test注解不同的是蚁吝,它沒有聲明任何屬性旱爆,因?yàn)镴Unit Jupiter中的測(cè)試擴(kuò)展是基于它們自己的專用注解來完成的。這樣的方法會(huì)被繼承灭将,除非它們被覆蓋
@BeforeClass @BeforeAll 表示使用了該注解的方法應(yīng)該在當(dāng)前類中所有使用了@Test @RepeatedTest疼鸟、@ParameterizedTest或者@TestFactory注解的方法之前 執(zhí)行;
@AfterClass @AfterAll 表示使用了該注解的方法應(yīng)該在當(dāng)前類中所有使用了@Test庙曙、@RepeatedTest、@ParameterizedTest或者@TestFactory注解的方法之后執(zhí)行浩淘;
@Before @BeforeEach 表示使用了該注解的方法應(yīng)該在當(dāng)前類中每一個(gè)使用了@Test捌朴、@RepeatedTest、@ParameterizedTest或者@TestFactory注解的方法之前 執(zhí)行
@After @AfterEach 表示使用了該注解的方法應(yīng)該在當(dāng)前類中每一個(gè)使用了@Test张抄、@RepeatedTest砂蔽、@ParameterizedTest或者@TestFactory注解的方法之后 執(zhí)行
@Ignore @Disabled 用于禁用一個(gè)測(cè)試類或測(cè)試方法
@Category @Tag 用于聲明過濾測(cè)試的tags,該注解可以用在方法或類上署惯;類似于TesgNG的測(cè)試組或JUnit 4的分類左驾。
@Parameters @ParameterizedTest 表示該方法是一個(gè)參數(shù)化測(cè)試
@RunWith @ExtendWith @Runwith就是放在測(cè)試類名之前,用來確定這個(gè)類怎么運(yùn)行的
@Rule @ExtendWith Rule是一組實(shí)現(xiàn)了TestRule接口的共享類极谊,提供了驗(yàn)證诡右、監(jiān)視TestCase和外部資源管理等能力
@ClassRule @ExtendWith @ClassRule用于測(cè)試類中的靜態(tài)變量,必須是TestRule接口的實(shí)例轻猖,且訪問修飾符必須為public帆吻。

Maven的格式

  • 依賴配置
    • groupId:標(biāo)識(shí)符
    • artifactId :?jiǎn)为?dú)的項(xiàng)目標(biāo)識(shí)符
    • version:版本號(hào)
    • scope:任務(wù)的類路徑及其如何限制依賴關(guān)系的傳遞性
    • exclusions:包含一個(gè)或多個(gè)排除元素,每個(gè)排除元素都包含一個(gè)表示要排除的依賴關(guān)系的 groupId 和 artifactId咙边。與可選項(xiàng)不同猜煮,可能或可能不會(huì)安裝和使用,排除主動(dòng)從依賴關(guān)系樹中刪除自己败许。
 <dependencies>
      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.0</version>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    ...
  </dependencies>
  • build配置
    • plugins 插件
      • plugin
        • extensions:是否加載此插件的擴(kuò)展名王带。
        • dependencies :插件本身需要的依賴
<build>
    <plugins>
<plugin>
            <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <executions>
                    <execution>
                        <id>compile</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>testCompile</id>
                        <phase>test-compile</phase>
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            ... ...
    </plugins>
  </build>

配置文件

  • properties
  • yaml
  1. 基本格式要求:
    1. YAML大小寫敏感;
    2. 使用縮進(jìn)代表層級(jí)關(guān)系
    3. 縮進(jìn)只能使用空格市殷,不能使用TAB愕撰,不要求空格個(gè)數(shù),只需要相同層級(jí)左對(duì)齊(一般2個(gè)或4個(gè)空格)
  2. 值的寫法
    1. 普通的值:k:v
    2. 對(duì)象被丧,Map:鍵值對(duì)
      1. k: v:在下一行寫對(duì)象的屬性和值的關(guān)系盟戏;注意縮進(jìn)
      2. 行內(nèi)寫法
man:    
      name: jelly           
      age: 20 
man: {name: jelly,age: 18}

,
3. 數(shù)組(List Set)
一個(gè)短橫代表一個(gè)數(shù)組項(xiàng)

people:
  - chengkeyu
  - zhaoqian
  - guzhaoyuan
  - yangweizhi

行內(nèi)寫法

people:[chengkeyu,zhaoqian,guzhaoyuan,yangweizhi]

隨機(jī)值的使用

${random.value}

隨機(jī)生成一個(gè)32位的字符串,如:b21d56d2f10d74f84608dfff01b25552

${random.int}

隨機(jī)生成一個(gè)int范圍的隨機(jī)數(shù)甥桂,如:-386223791

${random.long}

隨機(jī)生成一個(gè)long范圍的隨機(jī)數(shù)柿究,如:2404587442488649534

${random.int(10)}

隨機(jī)生一個(gè)[0,10]之間的隨機(jī)數(shù),如:8

${random.int[1024,65536]}

隨機(jī)生成一個(gè)[1024,65536]之間的隨機(jī)數(shù)黄选,如:63856

${user.userName}

獲取配置文件中已經(jīng)配置好的屬性值蝇摸,不存在時(shí)直接返回整個(gè)“${user.userName}”

${user.width:hello}

獲取配置文件中已經(jīng)配置好的屬性值婶肩,不存在時(shí)則用"hello"返回


示例

user:
  lastName: hello
  age: 18
  boss: false
  birth: 2017/12/12
  maps: {qq: 1000 , mobile: 13811002233}
  lists: []
  dog:
    name: jelly
    age: 18

address: 上海${random.value}
person.last-name=hello${user.lastName}

person.age=${random.int}

person.birth=2017/12/15

person.boss=false

person.maps.aa=v1

person.maps.bb=14

person.lists=a,b,c

person.dog.name=${person.hello:hello}_dog

person.dog.age=15

指定bean對(duì)象(Java)

//  指定配置文件
@PropertySource(value = {"classpath:application.yaml"})
//放入容器
@Component
//綁定
@ConfigurationProperties(prefix = "user")
public class User {

private String lastName;

private Integer age;

private Boolean boss;

private Date birth;

private Map<String, Object> maps;

private List<Object> lists;

private Dog dog;

get...
seting..
}

指定bean對(duì)象(Kotlin)

@PropertySource(value = ["classpath:application.yaml"])
@Component
@ConfigurationProperties(prefix = "user")
class User {
    var lastName: String? = null
    var age: Int? = null
    var isBoss = false
    var birth: Date? = null
    var maps: Map<String, Any>? = null
    var lists: List<Any>? = null
    var dog: Dog? = null
}

需要注意注解格式變化和添加?允許為空

Profile環(huán)境切換

多profile

我們?cè)谥髋渲梦募帉懙臅r(shí)候貌夕,文件名可以是 application-{profile}.properties/yml 默認(rèn)使用application.properties的配置律歼;
例如:
application-dev.properties:開發(fā)環(huán)境 application-test.properties:測(cè)試環(huán)境 application-prod.properties:生產(chǎn)環(huán)境

激活指定profile

  1. 在配置文件中指定 spring.profiles.active=dev
  2. 命令行: java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;可以直接在測(cè)試的時(shí)候啡专,配置傳入命令行參數(shù)
  3. 虛擬機(jī)參數(shù)险毁; -Dspring.profiles.active=dev

2020/2/15

Bean:在計(jì)算機(jī)英語中有可重用組件的意思
JavaBean>=實(shí)體類
JavaBean:用java語言編寫的可重用組件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市们童,隨后出現(xiàn)的幾起案子畔况,更是在濱河造成了極大的恐慌,老刑警劉巖慧库,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跷跪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡齐板,警方通過查閱死者的電腦和手機(jī)吵瞻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甘磨,“玉大人橡羞,你說我怎么就攤上這事】淼担” “怎么了尉姨?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吗冤。 經(jīng)常有香客問我又厉,道長(zhǎng),這世上最難降的妖魔是什么椎瘟? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任覆致,我火速辦了婚禮,結(jié)果婚禮上肺蔚,老公的妹妹穿的比我還像新娘煌妈。我一直安慰自己,他們只是感情好宣羊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布璧诵。 她就那樣靜靜地躺著,像睡著了一般仇冯。 火紅的嫁衣襯著肌膚如雪之宿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天苛坚,我揣著相機(jī)與錄音比被,去河邊找鬼色难。 笑死,一個(gè)胖子當(dāng)著我的面吹牛等缀,可吹牛的內(nèi)容都是我干的枷莉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼尺迂,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼笤妙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起噪裕,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤危喉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后州疾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡皇拣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年严蓖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氧急。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颗胡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吩坝,到底是詐尸還是另有隱情毒姨,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布钉寝,位于F島的核電站弧呐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嵌纲。R本人自食惡果不足惜俘枫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逮走。 院中可真熱鬧鸠蚪,春花似錦、人聲如沸师溅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽墓臭。三九已至蘸鲸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間起便,已是汗流浹背棚贾。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工窖维, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人妙痹。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓铸史,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親怯伊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子琳轿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容