1. 程式人生 > 資訊 >超 110 億美元!特斯拉 CEO 馬斯克:2021 年我個人納稅最多,美國國稅局是不是該“意思意思”?

超 110 億美元!特斯拉 CEO 馬斯克:2021 年我個人納稅最多,美國國稅局是不是該“意思意思”?

1、SpringBoot簡介

Spring Boot(英文中是“引導”的意思),是用來簡化Spring應用的搭建到開發的過程。應用開箱即用,只要通過 “just run”(可能是 java -jar 或 tomcat 或 maven外掛run 或 shell指令碼),就可以啟動專案。

  • 簡化了j2ee開發

  • 整合了spring技術棧(springmvc springweb)

  • 整合了 mybatis等

    Spring Boot將各個第三方框架 設定成一個個場景 Starter,會將場景所依賴的所有依賴自動載入注入。例如:選擇Web,會把tomcat\json\web-mvc\web 自動注入

父專案中匯入SpringBoot-starter,其中包括2.5版本對應的所有相關依賴包及版本號

1.1 依賴管理

<parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.5.0</version>
      <relativePath/> 
 </parent>

1、引入依賴預設都可以不寫版本
2、引入非版本仲裁的jar,要寫版本號
可以通過porm.xml中增加配置自定義版本號
1、檢視spring-boot-dependencies裡面規定當前依賴的版本 用的 key。
2、在當前專案裡面重寫配置

<properties>
    <mybatis-plus.version>3.4.1</mybatis-plus.version>
</properties>

1.2 自動配置

  • 自動配置好SpringMVC
    • 自動引入SpringMC所有元件
    • 自動配置好SpringMVC常用元件
  • 自動配置好Web常用元件
    • 配置好了常用元件(例如:字符集等)
  • 預設的包結構
    • 主程式所在包及其結構下方所有自包都會預設掃描載入
    • 想要改變掃描包可以通過以下兩種註解方式變更
1) @SpringBootApplication(scanBasePackages = "com.capinfo")
2) @ComponentScan(basePackages = "com.capinfo")
  • 各種預設配置值
    • 預設配置最終都對映到對應的配置類中,例如:ServerProperties,MutiPartProperties
    • 配置檔案的值最終會繫結到配置類上,這個類在容器中建立物件
  • 按需載入所有配置項
    • 所有的配置都在spring-boot-autoconfigure中##**
    • 引入了哪個場景才會載入相關配置項(Prom中引入Starter例如Starter-WEB)
    • 按照條件裝配規則,符合的才會裝備,@ConditionalOnClass(Advice.class)

1.3 自動配置原理

Springboot主配置類,實際會載入一套配置,三個配置項:

  • 1)@SpringBootConfiguration:
    包含@Configuration:加了此註解的類為配置配置類,會自動納入Spring容器(註解@Component、@Service等)

  • 2)@EnableAutoConfiguration:**
    實現自動配置,主要為其中的以下兩個註解

    • @AutoConfigurationPackage
        @Import(AutoConfigurationPackages.Registrar.class)//給容器中匯入Registrar元件
       
        //Registrar中給容器中匯入一系列元件
        //將Main中配置的包中所有元件匯入
        @Override
    	public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
    		register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
    	}
    
    • @Import(AutoConfigurationImportSelector.class)
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
    	if (!isEnabled(annotationMetadata)) {
    		return NO_IMPORTS;
    	}
    	AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);//載入所有元件入口
    	return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
    }
    

    具體內部實現順序
    1、getAutoConfigurationEntry(annotationMetadata);給容器中載入元件
    2、List configurations = getCandidateConfigurations(annotationMetadata, attributes);獲取所有需要匯入的包
    3、Map<String, List> loadSpringFactories(ClassLoader classLoader) {
    getBeanClassLoader());//工廠載入
    4、可以查詢到最終是從中META-INF/spring.factories中載入
    - 預設掃描當前系統中所有依賴包中META-INF/spring.factories檔案
    - org.springframework.boot.autoconfigure:2.5.0中EnableAutoConfiguration為spring所有配置包

  • 3)@ComponentScan: 指定要掃描哪些包

SpringBoot實踐

1、引入依賴

引入場景依賴org.springframework.boot
[官方文件](https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.

2、檢視自動配置

自己分析,引入場景對應的自動配置一般都生效了
配置檔案debug=true,可看到開啟配置報告Negative(未生效)、Positive(生效)
xxxxProperties綁定了配置檔案的哪些。
自定義加入或者替換元件
@Bean、@Component…
自定義器 XXXXXCustomizer;

3、是否需要修改

參照官方文件配置 配置官方文件build-systems.starters)
自定義加入或者替換元件

4、自定義元件

1)Lombok

Lombok用標籤方式代替構造器、getter/setter、toString()等雞肋程式碼。
簡化javabean開發,會在編譯時生成相關程式碼,保持程式碼整潔
1)引入依賴

	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
	</dependency>

2)安裝lombok外掛
IDEA中File->Settings->Plugins,搜尋安裝Lombok外掛。

3)註解
@AllArgsConstructor //生成有參建構函式
@NoArgsConstructor //生成無參建構函式
@Data //生成get,set方法
@ToString //生成ToString方法
@Slf4j //注入日誌 log.info直接使用

2) dev-tools 自動載入功能

1)引入依賴

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-devtools</artifactId>
	<optional>true</optional>
</dependency>

2)程式碼變更後只需要Build就可以看到結果,相當於重新啟動專案,靜態頁面開發時不重啟就能看到效果了

3) 配置提示

自定義的類和配置檔案繫結一般沒有提示。新增此依賴增加提示

//依賴關係配置
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

4) 打包配置

 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-configuration-processor</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>