目錄
一,背景
二,知識回顧
2.1 理解使用反射技術,讀取配置文件創建目標對象(成員變量,方法,構造方法等)
三,springboot自動配置
3.1 反射在自動配置中的工作流程
3.2 瀏覽源碼,逐步瀏覽spring boot自動配置
?四,?理解 starter?
4.1 自定義starter?
一,背景
一直以來,我們在完成spring boot項目中,一直遵循 固定的模式:
1,向pom文件引入依賴(starter)
2 ,使用依賴 的注解
3 ,觀察引入的注解,是否報錯,如果沒有報錯,編譯運行觀察結果
4 如果報錯結合 自己所學知識+Ai輔助
至于這個注解,是怎么生效的,何時起作用,我們并沒有關注,但實際上spring boot已經幫我們做好了。
今天,我就要和大家一起,深挖在spring boot 中,我們使用的注解 是怎么起作用的?----------------spring boot自動配置
二,知識回顧
在學習spring boot自動配置 之前,我們先要復習以下:通過配置文件動態創建對象
2.1 理解使用反射技術,讀取配置文件創建目標對象(成員變量,方法,構造方法等)
配置文件+反射技術 應用場景:
實際開發中,當我們項目部署到服務器,一般情況下,不允許重新部署,但我們想要開發新的功能,可以使用配置文件+反射相結合完成新功能的添加與修改。
案例
背景:原本創建 🐺,🐏 對象實現動物接口,并在測試類中運行方法。但在運行后,才發現:還沒有創建 狼對象,于是使用反射+配置文件讀取的方式,實現對狼的創建
util工具類 :讀取 配置文件內容
package com.it.heima;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class util {public static String readProperties() {Properties properties = new Properties();String path = null;try(// 獲取配置文件流InputStream resourceAsStream = test.class.getClassLoader().getResourceAsStream("data.properties")){properties.load(resourceAsStream);path = properties.getProperty("wolf");
// System.out.println(path);} catch (IOException e) {e.printStackTrace();}return path;}
}
data.properties配置文件
test測試類
package com.it.heima;import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;public class test {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {Sheep sheep = new Sheep();sheep.run();sheep.eat();sheep.sleep();System.out.println("--------------------------");String path = util.readProperties();Wolf wolf = (Wolf)Class.forName(path).newInstance();wolf.run();wolf.eat();}
}
測試結果:
綿羊跑跑~~~~~~~~
綿羊吃吃~~~~~~~~
綿羊睡覺~~~~~~~~
--------------------------
com.it.heima.Wolf
狼跑~~~~~~~~~~~
狼吃羊~~~~~~~
"上面這個案例展示了反射的基本用法 —— 通過配置文件動態創建對象。而 Spring Boot 的自動配置,本質上就是把這個過程標準化、規模化:框架通過反射讀取類路徑、注解和配置文件,自動為我們創建和配置各種 Bean,這就是我們接下來要深入探討的內容。"
三,springboot自動配置
3.1 反射在自動配置中的工作流程
1,類路徑掃描:Spring Boot 會掃描類路徑下的所有類,找出帶有特定注解的類。@compoentscan注解
2,條件評估:通過反射檢查類、方法或者字段的存在情況,以此確定是否應用某項配置。@Condition衍生注解+@Bean
3,實例化 Bean:利用反射調用構造函數或者工廠方法來創建 Bean 實例。
4,依賴注入:借助反射設置 Bean 的字段值或者調用 setter 方法。
案例
@Configuration
@ConditionalOnClass(RestTemplate.class) // 反射檢查類是否存在
@EnableConfigurationProperties(MyAutoConfigProperties.class)
public class MyAutoConfiguration {
private final MyAutoConfigProperties properties;public MyAutoConfiguration(MyAutoConfigProperties properties) {this.properties = properties;
}@Bean
@ConditionalOnMissingBean // 反射檢查Bean是否已存在
public RestTemplate restTemplate() {RestTemplate template = new RestTemplate();// 基于配置屬性進行定制if (properties.isLoggingEnabled()) {template.getInterceptors().add(new LoggingInterceptor());}return template;
}
3.2 瀏覽源碼,逐步瀏覽spring boot自動配置
這里,我將拿web起步依賴舉例:
以下圖片是我截取 來自博客鏈接 :學習springboot 的自動配置原理_spring-boot-autoconfigure-CSDN博客
核心:看到 selectImport方法
11進入DispatcherServletAutoConfiguration 自動配置類
關于條件注解的詳情可以瀏覽 :學習springboot-條件化配置@Conditional(條件注解)_springboot條件化配置-CSDN博客
?四,?理解 starter?
starter:一組功能模塊的坐標,當我們引用坐標時,可以使用它提供的功能
starter本質:接口+接口實現類/接口實現類?
4.1 自定義starter?
可以結合:springboot學習(自定義starter)_springboot3.4.3 引入 定義 springboot starter-CSDN博客