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

从自动配置项中删除需要被排除的配置项

  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;} }创建配置类监听器对自动配置进行监听
  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);}}}

经验总结扩展阅读