1. 程式人生 > >SpringBoot 為什麼能夠自動的注入一些常用的Bean ?詳細分析SpringBoot 自動配置的實現

SpringBoot 為什麼能夠自動的注入一些常用的Bean ?詳細分析SpringBoot 自動配置的實現

有一個問題一直讓我好奇,為什麼在SpringBoot中有的bean 我們都沒有配置卻能夠自動注入,這個比如說我們使用JdbcTemplate 的時候那個物件明明我們都沒有配置但是卻能獲取到。再比如SpringBoot在結合Redis的時候,我們也沒有注入redisTemplate的bean結果卻能使用@Autowired 獲取到具體的物件值。這一切究竟是怎麼實現的??? @Autowired private StringRedisTemplate stringRedisTemplate;帶著這個問題我們檢查了一下啟動類,發現了這個極為重要的註解:@SpringBootApplication這個註解實際上是一個組合註解:
我們發現這裡面有一個註解:@EnableAutoConfiguration看看這個註解的定義:
我們發現這裡使用@Import註解匯入了一個類:AutoConfigurationImportSelector這個類的程式碼很多,但是有這樣一個顯眼的方法:
顯然這就是選擇匯入一些自動配置的bean。注意到這個類是位於org.springframework.boot.autoconfigure; 包下,由此可見這個類就是我們自動配置實現的關鍵。事實上,spring-boot-autoconfigure-版本號.jar 裡就有一個spring.factories檔案,這個檔案中聲明瞭有哪些要自動配置的類。該檔案的大致內容如下:

可以發現這裡面定義的類,名字大多都是以****AutoConfiguration 為主,在Spring的自動配置開啟之後,會自動的去讀取這些該檔案的內容,從而進行對每一個類自動配置。
我們設定springBoot的開發模式為debug之後,在應用啟動之後就會發現控制檯有這樣的輸出:
這就說明在SpringBoot 正在按照spring.factories檔案 中定義的各種類 進行判斷和自動配置了。我們隨手開啟一個RedisAutoConfigration的原始碼:
發現這裡的內容很簡單,就是使用@Configuration 來聲明瞭一個配置,然後使用了條件判斷,意思是要是沒有名字redisTemplate 的bean 那就立刻新建一個bean。所以我們整合redis的時候匯入依賴之後就可以直接使用@AutoWired來完成bean的注入了。最後我們還可以發現在上面的 RedisAutoConfigration 類中 還有一個這樣的註解:@EnableConfigurationProperties(RedisProperties.class)
我們把RedisProperties 這個類開啟一看:
原來 SpringBoot 整合Redis中的各種預設配置全部在這了.................同時,這裡還告訴我們如果要在application.properties 中自定義配置 只要設定字首為 spring.redis 即可。最後,注意下,如果我們要加入的元件不是在上面的自動配置列表之內,往往springBoot 會要求我們新增 @Enable*** 之類的註解, 實際上這些註解背後也是匯入了一個類,然後註冊了一個bean 。比如典型的:@EnableScheduling 註解,他的定義是這樣的:
開啟SchedulingConfiguration 一看:

果然一切都很顯然。。。。。