1. 程式人生 > 實用技巧 >SpringBoot入門(一)——HelloWorld、配置、日誌

SpringBoot入門(一)——HelloWorld、配置、日誌

iwehdio的部落格園:https://www.cnblogs.com/iwehdio/

1、SpringBoot入門

  • SpringBoot:通過整合整個Spring的技術棧,快速簡單的建立產品級應用,簡化Spring應用開發,約定大於配置。

  • 優點:

    • 快速建立獨立執行的Spring專案及主流框架整合。
    • 使用嵌入式的Servlet容器,應用無序打成WAR包。
    • starters自動依賴與版本控制。
    • 大量的自動配置,簡化開發,也可以修改預設值。
    • 無需配置xml,無程式碼生成。
  • 微服務:

    • 與之前的單體應用相對應,將每個功能單一獨立出來。
    • 是一種架構風格,提倡開發應用時應是一組小型服務的集合。
    • 這些小型服務都被放在獨立的服務中,可以通過HTTP通訊。
    • 每個服務都是可獨立替換可獨立升級的軟體單元。
  • HelloWorld:

    • 瀏覽器傳送一個hello請求,伺服器接收請求並處理,響應Hello World字串。

    • 建立一個maven工程並且匯入依賴:

      <parent>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-parent</artifactId>
          <version>1.5.9.RELEASE</version>
      </parent>
      
      <dependencies>
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
      </dependencies>
      
    • 編寫一個主程式,啟動SpringBoot應用:

      /*
          標註一個主程式類,表示這是一個SpringBoot應用
       */
      @SpringBootApplication
      public class HelloWorldMainApplication {
      
          public static void main(String[] args) {
              SpringApplication.run(HelloWorldMainApplication.class, args);
          }
      }
      
    • 編寫相關的業務邏輯:

      @Controller
      public class HelloController {
      
          @ResponseBody
          @RequestMapping("/hello")
          public String hello() {
              return "Hello World";
          }
      }
      
    • 啟動主程式,在瀏覽器就可以訪問/hello了。

    • 簡化部署:

      • 匯入maven外掛:

        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
        
      • 在maven側邊欄中執行package命令進行打包,專案被打包在target目錄下。

  • HelloWorld探究:

    • pom.xml下:

      • 父專案:
        • spring-boot-starter-parent的父專案是spring-boot-dependencies,它真正亂來的SpringBoot應用中的所有依賴版本,是SPringBoot的版本仲裁中心。
        • 在這個版本仲裁中心中管理的依賴,之後再匯入不需要寫版本。
      • 匯入的依賴:
        • spring-boot-starter-web:spring-boot-starter是SpringBoot場景啟動器。幫我們匯入了web模型正常執行所需要的模組。
        • SpringBoot將所有的功能場景抽取出來,做成starts(啟動器),引入starts,相關場景的依賴就會全部匯入進來。
    • 主程式類(主入口類):

      • @SpringBootApplication註解:標註在某個類上,說明這個類是SpringBoot的主配置類,SpringBoot就應該啟動這個類的main方法來啟動SpringBoot應用。

        @Target({ElementType.TYPE})
        @Retention(RetentionPolicy.RUNTIME)
        @Documented
        @Inherited
        @SpringBootConfiguration	//表示這個是一個SpringBoot的配置類(類似於之前的配置檔案),配置類也是容器內的一個元件
        @EnableAutoConfiguration	//開啟自動配置功能
        @ComponentScan(
            excludeFilters = {@Filter(
            type = FilterType.CUSTOM,
            classes = {TypeExcludeFilter.class}
        ), @Filter(
            type = FilterType.CUSTOM,
            classes = {AutoConfigurationExcludeFilter.class}
        )}
        )
        public @interface SpringBootApplication {
        
  • 使用嚮導建立SpringBoot應用:

    • Spring Initializer:SpringBoot建立嚮導。

    • 首先,在IDEA的外掛中使SpringBoot外掛為可用。

    • 使用Spring Initializer建立工程,選用模組只使用web下的springweb。

    • 這樣主程式就生成好了,只需要編寫業務邏輯。

      @RestController
      public class HelloController {
          @RequestMapping("/hello")
          public String hello() {
              return "hello world quick";
          }
      }
      
      • @RestController相當於@Controller@ResponseBody。
    • resources資料夾中的目錄結構:

      • static:儲存所有的靜態資源。
      • templates:儲存了所有的模板頁面。
      • application.properties:SpringBoot應用的配置檔案,可以修改預設設定。

2、SpringBoot配置

  • 配置檔案:

    • 預設使用兩種配置檔案application.properties或application.yaml。

      • yaml:是一種標記語言,以資料為中心。
      • 基本語法:
        • 表示鍵值對:key: value,冒號後必須有個空格。
        • 以空格的縮排來控制層級關係,左對齊的一列資料都是同一層級的。
        • 屬性和值是大小寫敏感的。
        • 不需要寫分號。
      • 值的寫法:
        • 字面量(數字、字串、布林),字串不用加引號。如果用的話,雙引號內特殊字元會轉義,單引號內特殊字元原樣顯示。
        • 鍵值對:在下一行縮排寫鍵值對。行內寫法是用大括號括起來。
        • 陣列:- value表示陣列中的一個元素。行內寫法用中括號括起來,不用寫 - 。
    • 配置檔案的作用:修改SpringBoot自動配置的預設值。

    • SpringBoot單元測試,在測試類上加註解:

      @RunWith(SpringRunner.class)
      @SpringBootTest
      
    • 將yaml中的配置對映到實體類:在實體類上加註解@ConfigurationProperties(perfix="person"),配置和那個屬性下一一對應。並且加入容器中。

      • 需要匯入:配置檔案處理器spring-boot-configuration-processor。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        
      • 也可以直接在Javabean的屬性上加@Value,用${}獲取配置檔案中的值。無法獲取複雜型別,比如map、list。

    • 在實體類上加@Validated,屬性上加入具體校驗規則可以進行資料校驗。

    • @PropertySource()註解:載入指定的配置檔案。

    • @ImportResource(locations={})註解:匯入Spring的配置檔案。

    • 配置檔案佔位符,${}

  • SpringBoot推薦給容器中新增元件的方式:全註解。

    • 建立配置類,加上@Configuration註解。
    • 在方法上添加註解@Bean,容器中的預設id為方法名。
  • Profile:

    • 多Profile檔案實現多環境支援,檔名可以是application-{profile}.properties。

    • 啟用指定的profile:預設配置檔案中指定,spring.profiles.active={profile}。

    • yaml支援多文件塊:

      • 用三個-分為多文件塊。

      • 為每個文件塊設定屬性並激活:

        spring:
        	profiles: 
        		active: prod
        ---
        spring:
        	profiles: prod
        
    • 也可以使用指定的命令列引數或虛擬機器引數進行啟用。

  • 配置路徑的載入位置:優先順序從高到低。

    • file:./config/
    • file:./
    • classpath:/config/
    • classpath:/
    • 高優先順序的配置會覆蓋低優先順序的配置,配置檔案會全部載入,可以進行互補配置。
    • 專案打包好後,可以使用命令列引數,使用spring.config.location來設定配置檔案位置。
  • SpringBoot外部配置的載入順序(從高到低):

    1. 命令列引數。
    2. jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置檔案。
    3. jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置檔案。
    4. jar包外部的application.properties或application.yml(不帶spring.profile)配置檔案。
    5. jar包內部的application.properties或application.yml(不帶spring.profile)配置檔案。
  • 自動配置原理:

    • SpringBoot啟動時,載入主配置類,開啟了自動配置功能@EnableAutoConfiguration

    • @EnableAutoConfiguration利用selector為容器中匯入元件。

    • 將jar包類路徑下 META-INF/spring.factories裡所有配置的EnableAutoConfiguration.class的值加入到容器中。

    • 每一個自動配置類進行自動配置功能。

    • 以HttpEncodingAutoConfiguration(Http編碼自動配置)為例解釋自動配置原理:

      @Configuration   //表示這是一個配置類,以前編寫的配置檔案一樣,也可以給容器中新增元件
      @EnableConfigurationProperties(HttpEncodingProperties.class)  //啟動指定類的ConfigurationProperties功能;將配置檔案中對應的值和HttpEncodingProperties繫結起來;並把HttpEncodingProperties加入到ioc容器中
      
      @ConditionalOnWebApplication //Spring底層@Conditional註解,根據不同的條件,如果滿足指定的條件,整個配置類裡面的配置就會生效;    判斷當前應用是否是web應用,如果是,當前配置類生效
      
      @ConditionalOnClass(CharacterEncodingFilter.class)  //判斷當前專案有沒有這個類CharacterEncodingFilter;SpringMVC中進行亂碼解決的過濾器;
      
      @ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)  //判斷配置檔案中是否存在某個配置  spring.http.encoding.enabled;如果不存在,判斷也是成立的
      //即使我們配置檔案中不配置pring.http.encoding.enabled=true,也是預設生效的;
      public class HttpEncodingAutoConfiguration {
        
        	//他已經和SpringBoot的配置檔案映射了
        	private final HttpEncodingProperties properties;
        
         //只有一個有參構造器的情況下,引數的值就會從容器中拿
        	public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
      		this.properties = properties;
      	}
        
          @Bean   //給容器中新增一個元件,這個元件的某些值需要從properties中獲取
      	@ConditionalOnMissingBean(CharacterEncodingFilter.class) //判斷容器沒有這個元件?
      	public CharacterEncodingFilter characterEncodingFilter() {
      		CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
      		filter.setEncoding(this.properties.getCharset().name());
      		filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
      		filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
      		return filter;
      	}
      }
      
    • 一旦這個配置類生效,這個配置類就會給容器中新增各種元件。這些元件的屬性是從對應的properties類中獲取的,這些類裡面的每一個屬性又是和配置檔案繫結的。

  • SpringBoot的精髓:

    ​ 1)、SpringBoot啟動會載入大量的自動配置類

    ​ 2)、我們看我們需要的功能有沒有SpringBoot預設寫好的自動配置類;

    ​ 3)、我們再來看這個自動配置類中到底配置了哪些元件;(只要我們要用的元件有,我們就不需要再來配置了)

    ​ 4)、給容器中自動配置類新增元件的時候,會從properties類中獲取某些屬性。我們就可以在配置檔案中指定這些屬性的值;

    • xxxxAutoConfigurartion:自動配置類,給容器中新增元件。
    • xxxxProperties:封裝配置檔案中相關屬性。
  • @Conditional註解判斷:

    • 指定一個條件判斷類,指定的條件成立,才給容器中新增元件,配置的內容才生效。
    • 派生了許多註解,用於判斷各種情況,比如容器中是否有這個bean。
    • 這些註解使得自動配置類在一定的條件下才會生效。
  • 自動配置報告:

    • 在配置檔案中啟用debug=true,在控制檯列印自動配置報告,就知道那些自動配置類生效了。

