Spring Boot 學習筆記1---初體驗之3分鍾啟動你的Web應用


 

前言

早在去年就簡單的使用了一下Spring Boot,當時就被其便捷的功能所震驚。但是那是也沒有深入的研究,隨着其在業界被應用的越來越廣泛,因此決定好好地深入學習一下,將自己的學習心得在此記錄,本文主要圍繞以下幾點進行說明:

  • Spring Boot 簡介
  • 使用Spring Boot快速搭建一個Web應用
    如有不對的地方,請指正。

1. Spring Boot簡介

Spring Boot是一個基於Spring的衍生框架,其主要的目的是幫助我們快速構建獨立、生產級別的Spring的應用,其崇尚的理念是“約定優於配置”。
其主要有如下的特點:

  1. 創建一個單獨的Spring應用
  2. 內置Web容器(默認使用Tomcat,如果你想換成Jetty只需簡單修改配置即可),以Java Application的方式就可以完成Web應用的啟動。
  3. 提供了大量maven模版配置(通常被稱為Starter POMs),通過使用其提供的maven配置,它將我們日常開發所使用到的依賴都集成了,因此可以大大減少我們對於maven的pom文件的配置的工作量。
  4. 自動化地對Spring進行配置,它可以根據你當前classpath路徑下的jar包來推斷出你當前的運行環境,自動的幫助我們創建出一些應該用必須使用的對象,並且根據對應的環境以其對應的方式進行啟動。
  5. 提供了生產環境下的一些特性:如指標統計、健康檢查。
  6. 無需冗余的代碼與XML配置。
  7. 提供了現成的maven插件,可以更加方便地使用maven進行打包。

2. Spring Boot初體驗

在簡單了解完Spring Boot之后,下面讓我們快速地使用Spring Boot搭建一個Web應用,來快速地感受一下Spring Boot其強大的功能。

2.1 快速搭建一個Web應用

引入的maven依賴:

    <!-- 這里使用官方最新的版本,官方推薦建議繼承默認的springboot配置 繼承后,項目的編譯級別會自動變為jdk1.6版本。 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.3.RELEASE</version> </parent> <!-- 添加一個web應用所需要的依賴,它會自動引入tomcat內置容器、log4j、jackson等通用的依賴 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>

我們可以通過mvn dependency:tree來查看項目的依賴結構樹


項目的依賴結構樹


編寫一個簡單的Controller

package com.panlingxiao.springboot.web.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * RestController是Spring 4.0推出的新特性, * 使用其標注表示當前類為一個@Controller,並且 * 使用@RequestMapping所標注的方法的返回值默認會被認為使用 * 了@ResponseBody進行標注,因此不再使用視圖解析的方式進行處理, * 而是將內容通過HTTP響應體返回給客戶端。 */ @RestController public class HelloController { /** * spring boot會自動讀取application.properties, * 並且將其作為系統參數進行注入,用戶也可以在啟動應用的時候 * 通過-Dname=xxx來手動注入,手動注入會覆蓋配置文件中的參數 * 如果沒有指定值,那么name的默認值就是World。 */ @Value("${name:World}") private String name; /** * 由於使用了@RestControlelr,因此無需在使用@ResponseBody來標注返回的結果 */ @RequestMapping("/hello") public String sayHello(){ return String.format("hello:%s", name); } }

編寫Spring Boot的啟動類

package com.panlingxiao.springboot.web; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class WebApp{ public static void main(String[] args) { SpringApplication.run(WebApp.class, args); } }

至此,我們的Web應用已經搭建完畢,只需啟動WebApp即可。啟動應用之后,會輸出如下的信息。


啟動日志.png

在瀏覽器中請求所返回的結果如下:


響應結果.png

這個Hello World的例子雖然簡單,但是我們應該能夠看到Spring Boot的強大之處。我們無需再在web.xml中編寫DispatcherServlet,無需再寫對應的Spring配置文件,無需再去找對應的maven依賴等,這一切的一切只需幾個簡單的注解就搞定一切了。

2.2 在命令行下啟動應用

我們除了可以通過在IDE中啟動Spring Boot應用的啟動,Spring Boot官方還提供了另外一個種方式,可以讓我們在命令行下完成應用的啟動。
通過輸入mvn spring-boot run


命令行啟動結果.png

2.3 創建一個可運行的jar

以上命令行的方式雖然可以完成了Web應用的啟動,但是其啟動依賴於maven。我們在部署應用到服務器的時候,通常不會在服務器上去單獨的安裝maven,而只是希望它能夠以單獨的一個JAR包的形式啟動。在此之前,如果我們希望一個服務單獨地打成一個JAR包來運行的經歷,那么我需要通過在POM文件中引入大量的插件,比如資源文件拷貝、將項目依賴的JAR單獨地創建一個目錄、生成運行的主程序等等,這一系列操作都需要基於Maven的插件來完成。而現在,Spring Boot為我們提供了一個打包執行的JAR的插件,我們只需引入,然后使用mvn clean package就可以搞定一切了。
在原來的POM文件中加入如下內容:

