创建配置类监听器对自动配置进行监听
- 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方法体内- 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自动配置流程】
推荐阅读
- 流氓迈克菲软件如何卸载(如何关闭迈克菲自动删除软件)
- 从0搭建vue3组件库:自动化发布、管理版本号、生成 changelog、tag
- Springboot 一行代码实现文件上传 20个平台!少写代码到极致
- SpringBoot内置工具类,告别瞎写工具类了
- 我的世界如何做自动电梯(简单我的世界自动电梯教程)
- app自动化测试环境安装
- 之四 2流高手速成记:SpringBoot整合redis及mongodb
- Springboot JSON 转换:Jackson篇
- SpringBoot整合ES+Kibana
- reportportal 集成 robotframework 自动化执行及结果可视化