Hello World 我們經歷了些什麼?

胖先森發表於2018-09-04

這章就是給自己一個簡單的分析過程,如果需要最好使用DeBug模式進行分析

Hello World 我們經歷了什麼?

1.POM檔案說明

通過pom.xml檔案我們發現我們需要配置一個parent標籤,該標籤就是找父專案使用的資源

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
複製程式碼

通過Ctrl+左鍵,找到對應父專案的pom.xml資訊

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
</parent>
複製程式碼

spring-boot-dependencies 是Spring Boot的版本仲裁中心,他來真正管理Spring Boot應用裡面的所有依賴版本:

<properties>
    <activemq.version>5.15.4</activemq.version>
    <antlr2.version>2.7.7</antlr2.version>
    <appengine-sdk.version>1.9.64</appengine-sdk.version>
    <artemis.version>2.4.0</artemis.version>
    <aspectj.version>1.8.13</aspectj.version>
    省略......
</properties>
複製程式碼

以後我們匯入依賴預設是不需要寫版本;(沒有在dependencies裡面管理的依賴自然需要宣告版本號)

2. 啟動器

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
複製程式碼

==spring-boot-starter-web==: spring-boot-starter:spring-boot場景啟動器;幫我們匯入了web模組正常執行所依賴的元件;

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

之後我們可以自定義starter,這是後面的知識點!

3. 主程式類,主入口類

package com.hanpang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
 *  @SpringBootApplication 來標註一個主程式類,說明這是一個Spring Boot應用
 */
@SpringBootApplication
public class Demo01Application {

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

複製程式碼

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

@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 {
複製程式碼

@SpringBootConfiguration: 標註在某個類上,表示這是一個Spring Boot的配置類;

繼續跟一下註解@SpringBootConfiguration

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {

}
複製程式碼

@Configuration:配置類上來標註這個註解;配置類 ----- 配置檔案;配置類也是容器中的一個元件;@Component

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

@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
複製程式碼

@AutoConfigurationPackage:自動配置包

@Import(AutoConfigurationPackages.Registrar.class):Spring的底層註解@Import,給容器中匯入一個元件;匯入的元件由AutoConfigurationPackages.Registrar.class;

重點:==將主配置類(@SpringBootApplication標註的類)的所在包及下面所有子包裡面的所有元件掃描到Spring容器;==

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

J2EE的整體整合解決方案和自動配置都在spring-boot-autoconfigure-2.0.4.RELEASE.jar

相關文章