<build> <plugins> <plugin> <!-- Spring Boot提供的打包插件,會自動生成運行的類, 同時將項目依賴的JAR一起和JAR包綁定在一切輸出。 --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>

打包輸出結果.png

MENIFEST結果.png


現在我們就可以通過java -jar xxx.jar來完成一個Web的啟動。


以Java Application方式啟動結果.png

2.4 簡單理解Spring Boot的Hello World

上面的程序雖然簡單,但是我們並沒有分析為什么使用這么幾行代碼就可以一個Web應用的啟動,如果不理解原因,個人感覺一切都是白搭,因為你只是知道如何做,而不是知道為什么這么做。下面就來簡單的分析一下我們所編寫的WebApp這個類為什么它就可以被完成一個Web應用的啟動。

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

首先我們看到該類使用了@SpringBootApplication這個注解來進行標識。該注解其實又是由其他3個注解來標識,它們分別是@Configuration、@EnableAutoConfiguration、@ComponentScan。


SpringBootApplication源碼.png

(1). @Configuration:其作用是標識當前類是一個Bean定義信息的來源,它可以被Spring的ApplicationContext進行加載處理;其作用等同於我們之前使用的xml文件,只是我們以前將Bean的定義配置在xml中,而現在是將Bean的定義全部基於代碼寫在了使用@Configuration所標識的這個類中。
下面我們通過一個例子更加清楚地說明@Configuration的作用。

public class User { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }

通過@Configuration標識的類,可以完成對Bean信息的定義:

/** * 使用@Configuration標識 * 在當前類中通過@Bean標注的方式 * 之后都由Spring的AppplicationContext來進行調用 * 從而生成Bean對象。 */ @Configuration public class AppConfig { @Bean public User getUser(){ User user = new User(); return user; } }
public class App { public static void main(String[] args) { /* * 將@Configuraion所標識的類通過Spring的上下問進行加載,從而實現Bean的創建。 */ AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(AppConfig.class); ctx.refresh(); User user = ctx.getBean("user", User.class); String value = user.sayHello(); } }

通過上面的例子,我們應該可以看到@Configuration與xml幾乎是一個等價的關系,其作用如出一轍,在我們上面的例子中,其實WebApp這個類可以不使用@Configuration來標准,也不會影響程序的正常啟動。

(2). @EnableAutoConfiguration:該注解是讓Spring根據當前classpath中所存在的類,自動推斷出當前運行的環境(判斷是否一個Web應用還是一個普通的Java應用),然后根據具體的環境去創建對應的bean,將其添加的Spring的ApplicationContext中。比如:我們在classpath中添加了tomcat-embedded.jar,因此它會去自動幫助我們自動地創建一個EmbeddedServletContainerFactory。如果沒有這個對象,那么我們的Tomcat是無法啟動的。我們將WebApp改成如下結果:

//不再設置EnableAutoConfiguration會導致應用啟動失敗 @Configuration @ComponentScan public class WebApp { public static void main(String[] args) { SpringApplication.run(WebApp.class, args); } }

缺少EnableAutoConfiguration啟動結果.png


從上面的分析結果我們可以,@EnableAutoConfiguration對應配置Spring Boot應用非常重要,如果缺少這個注解,就非常可能由於缺少需要的Bean而導致應用的啟動失敗。

(3). @ComponentScan:該注解就是讓Spring容器自動根據指定的包以及子包中進行組件的查找然后創建,如果沒有指定具體到哪個包中進行查找,那么就以當前使用該注解的類所在的包作為查找的根,進行查找。即在WebApp這個類所在的包及其子包中進行查找。注意:這里我將HelloController定義在了WebApp所在的包的子包中,如果它們所在的包不具有上面所描述的查找關系,那么Controller是不會被創建的,即使應用可以啟動,但是最終響應的結果將是404。

我們在main方法中使用了SpringApplication這個類完成了應用的啟動,該類是一個Spring應用啟動的引導工具類,它底層維護着Spring容器。由於篇幅有限,SpingApplication具體引導的過程不再這里細說,我會在后面的筆記中記錄分析SpringApplication的具體如何完成Spring容器的創建、如何完成Web應用的啟動。

2.5 補充

SpringBoot除了提供強大的功能外,官方還提供了非常人性化的支持,我們可以訪問https://start.spring.io/ ,在該網站上根據我們應用的特點,自動其對應的生成spring boot的模版文件。

至此,Spring Boot的入門筆記就先寫到這里,下一節會去分析SpringApplication這個神奇的東西,看看它到底是如何工作的。


免責聲明!

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



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