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

下面了解以下getAutoConfigurationEntry()內部調用的方法源碼
從注解元數據中返回相應的屬性信息

  1. getAttributes(AnnotationMetadata annotationMetadata)
    /** * 從注解元數據中返回相應的屬性信息 。* param 注解元數據信息 * return注解元數據的屬性信息 其本質是一個Map集合 */protected AnnotationAttributes getAttributes(AnnotationMetadata metadata) { /** * getAnnotationClass() 返回源注解類 -->EnableAutoConfiguration.class * getAnnotationClass().getName(); 獲取注解類的完全限定類名*/String name = getAnnotationClass().getName();/** * metadata.getAnnotationAttributes(String annotationName,boolean classValuesAsString) * 作用: 檢索給定注解的屬性 * @param1 要查找的注解類的完全限定類名 * @param2 是否將類引用轉換為String類名,以便作為返回Map中的值公開,而不是可能必須首先加載的類引用 * *AnnotationAttributes.fromMap(@Nullable Map<String, Object> map); * 基于給定的集合返回AnnotationAttributes實例 。如果該集合是AnnotationAttributes實例或其子類,它將被強制轉換并立即返回,而無需創建新實例 。否則,將通過將提供的映射傳遞給AnnotationAttributes的map)的構造函數來創建新實例 。其參數是一個Map類型的注解屬性數據源,也就是attrbuties*/AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(name, true));/***Assert類 是一個協助驗證參數的斷言實用程序類,詳細使用可以查看其源碼*Assert.notNull(@Nullable Object object, Supplier<String> messageSupplier)方法* 作用 : 判斷對象是不是null,如果為null,報錯提示* param1 : 要進行判斷的對象* param2 : 如果為null,要給予返回的異常信息*/Assert.notNull(attributes, () -> "No auto-configuration attributes found. Is " + metadata.getClassName()+ " annotated with " + ClassUtils.getShortName(name) + "?");//返回注解元數據的屬性信息map集合return attributes; }?
獲取應該進行自動配置的類名
  1. getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes);
    /** *根據注解元數據和注解的屬性信息 獲取應該進行自動配置的類名,可以理解為自動配置的候選項(初選名單) *param1 元注解數據 *param2 元注解數據的屬性信息集合 *return List<String> 存儲的數據就是應該繼續寧自動配置的類名*/protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {/*** SpringFactoriesLoader是一個用于框架內部使用的通用工廠加載機制***/List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "+ "are using a custom packaging, make sure that file is correct.");return configurations;}
對自動配置項進行去重處理
  1. 1 configurations = removeDuplicates(configurations);對自動配置的類名進行去重處理
//通過removeDuplicates()方法對自動配置的類名進行去重處理//利用Set集合數據不重復特性,將list集合存儲到LinkedHashSet集合中進行去重處理,而后再將去重的結果存儲到List集合中返回protected final <T> List<T> removeDuplicates(List<T> list) {return new ArrayList<>(new LinkedHashSet<>(list));}從自動配置項中篩選被排除配置項
  1. configurations.removeAll(exclusions);
//從自動配置候選項中篩選需排除配置項protected Set<String> getExclusions(AnnotationMetadata metadata, AnnotationAttributes attributes) {//創建一個需排除配置項集合excludedSet<String> excluded = new LinkedHashSet<>();//從屬性信息集合中獲取到key為exclude的值,將其存儲到excluded集合中excluded.addAll(asList(attributes, "exclude"));//從屬性信息集合中獲取到key為excludeName的數據,返回的是一個字符串數組,返回后將其轉化為List集合,存儲到excluded集合中excluded.addAll(Arrays.asList(attributes.getStringArray("excludeName")));/*** getExcludeAutoConfigurationsProperty():*返回 spring.autoconfigure.exclude 屬性排除的自動配置*/excluded.addAll(getExcludeAutoConfigurationsProperty());return excluded;}-----------------------------------------------------------------------------------------/*下面方法是上面方法所調用的個別方法源碼,不深究者可以略過*/-----------------------------------------------------------------------------------------//attributes.getStringArray("excludeName")public String[] getStringArray(String attributeName) {return getRequiredAttribute(attributeName, String[].class);}exclude 和excludeName 都是指定某些類在項目啟動時不進行自動配置 , 其一般在@SpringBootApplication 中進行配置 。

推薦閱讀