Spring Boot 入門(1)

前言

Spring Boot是當下比較流行的一個框架,很多公司都在用Spring Boot,所以我下定決心花時間瞭解和學習Spring Boot 爲自己的技術做儲備。我會把自己學習過程都記錄下來,以便自己參考和幫助更多的人。
在這裏插入圖片描述

Spring Boot 概述

首先聲明,Spring Boot不是一門新技術,所以不用緊張。從本質上來說,Spring Boot就是Spring,它做了那些沒有它你也會去做的Spring Bean配置。它使用“習慣優於配置”(項目中存在大量的配置,此外還內置了一個習慣性的配置,讓你無需手動進行配置)的理念讓你的項目快速運行起來。使用Spring Boot很容易創建一個獨立運行(運行jar,內嵌Servlet容器)、準生產級別的基於Spring框架的項目,使用Spring Boot你可以不用或者只需要很少的Spring配置。

Build Anything with Spring Boot:Spring Boot is the starting point for building all Spring-based applications. Spring Boot is designed to get you up and running as quickly as possible, with minimal upfront configuration of Spring.

大概是說: Spring Boot 是所有基於 Spring 開發的項目的起點。Spring Boot 的設計是爲了讓你儘可能快的跑起來 Spring 應用程序並且儘可能減少你的配置文件。


什麼是Spring Boot?

  • Spring Boot是一個構建在Spring框架頂部的項目。它提供了一種更簡單、更快捷的方法來設置、配置和運行簡單和基於Web的應用程序。它並不是什麼新的框架,而是默認配置了很多框架的使用方式,就像 Maven 整合了所有的 jar 包一樣,Spring Boot 整合了所有框架

Spring Boot 的好處?

  • 使用 Spring Boot 來開發項目則只需要非常少的幾個配置就可以搭建起來一個 Web 項目,並且利用 IDEA 可以自動生成生成。

  • 劃重點 :簡單、快速、方便地搭建項目;對主流開發框架的無配置集成;極大提高了開發、部署效率。

Spring Boot 優點 ?

  • 快速創建獨立運行的Spring項目並與主流框架集成
  • 使用嵌入式Servlet容器,應用程序不需要在WAR中打包
  • starters自動依賴於版本控制
  • 大量自動配置,以簡化開發,也可修改默認值
  • 無需配置XML,無代碼生成,開箱即用
  • 準生產環境的運行時應用程序監視
  • 與雲計算的天然集成

Spring Boot 缺點?

既然有優點就必然優缺點,沒有十全十美的東西,Spring Boot 的缺點就是,入門容易,精通難,Spring Boot是基於Spring框架的在封裝,如果你對Spring的框架不很瞭解,那麼對Spring Boot的整個封裝機制也不會很瞭解。所以說Spring是Spring Boot 的基石。


寫一個Spring Boot案例

HelloWorld

要求:瀏覽器發送hello請求,服務器接受請求並處理,響應給瀏覽器Hello World字符串;

步驟:
  1. 創建一個Maven項目

  2. 導入Spring Boot的Jar或者依賴。

     <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <dependencies>
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
    </dependencies>
    
  3. 編寫一個主程序;啓動Spring Boot應用

    /**
     *  @SpringBootApplication 來標註一個主程序類,說明這是一個Spring Boot應用
     */
    @SpringBootApplication
    public class HelloSpringMainApplication {
    
        public static void main(String[] args) {
            //啓動Spring boot程序
            SpringApplication.run(HelloSpringMainApplication.class,args);
        }
    }
    
  4. 編寫相關的Controller、Service

    @Controller //表示控制
    public class HelloController {
        @ResponseBody
        @RequestMapping("/hello")
        public String hello(){
    
            return "hello word !";
        }
    }
    
  5. 運行主程序測試 效果:
    在這裏插入圖片描述

Hello Word 探究原理

解析Pom.xml文件

