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


检查是否有无效的排除类存在

  1. 1 configurations.removeAll(exclusions);
//检查是否有无效的排除类存在private void checkExcludedClasses(List<String> configurations, Set<String> exclusions) { //创建一个用于存储无效配置项的集合List<String> invalidExcludes = new ArrayList<>(exclusions.size()); //循环需排除配置项for (String exclusion : exclusions) {//根据类的全限定名判断该类是否存在且可以被加载 , 并且 需排除配置项集合是否包含该类if (ClassUtils.isPresent(exclusion, getClass().getClassLoader()) && !configurations.contains(exclusion)) {//如果存在,且不再需排除配置项的集合中,将其添加到无效配置项集合中invalidExcludes.add(exclusion);}}//如果无效配置项集合不为空,说明存在无效配置项if (!invalidExcludes.isEmpty()) {//处理无效配置项 --> 报错 IllegalStateException 无效状态异常handleInvalidExcludes(invalidExcludes);}}-----------------------------------------------------------------------------------------/*下面方法是上面方法所调用的个别方法源码,不深究者可以略过*/-----------------------------------------------------------------------------------------/** *ClassUtils.isPresent() 根据类名称判断是否存在并且可以加载 , 如果类或其依赖项之一不存在或无法加载返回false * param1 className 要检查的类的名称 * param2 classLoader 要使用的类加载器(如果为null , 表示默认的类加载器) */public static boolean isPresent(String className, @Nullable ClassLoader classLoader) {try {//forName(类名称 , 类加载器) 用于替换Class.forName()方法, 并且还返回所提供名称的类实例forName(className, classLoader);return true;}catch (IllegalAccessError err) {throw new IllegalStateException("Readability mismatch in inheritance hierarchy of class [" +className + "]: " + err.getMessage(), err);}catch (Throwable ex) {// Typically ClassNotFoundException or NoClassDefFoundError...return false;}}从自动配置项中删除需要被排除的配置项
  1. 2 configurations.removeAll(exclusions);
/** *从自动配置候选项中删除需要排除的配置项 * 集合A.removeAll(集合B);作用就是从集合A数据项中删除掉集合B所包含的元素 */configurations.removeAll(exclusions);创建配置类过滤器对配置项进行筛选过滤
  1. configurations = getConfigurationClassFilter().filter(configurations);
//通过getConfigurationClassFilter()获取所有AutoConfigurationImportFilter的实现类(对spring.factories进行过滤的类),而后调用filter方法对配置文件进行筛选,而后返回需要自动配置的类configurations = getConfigurationClassFilter().filter(configurations);-----------------------------------------------------------------------------------------/*下面方法是上面方法所调用的个别方法源码,不深究者可以略过*/-----------------------------------------------------------------------------------------//获取配置类过滤器private ConfigurationClassFilter getConfigurationClassFilter() {//this.configurationClassFilter当前类的配置类过滤器是不是为nullif (this.configurationClassFilter == null) {// 获取AutoConfigurationImportFilter过滤器的实现类集合List<AutoConfigurationImportFilter> filters = getAutoConfigurationImportFilters();for (AutoConfigurationImportFilter filter : filters) {invokeAwareMethods(filter);//在监听器注入是有描述 , 两者使用的同一方法}//实例化配置类过滤器 ,根据 类加载器和过滤器实现类实例化配置类过滤器//ConfigurationClassFilter类内部含有类加载器和过滤器实现类集合的属性this.configurationClassFilter = new ConfigurationClassFilter(this.beanClassLoader, filters);}//返回配置类过滤器return this.configurationClassFilter;}//getAutoConfigurationImportFilters(); 获取AutoConfigurationImportFilter过滤器的实现类集合protected List<AutoConfigurationImportFilter> getAutoConfigurationImportFilters() {/*** List<T>loadFacotries(Class<T> factoryType, @Nullable ClassLoader classLoader)* 使用给定的类加载器从{"META-INF/spring.factories"}加载并实例化指定过滤器工厂的实现类* 在结果返回之前会对结果集进行排序* param1 表示工厂的接口或者抽象类,-->生成其子类* param2 当前类的类加载器-->用于加载抽象类的实现类* return 返回指定接口或者抽象类的实现类List集合*///返回AutoConfigurationImportFilter实现类的集合return SpringFactoriesLoader.loadFactories(AutoConfigurationImportFilter.class, this.beanClassLoader); }//configurations = getConfigurationClassFilter().filter(configurations);//过滤 自动配置项List<String> filter(List<String> configurations) {long startTime = System.nanoTime();//将将配置转化为字符串数组String[] candidates = StringUtils.toStringArray(configurations);boolean skipped = false;for (AutoConfigurationImportFilter filter : this.filters) {//循环过滤条件与配置项进行一一匹配,剔除掉条件不成立的配置项boolean[] match = filter.match(candidates, this.autoConfigurationMetadata);for (int i = 0; i < match.length; i++) {if (!match[i]) {candidates[i] = null;skipped = true;}}}//如果全都符合则直接返回配置项集合if (!skipped) {return configurations;}//创建结果集集合List<String> result = new ArrayList<>(candidates.length);for (String candidate : candidates) {//配置项不为null就添加到配置类中if (candidate != null) {result.add(candidate);}}//返回结果return result;} }

推荐阅读