美文网首页
自动配置分析六

自动配置分析六

作者: 程序员札记 | 来源:发表于2023-05-15 04:32 被阅读0次

refresh和自动配置大致流程

image.png

AutoConfigurationImportSelector的fireAutoConfigurationImportEvents通知自动配置导入事件

其实就是获取所有的AutoConfigurationImportListener类型的监听器。然后广播AutoConfigurationImportEvent事件,具体他们收到后怎么做的自己可以去看,不多说了。

    private void fireAutoConfigurationImportEvents(List<String> configurations, Set<String> exclusions) {
        List<AutoConfigurationImportListener> listeners = getAutoConfigurationImportListeners();
        if (!listeners.isEmpty()) {
            AutoConfigurationImportEvent event = new AutoConfigurationImportEvent(this, configurations, exclusions);
            for (AutoConfigurationImportListener listener : listeners) {
                invokeAwareMethods(listener);
                listener.onAutoConfigurationImportEvent(event);
            }
        }
    }

最后把配置类名字结合和排除集合封装成AutoConfigurationEntry返回。继续DeferredImportSelectorGrouping的处理。

AutoConfigurationGroup的selectImports封装成Entry返回

image.png

这里又一次的进行了排除,我猜估计是为了防止自定义的接受AutoConfigurationImportEvent事件的监听器又添加了什么要排除的,貌似是个扩展点啊。最后用流式编程生成List返回。

@Override
        public Iterable<Entry> selectImports() {
            if (this.autoConfigurationEntries.isEmpty()) {
                return Collections.emptyList();
            }
            Set<String> allExclusions = this.autoConfigurationEntries.stream()
                    .map(AutoConfigurationEntry::getExclusions).flatMap(Collection::stream).collect(Collectors.toSet());
            Set<String> processedConfigurations = this.autoConfigurationEntries.stream()
                    .map(AutoConfigurationEntry::getConfigurations).flatMap(Collection::stream)
                    .collect(Collectors.toCollection(LinkedHashSet::new));
            processedConfigurations.removeAll(allExclusions);//又排除了一次,可能前的一些处理会带来重复的
            //封装成Entry的list返回
            return sortAutoConfigurations(processedConfigurations, getAutoConfigurationMetadata()).stream()
                    .map((importClassName) -> new Entry(this.entries.get(importClassName), importClassName))
                    .collect(Collectors.toList());
        }

然后就是迭代每一个自动配置类,进行processImports递归调用:

image.png

前面说过要搞个自定义的自动配置的,我们试试吧。

MyAutoConfiguration自动配置类

@Configuration(proxyBeanMethods = false)
@Configuration
public class MyAutoConfiguration {
    public MyAutoConfiguration(){
        System.out.println("MyAutoConfiguration");
    }
}

创建META-INF文件夹和文件spring.factories

image.png

内容就你自定义自动配置类全限定名:


image.png

然后看结果:


image.png

结果成功:


image.png

你觉得没那么简单,这个配置类能用不?你还可以加点料稍微测试下:


image.png image.png
image.png

结果也会如你所愿:


image.png

相关文章

网友评论

      本文标题:自动配置分析六

      本文链接:https://www.haomeiwen.com/subject/lvlmsdtx.html