springboot學習(一)——helloworld

如下內容,若有問題,煩請指出,謝謝html

springboot出來也好久了,之前零散地學習了很多,不過很長時間了都沒有在實際中使用過了,忘了很多,所以要最近準備抽時間系統的學習積累下springboot,給本身留個根。java

由於之前學過一些,這裏就主要根據官方文檔來學習了,可能會根據本身的理解來選擇一些知識點的學習順序。官方文檔地址:https://docs.spring.io/spring...git

官方文檔有十個大章節,第一章是綜述,就不用太細看了,這裏直接從第二章開始,也是介紹hello world的地方。
一開始就介紹了spring的四個目標:github

  • 更快地開發spring程序
  • 提供默認配置,開箱即用
  • 提供大量插件(主要是各類starter)
  • 避免代碼生成以及xml配置

上面這四個也是普通spring程序的弊病,簡單來講就是入門門檻高了,spring的各類配置是很重要的,可是項目搭建後就不多管,而後新啓動一個項目又要花很長時間去配置,配置得仍是跟原來的差很少。web

系統要求就是jdk1.7/servlet3.0及以上,1.6版本如何使用能夠看很文檔後面的說明。官方內嵌支持三種servlet容器,最多見的tomcat,而後是jetty以及undertow(jboss默認的),tomcat是默認的,如何servlet容器替換後面會有內容講解。spring

第10小章是講解如何生成springboot的基礎項目,這個是給缺乏基礎的初學者看的,能夠不用太關注,若是想生成,能夠直接用https://start.spring.io/ 這個。數據庫

11小章開始正篇。
基礎的helloworld很簡單,先配置maven文件,強烈建議使用springboot提供的parent,不要本身一個個去單獨依賴,這個parent自己寫的比較好,能夠做爲不少項目的參考。若是你有必定的基礎,能夠不照着官方的started文檔的代碼來寫,自己這段代碼也比較少比較簡單。這裏我構造的項目結果以下,由於後續就主要用這個項目來學習springboot,所以就取名main,包名也儘可能作到規範
圖片描述apache

具體代碼以下
pom.xml瀏覽器

<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>pr.study.springboot</groupId>
  <artifactId>main</artifactId>
  <version>1.0.0</version>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.8.RELEASE</version>
  </parent>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

Main,javatomcat

package pr.study.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Main {

    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

HelloWorldController.class

package pr.study.springboot.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {

    @RequestMapping("/hello")
    public String hello() {
        return "hello world";
    }
}

幾點說明:
一、由於springboot-parent中的dependencies是使用dependencyManagement的形式,這種形式的依賴不會強制繼承,必須在子pom中顯式聲明纔會繼承,可是不用聲明版本,聲明瞭版本會提示一個warning。

二、繼承spring-boot-maven-plugin是爲了利用springboot的fat-jar打包功能,和dependency同樣,也是使用Management的形式,須要顯式聲明纔會依賴。

三、Main.class咱們編寫的代碼的啓動入口類,使用spring-boot-maven-plugin打包成jar並用java -jar啓動時,這個類並非真正應用程序入口類Main-Class。

四、官方的代碼中controller和main函數寫在一個類中,所以能夠不須要SpringBootApplication這個註解,寫在不一樣的類中就須要這個註解,不然掃描不到controller。經過源碼能夠知道@SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan,它具備ComponentScan的做用,所以不須要像spring程序那樣顯式指定包掃描.

五、@EnableAutoConfiguration,這個註解後面表明的一系列功能是springboot的核心之一,自動配置,這個註解解決了不少配置問題。他的基本原理就是經過你的maven依賴來猜出你須要注入那些bean,它會幫你啓動相關配置並注入這個bean。這裏咱們依賴了spring-boot-starter-web,它就會幫咱們開啓springmvc相關的配置並自動注入相關的必須的bean。由於會自動配置並注入,因此springboot程序的依賴管理很重要沒用的依賴儘可能都去掉,特別是那些數據庫相關的依賴。關於springboot的自動配置,這個是重點之一,後面細說。

六、@RestController = @Controller + @@ResponseBody,也是一個複合註解,減小代碼量,相似的還有@GetMapping、@PostMapping等等。

上面這六點,1-3能夠經過maven相關的知識更進一步瞭解,具體就是maven依賴管理以及maven打包,本人沒有系統的學習,知識簡單瞭解,因此這裏就不細說了。4-6在後續的springboot學習中會慢慢學習到。

運行程序能夠直接在Main上運行java application做爲普通java程序運行,這時候Main中的main函數就是真正的啓動函數。這裏是使用嵌入式tomcat做爲servlet容器來運行servlet程序,因此並不須要咱們部署到tomcat。
圖片描述

紅色標記的就是已經掃描到了並初始化成功了HelloWorldController。

打開瀏覽器請求 http://localhost:8080/hello 能夠看到運行結果
圖片描述

若是運行出現這種問題

The Bean Validation API is on the classpath but no implementation could be found

那麼請刪除下springboot相關的本地jar包,有時候jar包下載會抽風。自己springmvc裏面是依賴有hibernate-validator做爲參數校驗的(@Valid @Validated使用),是不該該出現這個問題的。

若是你想打包部署,由於引用了spring-boot-maven-plugin,因此直接運行 mvn clean package就能夠打包,最後打包的target是一個fat-jar,也就是包含了全部依賴的可運行jar包。
打包好後,在路徑下命令行輸入 java -jar main-1.0.0.jar 就能夠啓動
圖片描述

你能夠把 java -jar main-1.0.0.jar 寫到腳本文件sh or bat中,這樣就能夠做爲一個簡單的啓動腳本,而後和jar一塊兒發送到目標機器上,運行啓動腳本啓動程序,這樣就差很少就算是完成了一次簡單的springboot程序的部署發佈。

把這個打包好的jar解壓下,簡單看下結構
圖片描述

BOOT-INF是應用程序的主體,classes下面的就是咱們的寫的代碼,lib裏面的就是是咱們的程序依賴的jar包
META-INF是一些基礎數據,其中比較重要的就是MANIFEST.MF

Manifest-Version: 1.0
Implementation-Title: main
Implementation-Version: 1.0.0
Archiver-Version: Plexus Archiver
Built-By: pengrui
Implementation-Vendor-Id: pr.study.springboot
Spring-Boot-Version: 1.5.8.RELEASE
Implementation-Vendor: Pivotal Software, Inc.
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: pr.study.springboot.Main
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_111
Implementation-URL: http://projects.spring.io/spring-boot/main/

這個文件描述了jar的基本結構

  • Main-Class:經過java -jar 啓動時應用程序啓動的真正主類,java程序能夠有多個main函數,可是這個類中的main函數的第一個啓動的函數
  • Start-Class:咱們的springboot程序啓動的類,直接運行main方法時,這個類中的main函數最早運行,經過 java -jar 運行時,這個類中main並非最早運行的,只是從這個類開始,咱們的寫的那部分代碼纔開始運行
  • Spring-Boot-Classes:咱們寫的代碼存放的路徑
  • Spring-Boot-Lib:咱們的依賴包存放的路徑

關於JarLauncher以及org.springframework.boot.loader.*裏面的內容,我尚未研究過,這個後續再細說。

到這裏,一個簡單的springboot程序的編碼、本地測試運行、打包、啓動就都簡單過了一遍,後面再一個個補充豐滿。

代碼相關:
https://gitee.com/page12/stud...
https://github.com/page12/stu...

相關文章
相關標籤/搜索