游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

springboot自动装配浅析

  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自动注入的内容。

赘婿宁毅苏檀儿有孩子吗宁毅苏檀儿第二次大婚迎大结局电视剧《赘婿》目前已经接近尾声了,宁毅和苏檀儿的感情生活一直都是大家的焦点,宁毅和苏檀儿最后有孩子了吗?宁毅和苏檀儿第二次大婚迎大结局,一起来看一下具体的情况。1赘婿宁毅苏檀儿……山河令张成岭喜欢谁张成岭结局是和谁走到一起了在电视剧《山河令》当中,张成岭其实是剧中的一个重要的角色,那么,张成岭在剧中的感情线是怎么样的呢?张成岭喜欢谁呢?张成岭结局是和谁走到一起了呢?一起来看一下具体的情况。1山河令……山河令周子舒什么时候摘下面具周子舒为什么要易容电视剧《山河令》正在热播当中,在这部剧当中,周子舒一出场就感觉奇丑无比,这是因为周子舒所做的易容术。那么,周子舒是什么是摘下来的面具呢?周子舒为什么要易容呢?一起来看一下具体的……假日暖洋洋侯昊身份是什么侯昊有钱吗是富二代吗近段时间,电视剧《假日暖洋洋》正在热播当中,在这部剧当中侯昊的真实身份是什么呢?侯昊真的有钱吗?侯昊是富二代吗?一起来看一下具体的情况。1假日暖洋洋侯昊身份是什么近段时间……假日暖洋洋高俊裕最后和谁在一起了高俊逸最后的结局是什么呢近日,假日暖洋洋应该是目前非常火的一部轻喜剧了,在剧中作为渣男任何的高俊裕备受大家的关注,高俊裕最后和谁在一起了呢?高俊逸最后的结局是什么呢?一起来看一下具体的情况。1假日暖洋……张家古楼到底多恐怖?里面究竟有什么?《终极笔记》这部网剧也是非常火的啊,口碑也是不错的,里面张家古楼也是一大看点吧,那么张家古楼到底有多恐怖啊?还有就是张家古楼这个章节看着也是很刺激的啊,那么里面究竟有什么是很多……巡回检察组的内鬼到底是谁内鬼有几个分别是谁之前《人民的名义》这部电视剧热播的时候评价和收视率都很不错,整部剧不仅三观正而且剧情值得反复揣摩,因此大结局的时候大家都是恋恋不舍。最近号称《人民的名义》姊妹篇的电视剧《巡回检……对标普拉多,国产硬派SUV就看它了,前中后三把锁放在10年前,硬派SUV一定是炙手可热的产品,但随着消费者需求的变化,硬派SUV慢慢地退掉了曾经的热度,经过几轮淘汰后,市面上剩下的硬派SUV可以说屈指可数,比如吉普牧马人、丰……关羽和张飞为何有子无妻?这两位大将军老婆,下场其实很惨三国很有意思,作为男人戏,将各路英雄刻画的淋漓尽致,唯有一样,却难倒各路诸侯:生儿子。三国刻意回避问题很多情节,让故事看上去大气磅礴。例如魏蜀吴三国势均力敌,为何独以刘备……苹果macOSMonterey12正式发布macOS12功能今天凌晨1点,苹果举行了WWDC21开发者大会,发布了5大新系统:iOS15、iPadOS15、watchOS8、tvOS15、macOS12。下面小编为大家带来macOS12……学校热水用空气源热泵热水机组,恒温还安全自我国《提倡兴办寄宿制学校》政策推行实施以来,寄宿制学校就在农村、高山、高原和牧区等义务教育资源分布分散、师资水平参差的地区广泛实施,从而实现优化农村教育资源配置,促进城乡教育……沙海霍秀秀扮演者吴雨橦演霍秀秀身份及个人资料图片沙海霍秀秀扮演者:吴雨橦演霍秀秀身份及个人资料图片在热门网剧《沙海》当中,霍家的一位接班人出现,名字是霍秀秀,此人是霍玲的侄女,和吴邪是小时候的玩伴,且和解雨臣是青梅竹马……
要2K分辨率还是要屏下镜头?网友们是这么说的,真的好有道理最近屏下镜头技术成为了新趋势,目前中兴、OPPO和小米均亮出了自家的屏下镜头技术,相信最近其他国产厂商也会迅速跟进,屏下镜头将会取代现在的挖孔屏,成为旗舰机标配。但是网友……100元微星B450主板,CPU核显跑分6万大战绝地求生竟能之前给AMD的锐龙4代APU处理器4350G挖了坑,没等闻到香气,就瞬间售罄。然后,悲催的价格从1030元涨到了1259元。映泰方面虽然送来了499元的B550MS……耐克联名Supreme可以,国货联名就很low?小米有品打破最近几年非常流行品牌与品牌的跨界联名,比如名创优品联名漫威,匡威联名J。W。Anderson、耐克联名supreme等等。这些品牌间的合作联名,都有一个期望目标,就是11……车险费改后,怎么判断事故走保险划算还是私了划算?(硬核知识)现如今汽车出行越来越普遍,出门办事旅游都会优先考虑汽车代步,但是不可避免的也会发生一些小事故,是不?现在的人法制观念都挺强的,掏出手机赶紧打交警电话打保险公司电话。但是如果在责……手机上的便签可以写多少字手机是很多人都在用的一种辅助工具,随着科学技术的不断进步,手机的功能也越来越强大,很多智能手机上都可以通过安装软件来获取更多的附加功能。便签软件是人们较为常用的一种记事工具,手……捷达VS7带你领略德系车的风采和硬核德系车一直以来都是大众心中品质的象征,德系车钢铁硬汉的形象印刻在每个人的心里,确实从我们开始对于汽车建立起概念的时候,德系车就一直身居高位,是性能和品质象征。也就是一直秉承着这……复旦复华黄金坑洗盘,调整接近尾声,行情何时启动?复旦复华日K线图如上图所示,经过一段时间的下跌后,主力资金开始介入,主力首先利用收敛三角形形态进行震荡吸筹,在吸筹结束后,主力放量突破了三角形上轨线进行试盘,由于上……人间最美四月天踏青出游正当时翼联EDUP2021年初夏团建之人间最美四月天,踏青出游正当时。4月17日,翼联EDUP全体员工欢聚深圳市坪山区金龟露营小镇,开展了为期一天的团建之旅。旅游大巴满载欢声笑语,向金龟露营小镇一路疾驰。公司……讨论个有趣的话题,我国四大名著能够获得诺贝尔奖吗?答案很遗憾,我国四大名著的作者都不能获得诺贝尔文学奖,原因很简单:诺贝尔文学奖只颁给活着的人,不追授!我国四大名著如果从文学水平上看,我国的四大名著能够得上诺贝尔文……潮趣单品ID。3上市上汽大众电动化提速01hr大众ID。3,一如初见。10月22日,上汽大众ID。3在线发布上市。新车提供纯净版、极智版、ID。初见版3个车型版本,综合补贴后售价159,888元173,888……城乡居民合作建房使用权全国第一证在承德桑园村落地承德日报6月9日上午,在滦平县政府一楼会议室,来自北京的市民韩建松从滦平县农村产权交易中心工作人员手中接过了001号《合作建房房屋使用权(租赁)鉴证书》。北京市民韩……任天堂明星大乱斗特别版全参战斗士科普介绍编号4960在前四期视频中,评测君介绍了《任天堂明星大乱斗特别版》的前48位参战斗士,那么今天评测君也会继续为大家带来49号斗士吃豆人到60号斗士隆的介绍。在本期会有很多有趣的参战斗士,想……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网