我的第一個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)