按关键词阅读:
这里看到selectImports()方法就在上面demo中出现过 , 再查看一下之前使用@Import注解导入的EnableAutoConfigurationImportSelector类 , 其就间接实现了ImportSelector接口;这和demo中是不是很相似 。
这里的 selectImports()方法再往里就是读取各个jar包中有含 META-INF/spring.factories.文件的信息了 , 这里就不多做分析了 。
文章插图
但这里会不会有个疑问 , @Import是怎么起作用的 , 这里就要看看deferredImport是怎么实例化的!!! , 也是在上面的方法中有这样一段代码;
private void processDeferredImportSelectors() {List
代码中可以看出是deferredImportSelectors对象间接赋值 , 那就找它实例化的位置;
private void processImports(ConfigurationClass configClass, SourceClass currentSourceClass,Collection importCandidates,boolean checkForCircularImports) throws IOException {for (SourceClass candidate : importCandidates) {if (candidate.isAssignable(ImportSelector.class)) {// Candidate class is an ImportSelector -> delegate to it to determine importsClass> candidateClass = candidate.loadClass();//这里用于实例化ImportSelector的实现类ImportSelector selector = BeanUtils.instantiateClass(candidateClass,ImportSelector.class);ParserStrategyUtils.invokeAwareMethods(selector, this.environment,this.resourceLoader, this.registry);if (this.deferredImportSelectors != null}}}}
上面也就是判断并实例化ImportSelector接口的实现类 , 而怎么识别的呢? importCandidates又是如何得到的?接着找 。。
protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass) throws IOException {// Process any @Import annotations processImports(configClass, sourceClass, getImports(sourceClass), true);}private Set getImports(SourceClass sourceClass) throws IOException {Set imports = new LinkedHashSet();Set visited = new LinkedHashSet();collectImports(sourceClass, imports, visited);return imports;}private void collectImports(SourceClass sourceClass, Set imports,Set visited) throws IOException { if (visited.add(sourceClass)) {for (SourceClass annotation : sourceClass.getAnnotations()) {String annName = annotation.getMetadata().getClassName();if (!annName.startsWith("java")}}imports.addAll(sourceClass.getAnnotationAttributes(Import.class.getName(), "value")); }}
看到这里的判断也大体明白了吧 。
这里就不做总结了 , 加个最近觉得很有道理的一句话 , 学习其实是个低成本 , 高回报的方式 。
版权声明:本文为博主原创文章 , 遵循 CC 4.0 BY-SA 版权协议 , 转载请附上原文出处链接和本声明 。
本文链接:
稿源:(未知)
【傻大方】网址:http://www.shadafang.com/c/111J304252020.html
标题:Springboot中@Import的使用原理( 二 )