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

创建配置类监听器对自动配置进行监听

  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);}}}创建新的配置实体后返回SelectImports方法体内
  1. return new AutoConfigurationEntry(configurations, exclusions);
根据需要配置项和被排除项实例化新的配置实体 , 并返回AutoConfigurationEntry(Collection<String> configurations, Collection<String> exclusions) {this.configurations = new ArrayList<>(configurations);this.exclusions = new HashSet<>(exclusions);}将配置实体中的配置信息转化为字符串数组返回,完成注入//获取最终要导入的配置实体AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);//从配置实体中获取具体的配置信息,返回的是一个list集合,而后通过toStringArray()方法转存到字符串数组中返回return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());本笔记个人查看源码时根据立即理解缩写,如有错误可留言告知,谢谢
【装配 SpringBoot自动配置流程】

推荐阅读