在解析原理之前,我們不妨先來嘗試下如何自己製作一個屬於自己的簡易starter (本文假設你是有一定經驗的開發者)
環境準備
maven導入如下,其他略
<code><parent> <groupid>org.springframework.boot/<groupid> <artifactid>spring-boot-starter-parent/<artifactid> <version>2.1.3.RELEASE/<version>/<parent>/<code>
ps:官方建議命名略過
代碼準備
準備一個相當簡單的類,不用拘於代碼;若需要進行深度擴展,請參考Import或者Configuration註解進行導入更多類.此項目我們僅僅自動注入CustomStarter類.
是的,你沒看錯,就是自動注入一個類,一個類,一個類...
<code>package com.wspublic class CustomStarter { public int add(int a, int b) { return a + b; }}/<code>
配置文件準備
在resource目錄下創建目錄META-INF,並在META-INF下創建名為spirng.factories的文件,
效果如下:
重點來了:
在spring.factories文件中加入如下:
<code>org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.ws.CustomStarter/<code>
此處將我們定義的類的全限定路徑填上.
最後一步
使用maven命令或者idea將此項目進行打包,這樣就大功告成了.
如何使用呢: 直接在springBoot項目中將打包的項目導入即可.
好了,簡易的starter製作完成,重頭戲來了,前面都是小打小鬧,下面開始原理/源碼分析
spring.factories文件
springBoot不可能平白無故自動注入定義的bean,肯定在某個地方默默地加載定義的starter.
那麼應該是哪裡呢?沒錯,就是spring.factories文件.
我們定義了一個重要的kv內容,將定義的CustomStarter賦給了EnableAutoConfiguration,那麼這個文件名以及路徑是從何而來的?我們來看看源碼:
如圖所示,該類是一個配置加載器,作用如下:
- 加載spring.factories
- 保存所加載的配置
EnableAutoConfiguration
解決了spring.factories文件出處的疑惑,下面來解決EnableAutoConfiguration疑點.
EnableAutoConfiguration本質是一個註解.
我們移步該註解的出處,如圖
根據指定的class對象以及類加載從上述SpringFactoriesLoader中獲取對應的字符串集合.
從字面上的意為返回自動配置的類名.
我們再來細看一看紅色部分,這是定義EnableAutoConfiguration的出處:
BeanDefinitionRegistryPostProcessor後置處理器
我們已經知曉配置文件及內容的出處,接下來揭曉執行的時機.
首先,我們來了解下BeanDefinitionRegistryPostProcessor接口,它繼承了BeanFactoryPostProcessor接口.
捋一捋BeanFactoryPostProcessor接口含義:
這是一個BeanFactory後置處理器,不同於BeanPostProcessor bean的後置處理器,這是對BeanFactory進行增加,增強的時機在於構建beanFactory完畢後(此時還未有BeanDefinition).
這是我們的重點嗎?當然不是,此處只是提一下,我們關注的是BeanFactoryPostProcessor接口方法postProcessBeanDefinitionRegistry,這個才是執行自動注入邏輯的入口,如圖(直接上debugger堆棧截圖,我是不是太懶了???):
至此結束!game over!
總結
starter原理其實不難,主要抓住這幾個點:
1. BeanFactoryPostProcessor後置處理器及其子類BeanDefinitionRegistryPostProcessor
- spring.factories文件
(以上屬個人理解,不到位請指定,謝謝!)
路漫漫其修遠兮,吾將上下而求索!我們要走的路還長!
閱讀更多 源碼解讀 的文章
關鍵字: CustomStarter 我們 定義