裝配 SpringBoot自動配置流程( 四 )

創建配置類監聽器對自動配置進行監聽

  1. fireAutoConfigurationImportEvents(configurations, exclusions);
//根據spring.factories文件中的AutoConfigurationImportListener事件監聽器發布并處理監聽事件,最后根據多次過濾、判重返回配置類合集private void fireAutoConfigurationImportEvents(List<String> configurations, Set<String> exclusions) {//從{ "META-INF/spring.factories"}加載并實例化自動配置類監聽器AutoConfigurationImportListener的實現類集合List<AutoConfigurationImportListener> listeners = getAutoConfigurationImportListeners();//如果監聽器不為空的話if (!listeners.isEmpty())//創建fireAutoConfigurationImportEvents監聽事件AutoConfigurationImportEvent event = new AutoConfigurationImportEvent(this, configurations, exclusions);//循環遍歷 判斷listener是否是 Aware 通過Aware接口 實現對bean各階段的監聽for (AutoConfigurationImportListener listener : listeners) {//通過Aware類的實現類對監聽器進行配置 -->解這一模塊,可以重點關注以下Aware接口invokeAwareMethods(listener);//進行自動配置的導入 event 到自動配置時進行的事件-->對自動配置的監聽listener.onAutoConfigurationImportEvent(event);}}}//根據Aware類對bean的各階段進行監聽配置private void invokeAwareMethods(Object instance) {//判斷監聽器是否是Aware或其實現類if (instance instanceof Aware) {if (instance instanceof BeanClassLoaderAware) {/*** BeanClassLoaderAware 允許bean知道bean的回調ClassLoader,即當前bean工廠用來加載bean類的類加載器 。這主要是由框架類來實現的,這些框架類必須通過名稱來獲取應用程序類,盡管它們本身可能從共享類加載器加載的 。* 方法 setBeanClassLoader(ClassLoader classLoader);*將bean的類加載器 提供給bean實例的回調 。*作用范圍: 在填充普通bean屬性之后,初始化回調之前調用*/((BeanClassLoaderAware) instance).setBeanClassLoader(this.beanClassLoader);}if (instance instanceof BeanFactoryAware) {/*** BeanFactoryAware 表示接口知道其擁有的{BeanFactory}的bean實現 。*注意 :大多數的bean都可以通過屬性注入和構造注入接收對bean的引用*方法 :setBeanFactory(BeanFactory beanFactory)*向bean實例提供擁有工廠的回調 。*作用范圍: 在填充普通bean屬性之后 , 初始化回調之前調用,*/((BeanFactoryAware) instance).setBeanFactory(this.beanFactory);}if (instance instanceof EnvironmentAware) {/*** EnvironmentAware 表示該接口可以收到其運行環境的通知*方法 :setEnvironment(Environment environment);*設置此組件的運行環境*/((EnvironmentAware) instance).setEnvironment(this.environment);}if (instance instanceof ResourceLoaderAware) {/*** ResourceLoaderAware 接口 , 該接口可以收到該對象運行的ResourceLoader資源封裝類加載器*方法 :setResourceLoader(ResourceLoader resourceLoader);*作用 :設置此對象運行的ResourceLoader ??赡苁且粋€ResourcePatternResolver*作用范圍: 在填充普通bean屬性之后,初始化回調之前調用*/((ResourceLoaderAware) instance).setResourceLoader(this.resourceLoader);}}}創建新的配置實體后返回SelectImports方法體內
  1. return new AutoConfigurationEntry(configurations, exclusions);
根據需要配置項和被排除項實例化新的配置實體 , 并返回AutoConfigurationEntry(Collection<String> configurations, Collection<String> exclusions) {this.configurations = new ArrayList<>(configurations);this.exclusions = new HashSet<>(exclusions);}將配置實體中的配置信息轉化為字符串數組返回,完成注入//獲取最終要導入的配置實體AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);//從配置實體中獲取具體的配置信息,返回的是一個list集合,而后通過toStringArray()方法轉存到字符串數組中返回return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());本筆記個人查看源碼時根據立即理解縮寫,如有錯誤可留言告知,謝謝
【裝配 SpringBoot自動配置流程】

推薦閱讀