1. 父項目
 <parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.1.7.RELEASE</version>
	<relativePath/>
 </parent>

  • 我們可以看到一個比較陌生一些的標籤 <parent> ,這個標籤是在配置 Spring Boot 的父級依賴:
  • 它的父項目是:
 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.1.7.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
  </parent>
  • 作用:他來真正管理Spring Boot應用裏面的所有依賴版本;
  • Spring Boot的版本仲裁中心;
  • 以後我們導入依賴默認是不需要寫版本;(如果沒有在dependencies裏面管理的依賴自然需要聲明版本號)
2. 啓動器
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

spring-boot-starter - web

​ spring-boot-starter:spring-boot場景啓動器;幫我們導入了web模塊正常運行所依賴的組件;

Spring Boot將所有的功能場景都抽取出來,做成一個個的starters(啓動器),只需要在項目裏面引入這些starter相關場景的所有依賴都會導入進來。要用什麼功能就導入什麼場景的啓動器

應用入口類

/**
 *  @SpringBootApplication 來標註一個主程序類,說明這是一個Spring Boot應用
 */
@SpringBootApplication
public class HelloWorldMainApplication {

    public static void main(String[] args) {

        // Spring應用啓動起來
        SpringApplication.run(HelloWorldMainApplication.class,args);
    }
}

Spring Boot 項目通常有一個名爲 *Application 的入口類,入口類裏有一個 main 方法, 這個 main 方法其實就是一個標準的 Java 應用的入口方法。

@SpringBootApplication: Spring Boot應用標註在某個類上說明這個類是SpringBoot的主配置類,SpringBoot就應該運行這個類的main方法來啓動SpringBoot應用;

一、SpringBootApplication解析

按住鍵盤Ctrl 點擊 @SpringBootApplication 進入源碼分析

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
      @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
      @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

@SpringBootApplication 註解是Spring Boot的核心註解,它其實是一個組合註解:
雖然定義使用了多個Annotation(註解)進行了原信息標註,但實際上重要的只有三個Annotation(註解):

  • @Configuration(@SpringBootConfiguration點開查看發現裏面還是應用了@Configuration)
  • @EnableAutoConfiguration
  • @ComponentScan

也就是說:

@SpringBootApplication = (默認屬性)	@Configuration + @EnableAutoConfiguration + @ComponentScan

所以,如果我們使用如下的SpringBoot啓動類,整個SpringBoot應用依然可以與之前的啓動類功能對等:

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class HelloSpringMainApplication {

    public static void main(String[] args) {
        //啓動Spring boot程序
        SpringApplication.run(HelloSpringMainApplication.class,args);
    }
}

開發中寫一個@SpringBootApplication方便點。接下來分別 介紹這3個 註解

1、@Configuration

這裏的@Configuration對我們來說不陌生,它就是JavaConfig形式的Spring Ioc容器的配置類使用的那個@Configuration,SpringBoot社區推薦使用基於JavaConfig的配置形式,所以,這裏的啓動類標註了@Configuration之後,本身其實也是一個IoC容器的配置類。

  • (1)表達形式層面

    • 基於XML配置的方式是這樣:

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
             default-lazy-init="true">
          <!--bean定義-->
      </beans>
      
    • 而基於JavaConfig的配置方式是這樣:

      @Configuration
      public class MyConfiguration{
          //bean定義
      }
      

    任何一個標註了@Configuration的Java類定義都是一個JavaConfig 配置類。

  • (2)註冊bean定義層面

    • 基於XML的配置形式是這樣:
      <bean id="mockService" class="..MyServiceImpl">
         
      </bean>
      
    • 而基於JavaConfig的配置形式是這樣的:
      @Configuration
      public class MockConfiguration{
          @Bean
          public MyService MyService(){
              return new MockServiceImpl();
          }
      }
      

    任何一個標註了@Bean的方法,其返回值將作爲一個bean定義註冊到Spring的IoC容器,方法名將默認成該bean定義的id。

  • (3)表達依賴注入關係層面

    • 爲了表達bean與bean之間的依賴關係,在XML形式中一般是這樣:
      <bean id="mockService" class="..MockServiceImpl">
         <propery name ="dependencyService" ref="dependencyService" />
      </bean>
      <bean id="dependencyService" class="DependencyServiceImpl"></bean>
      
    • 而基於JavaConfig的配置形式是這樣的:
      @Configuration
      public class MockConfiguration{
          @Bean
          public MockService mockService(){
              return new MockServiceImpl(dependencyService());
          }
      
          @Bean
          public DependencyService dependencyService(){
              return new DependencyServiceImpl();
          }
      }
      

    如果一個bean的定義依賴其他bean,則直接調用對應的JavaConfig類中依賴bean的創建方法就可以了。

