下面了解以下getAutoConfigurationEntry()内部调用的方法源码
从注解元数据中返回相应的属性信息
- 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; }
?
- 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 configurations = removeDuplicates(configurations);对自动配置的类名进行去重处理
//通过removeDuplicates()方法对自动配置的类名进行去重处理//利用Set集合数据不重复特性,将list集合存储到LinkedHashSet集合中进行去重处理,而后再将去重的结果存储到List集合中返回protected final <T> List<T> removeDuplicates(List<T> list) {return new ArrayList<>(new LinkedHashSet<>(list));}
从自动配置项中筛选被排除配置项- 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 中进行配置 。
推荐阅读
- 流氓迈克菲软件如何卸载(如何关闭迈克菲自动删除软件)
- 从0搭建vue3组件库:自动化发布、管理版本号、生成 changelog、tag
- Springboot 一行代码实现文件上传 20个平台!少写代码到极致
- SpringBoot内置工具类,告别瞎写工具类了
- 我的世界如何做自动电梯(简单我的世界自动电梯教程)
- app自动化测试环境安装
- 之四 2流高手速成记:SpringBoot整合redis及mongodb
- Springboot JSON 转换:Jackson篇
- SpringBoot整合ES+Kibana
- reportportal 集成 robotframework 自动化执行及结果可视化