装配 SpringBoot自动配置流程( 二 )

getAutoConfigurationEntry()//可以先看下获取的大致流程,而后进入查看器方法内部的具体实现protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {//1.从注解元数据中获取注解的相应属性,将相应属性存储到map中返回//1.1AnnotationAttributes是一个Map集合,其继承了LinkedHashMapAnnotationAttributes attributes = getAttributes(annotationMetadata);//2. 通过getCandidateConfigurations()方法根据注解元数据和注解的属性信息 获取应该进行自动配置的类名,可以理解为自动配置候选项List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);//2.1 通过removeDuplicates()方法对自动配置的类名进行去重处理configurations = removeDuplicates(configurations);//3. 根据注解元数据和注解属性获取到需排除配置项Set<String> exclusions = getExclusions(annotationMetadata, attributes);//3.1检查是否有无效的排除类存在checkExcludedClasses(configurations, exclusions);//3.2从自动配置候选项中删除需要排除的配置项configurations.removeAll(exclusions);//4. 调用getConfigurationClassFilter()方法获取到获取配置的所有AutoConfigurationImportFilter的实现类(对spring.factories进行过滤的类),调用filter方法对配置文件进行筛选,而后返回需要自动配置的类configurations = getConfigurationClassFilter().filter(configurations);//5. 根据spring.factories文件中的AutoConfigurationImportListener事件监听器发布并处理监听事件,最后根据多次过滤、判重返回配置类合集fireAutoConfigurationImportEvents(configurations, exclusions);//6. 创建一个新的配置实体ConfigurationEntry并返回,包含需要配置项configurations,和被排除配置项exclusionsreturn new AutoConfigurationEntry(configurations, exclusions); }下面了解以下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; }?
获取应该进行自动配置的类名

经验总结扩展阅读