@Configuration:提到@Configuration就要提到他的搭檔@Bean。使用這兩個註解就可以創建一個簡單的spring配置類,可以用來替代相應的xml配置文件。
  • @Configuration的註解類標識這個類可以使用Spring IoC容器作爲bean定義的來源。

  • @Bean註解告訴Spring,一個帶有@Bean的註解方法將返回一個對象,該對象應該被註冊爲在Spring應用程序上下文中的bean。

2、@ComponentScan

@ComponentScan 的功能其實就是自動掃描並加載符合條件的組件(比如@Component和@Repository等)或者bean定義,最終將這些bean定義加載到IoC容器中。

3、@EnableAutoConfiguration

@EnableAutoConfiguration:開啓自動配置功能 ------------- 藉助@Import 支持,收集和註冊特定場景相關的bean定義。簡單來說: @EnableAutoConfiguration 將所有符合自動配置條件的bean定義加載到IoC容器。

@EnableAutoConfiguration會根據類路徑中的 Jar 依賴爲項目進行自動配置,
:添加了spring-boot-starter-web依賴,會自動添加Tomcat和Spring MVC的依賴,Spring Boot會對Tomcat和Spring MVC進行自動配置。

​以前我們需要配置的東西,Spring Boot幫我們自動配置;@EnableAutoConfiguration告訴SpringBoot開啓自動配置功能;這樣自動配置才能生效;

@EnableAutoConfiguration作爲一個複合Annotation,其自身定義關鍵信息如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
   ...
}

其中,最關鍵的要屬@Import(EnableAutoConfigurationImportSelector.class),藉助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可以幫助SpringBoot應用將所有符合條件的@Configuration配置都加載到當前SpringBoot創建並使用的IoC容器。

SpringFactoriesLoader 抽象類詳解

SpringFactoriesLoader屬於Spring框架私有的一種擴展方案,其主要功能就是從指定的配置文件META-INF/spring.factories加載配置。

小結

Spring Boot在啓動的時候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作爲自動配置類導入到容器中,自動配置類就生效,幫我們進行自動配置工作; 以前我們需要自己配置的東西,自動配置類都幫我們;


使用Spring Initializer快速創建Spring Boot項目

1、IDEA:使用 Spring Initializer快速創建項目

IDE都支持使用Spring的項目創建嚮導快速創建一個Spring Boot項目;
在這裏插入圖片描述

選擇我們需要的模塊;嚮導會聯網創建Spring Boot項目;
在這裏插入圖片描述

默認生成的Spring Boot項目結構:

  • 主程序已經生成了,只需要我們自己的邏輯
  • resources文件夾中目錄結構
    • static:保存所有的靜態資源; js css images;
    • templates:保存所有的模板頁面;(Spring Boot默認jar包使用嵌入式的Tomcat,默認不支持JSP頁面);可以使用模板引擎(freemarker、thymeleaf);
    • application.properties:Spring Boot應用的配置文件;可以修改一些默認設置;

我們來了解一下默認生成的有什麼:

  • xxxxxApplication: 一個帶有 main() 方法的類,用於啓動應用程序
  • xxxxxApplicationTests:一個空的 Junit 測試了,它加載了一個使用 Spring Boot 字典配置功能的 Spring 應用程序上下文
  • application.properties:一個空的 properties 文件,可以根據需要添加配置屬性
  • pom.xml: Maven 構建說明文件

總結

這一篇博文是入門篇,寫了案例 Hello Word 幫助我們理解,並且從Hello Word項目中探究和分析了一下Spring Boot 中的一些註解,和它的基本執行流程。後續會把自己學習Spring Boot 的知識點梳理記錄下來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章