天天看點

深入SpringBoot(一):快速入門1.Spring Boot是什麼2.為什麼要使用Spring Boot3.工具準備4.快速上手

《深入Spring Boot》第一篇快速入門,本篇主要包含以下5部分内容:

1.Spring Boot是什麼;

2.為什麼要使用Spring Boot;

3.工具準備;

4.快速上手;

5.代碼解析。

1.Spring Boot是什麼

Spring Boot是Spring大家庭的成員,它是一個全新的架構。它的設計目的是盡可能簡單和快速的開發、運作Spring應用程式,簡化配置。

2.為什麼要使用Spring Boot

在使用Spring架構進行開發的過程中,需要配置很多Spring架構包的依賴,如spring-core、spring-bean、spring-context等,而這些配置通常都是重複添加的,而且需要做很多架構使用及環境參數的重複配置,如開啟注解、配置日志等。Spring Boot緻力于弱化這些不必要的操作,提供預設配置,當然這些預設配置是可以按需修改的,快速搭建、開發和運作Spring應用。

3.工具準備

在進行快速上手之前,準備開發工具。

本文内容是基于Spring Boot最新穩定版1.5.10,要安裝JDK7或更高版本;

依賴管理的建構工具,可以安裝Ant、Maven或Gradle,本文使用Maven;

代碼編輯工具推薦使用IntelliJ IDEA。

4.快速上手

下面使用Spring Boot編寫一個Web應用,編寫完成後并運作。

1.在IDEA中建立項目,直接上圖。

深入SpringBoot(一):快速入門1.Spring Boot是什麼2.為什麼要使用Spring Boot3.工具準備4.快速上手
深入SpringBoot(一):快速入門1.Spring Boot是什麼2.為什麼要使用Spring Boot3.工具準備4.快速上手
深入SpringBoot(一):快速入門1.Spring Boot是什麼2.為什麼要使用Spring Boot3.工具準備4.快速上手

2.下圖是建立好的項目目錄結構。

深入SpringBoot(一):快速入門1.Spring Boot是什麼2.為什麼要使用Spring Boot3.工具準備4.快速上手

3.打開pom.xml,添加web應用需要的依賴配置,配置如下。

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.10.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
           

添加後的pom.xml如圖。

深入SpringBoot(一):快速入門1.Spring Boot是什麼2.為什麼要使用Spring Boot3.工具準備4.快速上手

4.使用mvn package指令或IDEA自帶的可視化工具加載依賴,本文使用IDEA自帶的可視化工具,輕按兩下package立即執行依賴加載。

深入SpringBoot(一):快速入門1.Spring Boot是什麼2.為什麼要使用Spring Boot3.工具準備4.快速上手

5.在java目錄下建立Example類,編寫代碼,具體代碼如下。

import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
public class Example {
    @RequestMapping("/")
    String home() {
        return "Hello World!";
    }
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Example.class, args);
    }
} 
           
深入SpringBoot(一):快速入門1.Spring Boot是什麼2.為什麼要使用Spring Boot3.工具準備4.快速上手

6.直接執行Example類中的main方法啟動應用,應用啟動時會使用内嵌的Tomcat伺服器,同時使用預設8080端口對外提供服務。成功啟動後會輸出如下圖的日志資訊。

深入SpringBoot(一):快速入門1.Spring Boot是什麼2.為什麼要使用Spring Boot3.工具準備4.快速上手

7.打開浏覽器通路http://localhost:8080/,頁面會顯示Hello World!。

至此,一個簡單的Web應用就編寫完成并可以提供服務。

代碼解析

首先是pom.xml中的配置,繼承spring-boot-starter-parent是快速使用Spring Boot的一種方式,也可以選擇不繼承。Spring Boot中的Starter是一個包含很多依賴描述的集合,隻要添加一個Starter,這個Starter裡面約定的依賴都會被添加到項目中,例如示例代碼添加了spring-boot-starter-web,執行maven操作會下載下傳web應用需要的依賴jar,如下圖。

深入SpringBoot(一):快速入門1.Spring Boot是什麼2.為什麼要使用Spring Boot3.工具準備4.快速上手

示例代碼中使用了@RestController、@RequestMapping、@EnableAutoConfiguration和SpringApplication,其中@RestController和@RequestMapping是SpringMVC中的注解,@EnableAutoConfiguration和SpringApplication是Spring Boot中的。

@EnableAutoConfiguration注解從字面上了解是開啟自動配置,有注解就有對應的處理類,先看一下這個注解的定義。

深入SpringBoot(一):快速入門1.Spring Boot是什麼2.為什麼要使用Spring Boot3.工具準備4.快速上手

這個注解有兩個屬性,exclude用于标記哪些類不需要被自動配置,excludeName也用于标記哪些類不需要被自動配置,隻不過它存的是類的名稱。從上圖的紅框中可以看到在@EnableAutoConfiguration注解的定義中使用了@Import注解,@Import注解是在Spring3.0添加的,使用@Import導入EnableAutoConfigurationImportSelector.class,作用等同于在Spring的xml檔案中使用導入,檢視EnableAutoConfigurationImportSelector源碼你會發現它就是用于處理@EnableAutoConfiguration注解的,不過在Spring Boot1.5版本開始被标記為棄用,可以使用AutoConfigurationImportSelector代替,也就是它的父類。

深入SpringBoot(一):快速入門1.Spring Boot是什麼2.為什麼要使用Spring Boot3.工具準備4.快速上手

進入AutoConfigurationImportSelector類中,重要的方法是selectImports。

深入SpringBoot(一):快速入門1.Spring Boot是什麼2.為什麼要使用Spring Boot3.工具準備4.快速上手

執行AnnotationAttributes attributes = getAttributes(annotationMetadata)可以擷取@EnableAutoConfiguration注解中exclude和excludeName屬性值,然後把值封裝在AnnotationAttributes中。

執行List configurations = getCandidateConfigurations(annotationMetadata,attributes),将在classpath下jar包中META-INF目錄下搜尋spring.factories檔案,然後在spring.factories檔案中查找以org.springframework.boot.autoconfigure.EnableAutoConfiguration為key的值,這個值是一個清單,清單如下圖。

深入SpringBoot(一):快速入門1.Spring Boot是什麼2.為什麼要使用Spring Boot3.工具準備4.快速上手

接着就是使用exclude和excludeName屬性值排除掉不需要自動配置的類,需要自動化配置的類會被執行,例如AopAutoConfiguration會自動配置Aop相關配置,使用JDK代理還是CGLIB代理。

到這裡,自動配置還沒完成,有一個問題還沒弄明白,就是AutoConfigurationImportSelector類的selectImports方法是在哪裡被觸發的?解決這個問題可以通過斷點調試或IDEA裡的查找調用來擷取調用方,無論哪種方式都可以發現是ConfigurationClassParser類的parse方法間接調用的,在parse方法中完成了需要自動配置類的初始化,進而完成一些預設的配置。那這個parse方法又是在哪被觸發調用的?同樣可以通過上面的任意方法,查找到是ConfigurationClassPostProcessor類的postProcessBeanFactory方法中調用的,而這個ConfigurationClassPostProcessor實作了BeanDefinitionRegistryPostProcessor接口,而BeanDefinitionRegistryPostProcessor繼承了BeanFactoryPostProcessor接口,熟悉Spring原理的都知道BeanFactoryPostProcessor接口中的postProcessBeanFactory方法會在Spring容器加載bean的定義檔案之後,在bean執行個體化之前執行,而這一步是由SpringApplication的run方法觸發的,在這個run方法中實作了Spring容器的啟動及初始化。

繼續閱讀