3、日誌

  • SpringBoot選用SLF4j日誌門面和logback日誌實現。

  • 如何使用SLF4j:

    • 開發時日誌記錄日誌的呼叫,不能直接呼叫日誌的實現類,而是呼叫日誌抽象層的方法。
    • 配置檔案還是做成日誌實現框架的配置檔案。
    • 讓日誌框架都統一到SLF4j,使用中間包和適配層包。
  • SpringBoot日誌關係:

    • SpringBoot使用Spring-boot-starter-loggin進行日誌記錄。
    • 底層使用logback記錄日誌。
    • 使用中間包,把其他日誌框架轉為SLF4j。
    • 在此之前需要排除其他日誌框架。
  • SpringBoot中使用日誌:

    • 生成日誌記錄器並進行日誌記錄:

      Logger logger = LoggerFactory.getLogger(getClass());
      //日誌級別由低到高
      logger.trace();
      logger.debug();
      logger.info();
      logger.warn();
      logger.error();
      
    • 可以調整日誌的級別,日誌就只會在這個級別及以上生效。

    • 在配置檔案中設定日誌級別,SpringBoot預設info級別:

      logger.level.包名=日誌級別
      logging.file=日誌記錄的位置
      logging.path=日誌記錄的資料夾
      logging.pattern.console=控制檯輸出的日誌格式
      logging.pattern.file=檔案中輸出的日誌格式
      

iwehdio的部落格園:https://www.cnblogs.com/iwehdio/