1. 程式人生 > >我的第一個SpringBoot 專案——Hello World

我的第一個SpringBoot 專案——Hello World

這裡寫圖片描述

首先,我們分析pom.xml

<?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>cn.pw</groupId> <artifactId>pf-web</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>pf-web</name> <description>Demo project for Spring Boot</description> <parent
>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties
>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

從dependencies中的內容,我們很容易找到了上一篇中,我們提到的兩個元件web 和 thymeleaf。從pom檔案的依賴配置中,我們發現全都一樣,具有相同的結構,都有字首“spring-boot-starter”。作為SpringBoot 四大神器之一的 starter,主要用於簡化依賴,我們再也不用為依賴的版本和maven地址而發愁,springBoot總會為我們匹配它認為最優秀的版本(雖然有時候可能並不是我們想要的),讓依賴的版本見鬼去吧,具有選擇恐慌症的夥伴們該樂壞了。另外,我們還可以自己定義一個starter, 這部分內容這裡暫時不作介紹。

其次,我們將重點放在 WebApplication.java 這個類上:

package cn.pw.pf.web;

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

@SpringBootApplication
public class WebApplication {

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

只有 簡簡單單的幾行程式碼,一個幾乎被我們忘掉 的main方法,沒錯就是它,main方法。大道至簡,回到了我們剛學習開發語言時的第一個程式碼——main方法,在這裡它依舊是專案啟動的入口,執行著最原始的使命。
和老革命的寒暄到此結束,我們進入重點,重點關注一下新同志@SpringBootApplication 這個註解:

檢視@SpringBootApplication的原始碼,我們發現它是由@SpringBootConfiguration 、@EnableAutoConfiguration和@ComponentScan由三個註解組合而成。

①@SpringBootConfiguration : 配置類,相當於 xml
②@EnableAutoConfiguration : 啟用spring自動裝配
③@ComponentScan : 和xml配置自動掃描效果一樣,預設掃描當前包和所有子包(所以,啟動類一定要放在最外層的包中)。

接下來,我們寫一個Controller,來訪問我們的Hello World!
就在cn.pw.pf.web下建立一個controller包,在寫一個HelloWorldController類。

package cn.pw.pf.web.controller;

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

/**
 * Hello World Controller
 * @Description:
 * @Author:libin
 * @Date: Created in 2017/11/9
 */
@RestController
@RequestMapping("/")
public class HelloWorldController {

    @GetMapping("/hello")
    public String helloWorld(){
        return "Hello World !";
    }
}

OK,我們HelloWorld!寫完了,啟動專案。直接在idea中執行WebApplication類的main()方法,注意觀察控制檯。

 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.8.RELEASE)

2017-11-09 23:35:35.779  INFO 25940 --- [           main] cn.pw.pf.web.WebApplication 
...//省略中間部分             
2017-11-09 23:36:04.967  INFO 25940 --- [nio-8080-exec-1] 
o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 29 ms

小知識:SpringBoot啟動時的banner 是可以 自定義的哦!有興趣的可以瞭解一下,換一個自己喜歡的banner

訪問 HelloWorld。在瀏覽器輸入 http://localhost:8080/hello 頁面上顯示出了我們想要的內容:Hello World !

專案打包執行。
我們使用maven 直接打包,在專案pom所在的目錄下,執行 mvn package ,打包 成功後,我們在target目錄下能找到 pf-web-0.0.1-SNAPSHOT.jar ,執行 java -jar pf-web-0.0.1-SNAPSHOT.jar。

是不是很簡單,不過小朋友就要問了,這是個web專案 ,web容器tomcat呢?

tomcat的問題好解釋,springBoot自己集成了tomcat的元件。

SpringBoot專案到底是如何啟動的呢?啟動流程是什麼呢?我們的老朋友main()方法到底做了什麼?
解壓pf-web-0.0.1-SNAPSHOT.jar,開啟META-INF 資料夾,用記事本開啟 MANIFEST.MF :

Manifest-Version: 1.0
Implementation-Title: pf-web
Implementation-Version: 0.0.1-SNAPSHOT
Archiver-Version: Plexus Archiver
Built-By: libin
Implementation-Vendor-Id: cn.pw
Spring-Boot-Version: 1.5.8.RELEASE
Implementation-Vendor: Pivotal Software, Inc.
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: cn.pw.pf.web.WebApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.5.0
Build-Jdk: 1.8.0_121
Implementation-URL: http://projects.spring.io/spring-boot/pf-web/

我們看到 Main-Class: org.springframework.boot.loader.JarLauncher和
Start-Class: cn.pw.pf.web.WebApplication

看來JarLauncher類才是springBoot啟動的入口,然後才執行的Start-Class。更加詳細的啟動原理和過程,我們在後面的高階篇裡探討。

下一章我們討論SpringBoot 配置檔案 application.yml (application.properties)