springBoot之starter原理

在解析原理之前,我們不妨先來嘗試下如何自己製作一個屬於自己的簡易starter

(本文假設你是有一定經驗的開發者)


springBoot之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的文件,

效果如下:


springBoot之starter原理


重點來了:

在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,那麼這個文件名以及路徑是從何而來的?我們來看看源碼:

如圖所示,該類是一個配置加載器,作用如下:

  1. 加載spring.factories
  2. 保存所加載的配置
springBoot之starter原理

SpringFactoriesLoader

EnableAutoConfiguration

解決了spring.factories文件出處的疑惑,下面來解決EnableAutoConfiguration疑點.

EnableAutoConfiguration本質是一個註解.

我們移步該註解的出處,如圖

springBoot之starter原理

AutoConfigurationImportSelector

根據指定的class對象以及類加載從上述SpringFactoriesLoader中獲取對應的字符串集合.

從字面上的意為返回自動配置的類名.

我們再來細看一看紅色部分,這是定義EnableAutoConfiguration的出處:


springBoot之starter原理

EnableAutoConfiguration出處


BeanDefinitionRegistryPostProcessor後置處理器

我們已經知曉配置文件及內容的出處,接下來揭曉執行的時機.

首先,我們來了解下BeanDefinitionRegistryPostProcessor接口,它繼承了BeanFactoryPostProcessor接口.

捋一捋BeanFactoryPostProcessor接口含義:

這是一個BeanFactory後置處理器,不同於BeanPostProcessor bean的後置處理器,這是對BeanFactory進行增加,增強的時機在於構建beanFactory完畢後(此時還未有BeanDefinition).

這是我們的重點嗎?當然不是,此處只是提一下,我們關注的是BeanFactoryPostProcessor接口方法postProcessBeanDefinitionRegistry,這個才是執行自動注入邏輯的入口,如圖(直接上debugger堆棧截圖,我是不是太懶了???):

springBoot之starter原理


至此結束!game over!

總結

starter原理其實不難,主要抓住這幾個點:

1. BeanFactoryPostProcessor後置處理器及其子類BeanDefinitionRegistryPostProcessor

  1. spring.factories文件

(以上屬個人理解,不到位請指定,謝謝!)

路漫漫其修遠兮,吾將上下而求索!我們要走的路還長!


分享到:


相關文章: