第一篇:構建第一個SpringBoot工程


SpringBoot 是為了簡化 Spring 應用的創建、運行、調試、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規范,引入相關的依賴就可以輕易的搭建出一個 WEB 工程

未接觸 SpringBoot 之前,搭建一個普通的 WEB 工程往往需要花費30分鍾左右,如果遇到點奇葩的問題耽擱的時間會更長一點,但自從用了SpringBoot 后,真正體會到什么叫分分鍾搭建一個WEB,讓我擁有更多的時間跟我的小伙伴們嘮嗑了。使用 SpringBoot 后發現一切是如此的簡單(還記得讀書那會被JAR包,xml支配的恐懼嗎,如今都可以說 good bye

設計的目標

  • 為所有使用 Spring 的開發者提供一個更簡單,快速的入門體驗
  • 提供一些常見的功能、如監控、WEB容器,健康,安全等功能
  • 干掉XML,遵循規范,開箱即用

前提

SpringBoot 為我們提供了一系列的依賴包,所以需要構建工具的支持:MavenGradle。由於本人更習慣使用Maven所以后續案例都是基於MavenIntelliJ IDEA,同時這里是基於最新的SpringBoot2編寫的哦...

創建項目

初次接觸,我們先來看看如何創建一個Spring Boot項目,這里以IntelliJ IDEA為例,其他的IDE工具小伙伴們自行搜索創建方式。創建完項目后,各位小伙伴請認真、細心的對比下與傳統的WEB工程有何區別(如:目錄結構)。

點擊File -> Project

如果用過 Eclipse/IDEA 等工具的,對創建項目肯定不會陌生,但為了照顧第一次使用的我貼上了圖文

第一步

 

選擇Spring Initializr

到這一步選擇的時候,如圖中選項的是Spring Initializr(官方的構建插件,需要聯網),第二個是自己選擇Maven構建,為了更好的適合初學者,我們將在本章用插件構建

第二步

 

填寫項目基本信息

  • Group: 組織ID,一般分為多個段,這里我只說兩段,第一段為域,第二段為公司名稱。域又分為 org、com、cn等等,其中 org為非營利組織,com為商業組織。如阿里、淘寶(com.alibaba/com.taobao)
  • Artifact: 唯一標識符,一般是項目名稱

第三步

 

選擇包

Spring Initializr 為我們提供了很多的選項,不同的選項有不同的作用,在初期我們只需要依賴Web -> Web 就可以了,選擇好依賴包之后點擊Next -> Finish

第四步

 

目錄結果

目錄結果

- src
    -main
        -java
            -package
                #主函數,啟動類,運行它如果運行了 Tomcat、Jetty、Undertow 等容器
                -SpringbootApplication    
        -resouces
            #存放靜態資源 js/css/images 等
            - statics
            #存放 html 模板文件
            - templates
            #主要的配置文件,SpringBoot啟動時候會自動加載application.yml/application.properties        
            - application.yml
    #測試文件存放目錄        
    -test
 # pom.xml 文件是Maven構建的基礎,里面包含了我們所依賴JAR和Plugin的信息
- pom

pom.xml 依賴

因為使用了 Spring Initializr 插件,所以如下的配置都不需要我們自己去寫啦,需要注意的是版本要選擇 RELEASE ,穩定版本BUG少

<?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>com.battcn</groupId>
    <artifactId>chapter1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>chapter1</name>
    <description>我的用第一個SpringBoot工程</description>

    <!--版本采用的是最新的 2.0.1.RELEASE TODO 開發中請記得版本一定要選擇 RELEASE 哦 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.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>
        <!-- 默認就內嵌了Tomcat 容器,如需要更換容器也極其簡單-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 測試包,當我們使用 mvn package 的時候該包並不會被打入,因為它的生命周期只在 test 之內-->
        <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>

其它的依賴可以參考:官方文檔

主函數入口

注意事項: 一個項目中切記不要出現多個 main 函數,否在在打包的時候 spring-boot-maven-plugin 將找不到主函數(主動指定打包主函數入口除外…

/**
 * 我的第一個SpringBoot程序
 * 其中 @RestController 等同於 (@Controller 與 @ResponseBody)
 *
 * @author Levin
 */
@RestController
@SpringBootApplication
public class Chapter1Application {

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

    @GetMapping("/demo1")
    public String demo1() {
        return "Hello battcn";
    }

    @Bean
    public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
        // 目的是
        return args -> {
            System.out.println("來看看 SpringBoot 默認為我們提供的 Bean:");
            String[] beanNames = ctx.getBeanDefinitionNames();
            Arrays.sort(beanNames);
            Arrays.stream(beanNames).forEach(System.out::println);
        };
    }
}

初窺配置文件

從啟動日志中可以發現,SpringBoot 默認的端口是 8080 ,那么如果端口被占用了怎么辦呢?不要慌,問題不大,配置文件分分鍾解決你的困擾…

2018-04-20 16:14:46.725  INFO 11184 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''

修改默認配置

# 默認的 8080 我們將它改成 9090 
server.port=9090
# 未定義上下文路徑之前 地址是 http://localhost:8080 定義了后 http://localhost:9090 你能在tomcat做的事情,配置文件都可以
server.servlet.context-path=/chapter1

在啟動一次看看日志

2018-04-20 16:47:05.716  INFO 12108 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 9090 (http) with context path '/chapter1'

測試

本次測試采用 junit 進行,當然也可以啟動項目后直接訪問 http://localhost:9090/chapter/demo1 進行測試

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;

import java.net.URL;

import static org.junit.Assert.assertEquals;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class Chapter1ApplicationTests {


    @LocalServerPort
    private int port;

    private URL base;

    @Autowired
    private TestRestTemplate template;

    @Before
    public void setUp() throws Exception {
        // TODO 因為我們修改了 content-path 所以請求后面要帶上
        this.base = new URL("http://localhost:" + port + "/chapter1/demo1");
    }

    @Test
    public void demo1() throws Exception {
        ResponseEntity<String> response = template.getForEntity(base.toString(), String.class);
        assertEquals(response.getBody(), "Hello battcn");
    }
}

拓展知識

自定義Banner

SpringBoot 啟動的時候我們可以看到如下內容,這一塊其實是可以自定義的哦,而且在 2.X 版本中,它支持的格式從文本擴展到banner.txt、banner.jpg、banner.gif、banner.jpeg 等等,只需要在 resouces 目錄下添加指定命名的文件即可

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

總結

目前很多大佬都寫過關於 SpringBoot 的教程了,如有雷同,請多多包涵,本教程基於最新的 spring-boot-starter-parent:2.0.1.RELEASE編寫,包括新版本的特性都會一起介紹…


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM