springboot自动装配 这篇来了简单解下springboot的自动装配原理。 学习其他的知识的时候如果涉及本文解析错误或者漏的地方会再写补充文档 版本:2。3。5废话少说直接干!!! 随便找一个springboot项目,来看下是如何自动装配的。SpringBootApplicationpublicclassJiuShiGanApplication{publicstaticvoidmain(String〔〕args){SpringApplication。run(JiuShiGanApplication。class,args);}} 直接点开注解SpringBootApplicationTarget(ElementType。TYPE)Retention(RetentionPolicy。RUNTIME)DocumentedInheritedSpringBootConfigurationEnableAutoConfigurationComponentScan(excludeFilters{Filter(typeFilterType。CUSTOM,classesTypeExcludeFilter。class),Filter(typeFilterType。CUSTOM,classesAutoConfigurationExcludeFilter。class)})publicinterfaceSpringBootApplication{。。。} 注解体里面写我们这次不关心,就是任性。大部分注解应该都是认识的,这里就看下下面两个注解SpringBootConfigurationEnableAutoConfigurationSpringBootConfiguration SpringBootConfiguration,如下看完了(这个注解就是一个config这里肯定不涉及本次想学习的内容了。)Target(ElementType。TYPE)Retention(RetentionPolicy。RUNTIME)DocumentedConfigurationpublicinterfaceSpringBootConfiguration{AliasFor(annotationConfiguration。class)booleanproxyBeanMethods()defaulttrue;}EnableAutoConfiguration EnableAutoConfigurationTarget(ElementType。TYPE)Retention(RetentionPolicy。RUNTIME)DocumentedInherited关注下面2行AutoConfigurationPackageImport(AutoConfigurationImportSelector。class)publicinterfaceEnableAutoConfiguration{StringENABLEDOVERRIDEPROPERTYspring。boot。enableautoconfiguration;Classlt;?〔〕exclude()default{};String〔〕excludeName()default{};} 先来看import引入类AutoConfigurationImportSelector publicclassAutoConfigurationImportSelectorimplementsDeferredImportSelector,BeanClassLoaderAware,ResourceLoaderAware,BeanFactoryAware,EnvironmentAware,Ordered{privatestaticfinalAutoConfigurationEntryEMPTYENTRYnewAutoConfigurationEntry();privatestaticfinalString〔〕NOIMPORTS{};privatestaticfinalLogloggerLogFactory。getLog(AutoConfigurationImportSelector。class);privatestaticfinalStringPROPERTYNAMEAUTOCONFIGUREEXCLUDEspring。autoconfigure。exclude;privateConfigurableListableBeanFactorybeanFactory;privateEnvironmentenvironment;privateClassLoaderbeanClassLoader;privateResourceLoaderresourceLoader;privateConfigurationClassFilterconfigurationClassFilter;OverridepublicString〔〕selectImports(AnnotationMetadataannotationMetadata){if(!isEnabled(annotationMetadata)){returnNOIMPORTS;}AutoConfigurationEntryautoConfigurationEntrygetAutoConfigurationEntry(annotationMetadata);returnStringUtils。toStringArray(autoConfigurationEntry。getConfigurations());}OverridepublicPredicateStringgetExclusionFilter(){returnthis::shouldExclude;}privatebooleanshouldExclude(StringconfigurationClassName){returngetConfigurationClassFilter()。filter(Collections。singletonList(configurationClassName))。isEmpty();}protectedAutoConfigurationEntrygetAutoConfigurationEntry(AnnotationMetadataannotationMetadata){if(!isEnabled(annotationMetadata)){returnEMPTYENTRY;}AnnotationAttributesattributesgetAttributes(annotationMetadata);ListStringconfigurationsgetCandidateConfigurations(annotationMetadata,attributes);configurationsremoveDuplicates(configurations);SetStringexclusionsgetExclusions(annotationMetadata,attributes);checkExcludedClasses(configurations,exclusions);configurations。removeAll(exclusions);configurationsgetConfigurationClassFilter()。filter(configurations);fireAutoConfigurationImportEvents(configurations,exclusions);returnnewAutoConfigurationEntry(configurations,exclusions);}OverridepublicClasslt;?extendsGroupgetImportGroup(){returnAutoConfigurationGroup。class;}protectedbooleanisEnabled(AnnotationMetadatametadata){if(getClass()AutoConfigurationImportSelector。class){returngetEnvironment()。getProperty(EnableAutoConfiguration。ENABLEDOVERRIDEPROPERTY,Boolean。class,true);}returntrue;}protectedAnnotationAttributesgetAttributes(AnnotationMetadatametadata){StringnamegetAnnotationClass()。getName();AnnotationAttributesattributesAnnotationAttributes。fromMap(metadata。getAnnotationAttributes(name,true));Assert。notNull(attributes,()Noautoconfigurationattributesfound。Ismetadata。getClassName()annotatedwithClassUtils。getShortName(name)?);returnattributes;}protectedClasslt;?getAnnotationClass(){returnEnableAutoConfiguration。class;}protectedListStringgetCandidateConfigurations(AnnotationMetadatametadata,AnnotationAttributesattributes){ListStringconfigurationsSpringFactoriesLoader。loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());Assert。notEmpty(configurations,NoautoconfigurationclassesfoundinMETAINFspring。factories。Ifyouareusingacustompackaging,makesurethatfileiscorrect。);returnconfigurations;}protectedClasslt;?getSpringFactoriesLoaderFactoryClass(){returnEnableAutoConfiguration。class;}privatevoidcheckExcludedClasses(ListStringconfigurations,SetStringexclusions){ListStringinvalidExcludesnewArrayList(exclusions。size());for(Stringexclusion:exclusions){if(ClassUtils。isPresent(exclusion,getClass()。getClassLoader())!configurations。contains(exclusion)){invalidExcludes。add(exclusion);}}if(!invalidExcludes。isEmpty()){handleInvalidExcludes(invalidExcludes);}}protectedvoidhandleInvalidExcludes(ListStringinvalidExcludes){StringBuildermessagenewStringBuilder();for(Stringexclude:invalidExcludes){message。append()。append(exclude)。append(String。format(n));}thrownewIllegalStateException(String。format(Thefollowingclassescouldnotbeexcludedbecausetheyarenotautoconfigurationclasses:ns,message));}protectedSetStringgetExclusions(AnnotationMetadatametadata,AnnotationAttributesattributes){SetStringexcludednewLinkedHashSet();excluded。addAll(asList(attributes,exclude));excluded。addAll(Arrays。asList(attributes。getStringArray(excludeName)));excluded。addAll(getExcludeAutoConfigurationsProperty());returnexcluded;}protectedListStringgetExcludeAutoConfigurationsProperty(){EnvironmentenvironmentgetEnvironment();if(environmentnull){returnCollections。emptyList();}if(environmentinstanceofConfigurableEnvironment){BinderbinderBinder。get(environment);returnbinder。bind(PROPERTYNAMEAUTOCONFIGUREEXCLUDE,String〔〕。class)。map(Arrays::asList)。orElse(Collections。emptyList());}String〔〕excludesenvironment。getProperty(PROPERTYNAMEAUTOCONFIGUREEXCLUDE,String〔〕。class);return(excludes!null)?Arrays。asList(excludes):Collections。emptyList();}protectedListgetAutoConfigurationImportFilters(){returnSpringFactoriesLoader。loadFactories(AutoConfigurationImportFilter。class,this。beanClassLoader);}privateConfigurationClassFiltergetConfigurationClassFilter(){if(this。configurationClassFilternull){ListfiltersgetAutoConfigurationImportFilters();for(AutoConfigurationImportFilterfilter:filters){invokeAwareMethods(filter);}this。configurationClassFilternewConfigurationClassFilter(this。beanClassLoader,filters);}returnthis。configurationClassFilter;}protectedfinalTListTremoveDuplicates(ListTlist){returnnewArrayList(newLinkedHashSet(list));}protectedfinalListStringasList(AnnotationAttributesattributes,Stringname){String〔〕valueattributes。getStringArray(name);returnArrays。asList(value);}privatevoidfireAutoConfigurationImportEvents(ListStringconfigurations,SetStringexclusions){ListlistenersgetAutoConfigurationImportListeners();if(!listeners。isEmpty()){AutoConfigurationImportEventeventnewAutoConfigurationImportEvent(this,configurations,exclusions);for(AutoConfigurationImportListenerlistener:listeners){invokeAwareMethods(listener);listener。onAutoConfigurationImportEvent(event);}}}protectedListgetAutoConfigurationImportListeners(){returnSpringFactoriesLoader。loadFactories(AutoConfigurationImportListener。class,this。beanClassLoader);}privatevoidinvokeAwareMethods(Objectinstance){if(instanceinstanceofAware){if(instanceinstanceofBeanClassLoaderAware){((BeanClassLoaderAware)instance)。setBeanClassLoader(this。beanClassLoader);}if(instanceinstanceofBeanFactoryAware){((BeanFactoryAware)instance)。setBeanFactory(this。beanFactory);}if(instanceinstanceofEnvironmentAware){((EnvironmentAware)instance)。setEnvironment(this。environment);}if(instanceinstanceofResourceLoaderAware){((ResourceLoaderAware)instance)。setResourceLoader(this。resourceLoader);}}}OverridepublicvoidsetBeanFactory(BeanFactorybeanFactory)throwsBeansException{Assert。isInstanceOf(ConfigurableListableBeanFactory。class,beanFactory);this。beanFactory(ConfigurableListableBeanFactory)beanFactory;}protectedfinalConfigurableListableBeanFactorygetBeanFactory(){returnthis。beanFactory;}OverridepublicvoidsetBeanClassLoader(ClassLoaderclassLoader){this。beanClassLoaderclassLoader;}protectedClassLoadergetBeanClassLoader(){returnthis。beanClassLoader;}OverridepublicvoidsetEnvironment(Environmentenvironment){this。environmentenvironment;}protectedfinalEnvironmentgetEnvironment(){returnthis。environment;}OverridepublicvoidsetResourceLoader(ResourceLoaderresourceLoader){this。resourceLoaderresourceLoader;}protectedfinalResourceLoadergetResourceLoader(){returnthis。resourceLoader;}OverridepublicintgetOrder(){returnOrdered。LOWESTPRECEDENCE1;}privatestaticclassConfigurationClassFilter{privatefinalAutoConfigurationMetadataautoConfigurationMetadata;privatefinalListfilters;ConfigurationClassFilter(ClassLoaderclassLoader,Listfilters){this。autoConfigurationMetadataAutoConfigurationMetadataLoader。loadMetadata(classLoader);this。filtersfilters;}ListStringfilter(ListStringconfigurations){longstartTimeSystem。nanoTime();String〔〕candidatesStringUtils。toStringArray(configurations);booleanskippedfalse;for(AutoConfigurationImportFilterfilter:this。filters){boolean〔〕matchfilter。match(candidates,this。autoConfigurationMetadata);for(inti0;imatch。length;i){if(!match〔i〕){candidates〔i〕null;skippedtrue;}}}if(!skipped){returnconfigurations;}ListStringresultnewArrayList(candidates。length);for(Stringcandidate:candidates){if(candidate!null){result。add(candidate);}}if(logger。isTraceEnabled()){intnumberFilteredconfigurations。size()result。size();logger。trace(FilterednumberFilteredautoconfigurationclassinTimeUnit。NANOSECONDS。toMillis(System。nanoTime()startTime)ms);}returnresult;}}privatestaticclassAutoConfigurationGroupimplementsDeferredImportSelector。Group,BeanClassLoaderAware,BeanFactoryAware,ResourceLoaderAware{privatefinalMapString,AnnotationMetadataentriesnewLinkedHashMap();privatefinalListautoConfigurationEntriesnewArrayList();privateClassLoaderbeanClassLoader;privateBeanFactorybeanFactory;privateResourceLoaderresourceLoader;privateAutoConfigurationMetadataautoConfigurationMetadata;OverridepublicvoidsetBeanClassLoader(ClassLoaderclassLoader){this。beanClassLoaderclassLoader;}OverridepublicvoidsetBeanFactory(BeanFactorybeanFactory){this。beanFactorybeanFactory;}OverridepublicvoidsetResourceLoader(ResourceLoaderresourceLoader){this。resourceLoaderresourceLoader;}Overridepublicvoidprocess(AnnotationMetadataannotationMetadata,DeferredImportSelectordeferredImportSelector){Assert。state(deferredImportSelectorinstanceofAutoConfigurationImportSelector,()String。format(Onlysimplementationsaresupported,gots,AutoConfigurationImportSelector。class。getSimpleName(),deferredImportSelector。getClass()。getName()));AutoConfigurationEntryautoConfigurationEntry((AutoConfigurationImportSelector)deferredImportSelector)。getAutoConfigurationEntry(annotationMetadata);this。autoConfigurationEntries。add(autoConfigurationEntry);for(StringimportClassName:autoConfigurationEntry。getConfigurations()){this。entries。putIfAbsent(importClassName,annotationMetadata);}}OverridepublicIterableEntryselectImports(){if(this。autoConfigurationEntries。isEmpty()){returnCollections。emptyList();}SetStringallExclusionsthis。autoConfigurationEntries。stream()。map(AutoConfigurationEntry::getExclusions)。flatMap(Collection::stream)。collect(Collectors。toSet());SetStringprocessedConfigurationsthis。autoConfigurationEntries。stream()。map(AutoConfigurationEntry::getConfigurations)。flatMap(Collection::stream)。collect(Collectors。toCollection(LinkedHashSet::new));processedConfigurations。removeAll(allExclusions);returnsortAutoConfigurations(processedConfigurations,getAutoConfigurationMetadata())。stream()。map((importClassName)newEntry(this。entries。get(importClassName),importClassName))。collect(Collectors。toList());}privateAutoConfigurationMetadatagetAutoConfigurationMetadata(){if(this。autoConfigurationMetadatanull){this。autoConfigurationMetadataAutoConfigurationMetadataLoader。loadMetadata(this。beanClassLoader);}returnthis。autoConfigurationMetadata;}privateListStringsortAutoConfigurations(SetStringconfigurations,AutoConfigurationMetadataautoConfigurationMetadata){returnnewAutoConfigurationSorter(getMetadataReaderFactory(),autoConfigurationMetadata)。getInPriorityOrder(configurations);}privateMetadataReaderFactorygetMetadataReaderFactory(){try{returnthis。beanFactory。getBean(SharedMetadataReaderFactoryContextInitializer。BEANNAME,MetadataReaderFactory。class);}catch(NoSuchBeanDefinitionExceptionex){returnnewCachingMetadataReaderFactory(this。resourceLoader);}}}protectedstaticclassAutoConfigurationEntry{privatefinalListStringconfigurations;privatefinalSetStringexclusions;privateAutoConfigurationEntry(){this。configurationsCollections。emptyList();this。exclusionsCollections。emptySet();}AutoConfigurationEntry(CollectionStringconfigurations,CollectionStringexclusions){this。configurationsnewArrayList(configurations);this。exclusionsnewHashSet(exclusions);}publicListStringgetConfigurations(){returnthis。configurations;}publicSetStringgetExclusions(){returnthis。exclusions;}}} 上面的类看着巨长,可以在所有方法中打上断点,然后启动项目查看执行情况。我这里中间过程省略,直接从我觉得关键的代码处开始追溯。 Okla!进入上图的方法入口为覆写的process()Overridepublicvoidprocess(AnnotationMetadataannotationMetadata,DeferredImportSelectordeferredImportSelector){Assert。state(deferredImportSelectorinstanceofAutoConfigurationImportSelector,()String。format(Onlysimplementationsaresupported,gots,AutoConfigurationImportSelector。class。getSimpleName(),deferredImportSelector。getClass()。getName()));进入目标方法AutoConfigurationEntryautoConfigurationEntry((AutoConfigurationImportSelector)deferredImportSelector)。getAutoConfigurationEntry(annotationMetadata);this。autoConfigurationEntries。add(autoConfigurationEntry);for(StringimportClassName:autoConfigurationEntry。getConfigurations()){this。entries。putIfAbsent(importClassName,annotationMetadata);}}目标方法protectedAutoConfigurationEntrygetAutoConfigurationEntry(AnnotationMetadataannotationMetadata){if(!isEnabled(annotationMetadata)){returnEMPTYENTRY;}AnnotationAttributesattributesgetAttributes(annotationMetadata);ListStringconfigurationsgetCandidateConfigurations(annotationMetadata,attributes);configurationsremoveDuplicates(configurations);SetStringexclusionsgetExclusions(annotationMetadata,attributes);checkExcludedClasses(configurations,exclusions);configurations。removeAll(exclusions);configurationsgetConfigurationClassFilter()。filter(configurations);fireAutoConfigurationImportEvents(configurations,exclusions);returnnewAutoConfigurationEntry(configurations,exclusions);}getAutoConfigurationEntry() 将方法分拆。isEnabled:判断是否自动装配getAttributes:获取AnnotationAttributes对象,这里可以看到传入进来的类对象就是我们上面关注的注解EnableAutoConfiguration。AnnotationAttributes是一个继承了LinkHashMap的集合类publicclassAnnotationAttributesextendsLinkedHashMapString,Object{。。。。} 执行完上面的方法后查看返回的结果信息,可以看到attributes中有俩个键分别为exclude和excludeName。 getCandidateConfigurationsprotectedListStringgetCandidateConfigurations(AnnotationMetadatametadata,AnnotationAttributesattributes){ListStringconfigurationsSpringFactoriesLoader。loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());Assert。notEmpty(configurations,NoautoconfigurationclassesfoundinMETAINFspring。factories。Ifyouareusingacustompackaging,makesurethatfileiscorrect。);returnconfigurations;} 先关注下SpringFactoriesLoader。loadFactoryNames()这个方法。 这个方法最终调用的是loadSpringFactories()这个方法会先缓存中获取数据,缓存是一个ConcurrentReferenceHashMap类型的哈希表。privatestaticfinalMapClassLoader,MultiValueMapString,StringcachenewConcurrentReferenceHashMap(); 当缓存中没有数据,则会走后续的逻辑。 从图中可以看到是从文件METAINFspring。factories中获取数据。先来看看这个文件是啥东西。 publicstaticListStringloadFactoryNames(Classlt;?factoryType,NullableClassLoaderclassLoader){StringfactoryTypeNamefactoryType。getName();returnloadSpringFactories(classLoader)。getOrDefault(factoryTypeName,Collections。emptyList());}privatestaticMapString,ListStringloadSpringFactories(NullableClassLoaderclassLoader){检查是否存在缓存MultiValueMapString,Stringresultcache。get(classLoader);if(result!null){returnresult;}try{获取METAINFspring。factories文件地址,如上面图中这个文件可以有很多EnumerationURLurls(classLoader!null?classLoader。getResources(FACTORIESRESOURCELOCATION):ClassLoader。getSystemResources(FACTORIESRESOURCELOCATION));resultnewLinkedMultiValueMap();循环文件地址while(urls。hasMoreElements()){URLurlurls。nextElement();UrlResourceresourcenewUrlResource(url);将文件读取到properties实例中PropertiespropertiesPropertiesLoaderUtils。loadProperties(resource);遍历数据,将文件中的类类型和类名称映射为MultiValueMapString,String,并加入返回值中for(Map。Entrylt;?,?entry:properties。entrySet()){StringfactoryTypeName((String)entry。getKey())。trim();for(StringfactoryImplementationName:StringUtils。commaDelimitedListToStringArray((String)entry。getValue())){result。add(factoryTypeName,factoryImplementationName。trim());}}}将结果集放入缓存cache。put(classLoader,result);returnresult;}catch(IOExceptionex){thrownewIllegalArgumentException(Unabletoloadfactoriesfromlocation〔FACTORIESRESOURCELOCATION〕,ex);}} 执行完后查看result 断点快进至getCandidateConfigurations最后查看这个方法返回的信息,可以看到都是类的全路径名称。 removeDuplicates:没啥可说的protectedfinalTListTremoveDuplicates(ListTlist){returnnewArrayList(newLinkedHashSet(list));}getExclusions:获取例外项列表protectedSetStringgetExclusions(AnnotationMetadatametadata,AnnotationAttributesattributes){SetStringexcludednewLinkedHashSet();excluded。addAll(asList(attributes,exclude));excluded。addAll(Arrays。asList(attributes。getStringArray(excludeName)));excluded。addAll(getExcludeAutoConfigurationsProperty());returnexcluded;}PROPERTYNAMEAUTOCONFIGUREEXCLUDEspring。autoconfigure。exclude;protectedListStringgetExcludeAutoConfigurationsProperty(){EnvironmentenvironmentgetEnvironment();if(environmentnull){returnCollections。emptyList();}if(environmentinstanceofConfigurableEnvironment){BinderbinderBinder。get(environment);returnbinder。bind(PROPERTYNAMEAUTOCONFIGUREEXCLUDE,String〔〕。class)。map(Arrays::asList)。orElse(Collections。emptyList());}String〔〕excludesenvironment。getProperty(PROPERTYNAMEAUTOCONFIGUREEXCLUDE,String〔〕。class);return(excludes!null)?Arrays。asList(excludes):Collections。emptyList();} checkExcludedClassesprivatevoidcheckExcludedClasses(ListStringconfigurations,SetStringexclusions){ListStringinvalidExcludesnewArrayList(exclusions。size());for(Stringexclusion:exclusions){判断指定类可以进行加载并且还没有加载到配置中if(ClassUtils。isPresent(exclusion,getClass()。getClassLoader())!configurations。contains(exclusion)){invalidExcludes。add(exclusion);}}if(!invalidExcludes。isEmpty()){handleInvalidExcludes(invalidExcludes);}}处理已指定的任何无效排除项。protectedvoidhandleInvalidExcludes(ListStringinvalidExcludes){StringBuildermessagenewStringBuilder();for(Stringexclude:invalidExcludes){message。append()。append(exclude)。append(String。format(n));}thrownewIllegalStateException(String。format(Thefollowingclassescouldnotbeexcludedbecausetheyarenotautoconfigurationclasses:ns,message));} getConfigurationClassFilter()。filter() 首先getConfigurationClassFilter()返回的是一个内部类ConfigurationClassFilter 这里可以看到过滤器里面3个过滤器。onXXXCondition注解,满足条件才可以自动配置。fireAutoConfigurationImportEvents:派发AutoConfigurationImportEvent事件privatevoidfireAutoConfigurationImportEvents(ListStringconfigurations,SetStringexclusions){ListlistenersgetAutoConfigurationImportListeners();if(!listeners。isEmpty()){AutoConfigurationImportEvent实例AutoConfigurationImportEventeventnewAutoConfigurationImportEvent(this,configurations,exclusions);for(AutoConfigurationImportListenerlistener:listeners){invokeAwareMethods(listener);放入监听listener。onAutoConfigurationImportEvent(event);}}}publicvoidonAutoConfigurationImportEvent(AutoConfigurationImportEventevent){if(this。beanFactory!null){从beanFactory中拿到ConditionEvaluationReportreportConditionEvaluationReport。get(this。beanFactory);report。recordEvaluationCandidates(event。getCandidateConfigurations());report。recordExclusions(event。getExclusions());}} 上面执行完之后回到我们开始说的入口Overridepublicvoidprocess(AnnotationMetadataannotationMetadata,DeferredImportSelectordeferredImportSelector){。。。进入目标方法AutoConfigurationEntryautoConfigurationEntry((AutoConfigurationImportSelector)deferredImportSelector)。getAutoConfigurationEntry(annotationMetadata);this。autoConfigurationEntries。add(autoConfigurationEntry);for(StringimportClassName:autoConfigurationEntry。getConfigurations()){this。entries。putIfAbsent(importClassName,annotationMetadata);}}privatefinalMapString,AnnotationMetadataentriesnewLinkedHashMap(); AutoConfigurationPackage 在来看EnableAutoConfiguration引入的另一个注解Target(ElementType。TYPE)Retention(RetentionPolicy。RUNTIME)DocumentedInheritedImport(AutoConfigurationPackages。Registrar。class)publicinterfaceAutoConfigurationPackage{String〔〕basePackages()default{};Classlt;?〔〕basePackageClasses()default{};}AutoConfigurationPackages。Registrar AutoConfigurationPackages。Registrar是AutoConfigurationPackages的内部类,源码如下。staticclassRegistrarimplementsImportBeanDefinitionRegistrar,DeterminableImports{OverridepublicvoidregisterBeanDefinitions(AnnotationMetadatametadata,BeanDefinitionRegistryregistry){register(registry,newPackageImports(metadata)。getPackageNames()。toArray(newString〔0〕));}OverridepublicSetObjectdetermineImports(AnnotationMetadatametadata){returnCollections。singleton(newPackageImports(metadata));}} 可以看到这个类,继承了ImportBeanDefinitionRegistrar,覆写了方法registerBeanDefinitions()。这个方法调用了外部类的register(),这里面参数中涉及到另一个内部类。这个类可以看下构造方法。publicvoidregisterBeanDefinitions(AnnotationMetadatametadata,BeanDefinitionRegistryregistry){register(registry,newPackageImports(metadata)。getPackageNames()。toArray(newString〔0〕));} 这里采用debug模式。前面判断是否存在配置basePackages或者basePackageClasses。如果都没有默认查启动类对应的包。 接下来回头看外部类的register()方法。这里会将刚才获取的包信息加入bd的属性 到这里大概的流程差不多已经清楚了,因为时间问题,我后面会在出一期关于springboot自动注入的内容。