ApplicationContextCentralinterfacetoprovideconfigurationforanapplication。Thisisreadonlywhiletheapplicationisrunning。 为应用程序提供配置的中央接口。在应用程序运行时,这是只读的,所以一旦启动我们就不能修改上下文了。SpringApplicationConfigurableApplicationContext方法:protectedConfigurableApplicationContextcreateApplicationContext(){Classlt;?contextClassthis。applicationContextClass;。。。。。。。省略return(ConfigurableApplicationContext)BeanUtils。instantiateClass(contextClass);} 所以SpringBoot返回的ApplicationContext是一个ConfigurableApplicationContext,所以后期我们可以强转类型BeanDefinitionABeanDefinitiondescribesabeaninstance,whichhaspropertyvalues,constructorargumentvalues,andfurtherinformationsuppliedbyconcreteimplementations。 描述了一个bean实例,它具有属性值、构造函数参数值和由具体实现提供的进一步信息。就是一个Bean的元信息。BeanDefinitionRegistryInterfaceforregistriesthatholdbeandefinitions,ThisistheonlyinterfaceinSpringsbeanfactorypackagesthatencapsulatesregistrationofbeandefinitions。ThestandardBeanFactoryinterfacesonlycoveraccesstoafullyconfiguredfactoryinstance。 这是Spring的beanfactory包中唯一封装bean定义注册的接口。包含bean定义的注册中心的接口BeanFactoryTherootinterfaceforaccessingaSpringbeancontainer。 用于访问Springbean容器的根接口。FactoryBeanInterfacetobeimplementedbyobjectsusedwithinaBeanFactorywhicharethemselvesfactoriesforinpidualobjects。Ifabeanimplementsthisinterface,itisusedasafactoryforanobjecttoexpose,notdirectlyasabeaninstancethatwillbeexposeditself。 主要是用户来自定义实例化bean的,可以自定义解析方式之类的EnvironmentInterfacerepresentingtheenvironmentinwhichthecurrentapplicationisrunning。 表示当前应用运行的环境,这个环境可以说是一大堆配置信息,包括我们的application。properties文件里的,和一堆系统的,和自定义实现的publicinterfaceEnvironmentextendsPropertyResolver{} 它继承了PropertyResolver,代表他可以设置PropertyResolver,就是一堆的配置信息(环境信息)。DefaultListableBeanFactorySpringsdefaultimplementationoftheConfigurableListableBeanFactoryandBeanDefinitionRegistryinterfaces:afullfledgedbeanfactorybasedonbeandefinitionmetadata,extensiblethroughpostprocessors。 Spring的ConfigurableListableBeanFactory和BeanDefinitionRegistry接口的默认实现:一个完全成熟的基于bean定义元数据的bean工厂,可通过后处理器扩展。 它可以说我我们的spring工厂,里面包含了所有的元信息EnvironmentPostProcessorAllowsforcustomizationoftheapplicationsEnvironmentpriortotheapplicationcontextbeingrefreshed。EnvironmentPostProcessorimplementationshavetoberegisteredinMETAINFspring。factories,usingthefullyqualifiednameofthisclassasthekey。 允许在刷新应用程序上下文之前自定义应用程序环境,启动的很早必须在METAINFspring中注册EnvironmentPostProcessor实现类,使用该类的完全限定名作为键。voidpostProcessEnvironment(ConfigurableEnvironmentenvironment,SpringApplicationapplication)可以获取启动时的environment和applicationEnvironmentAwareInterfacetobeimplementedbyanybeanthatwishestobenotifiedoftheEnvironmentthatitrunsin。 这个接口可以被任何bean使用,希望通知env在运行中需要做什么voidsetEnvironment(Environmentenvironment);可以获取Environment对象ApplicationContextInitializerCallbackinterfaceforinitializingaSpringConfigurableApplicationContextpriortobeingrefreshed。 用于在刷新(refresh())初始化SpringConfigurableApplicationContext之前,的回调接口。 这是一个用来初始化SpringConfigurableApplicationContext应用上下文的回调接口,设定的调用时机是在ConfigurableApplicationContextrefresh()调用之前。voidinitialize(CapplicationContext);可以获取spring启动时的上下文对象,就是ConfigurableApplicationContext。ImportBeanDefinitionRegistrarInterfacetobeimplementedbytypesthatregisteradditionalbeandefinitionswhenprocessingConfigurationclasses。Usefulwhenoperatingatthebeandefinitionlevel(asopposedtoBeanmethodinstancelevel)isdesiredornecessary。 AlongwithConfigurationandImportSelector,classesofthistypemaybeprovidedtotheImportannotation(ormayalsobereturnedfromanImportSelector)。 通常与Import注释使用,下面举个栗子Retention(RetentionPolicy。RUNTIME)Target(ElementType。TYPE)DocumentedImport(ApolloConfigRegistrar。class)publicinterfaceEnableApolloConfig{String〔〕value()default{ConfigConsts。NAMESPACEAPPLICATION};intorder()defaultOrdered。LOWESTPRECEDENCE;}publicclassApolloConfigRegistrarimplementsImportBeanDefinitionRegistrar{OverridepublicvoidregisterBeanDefinitions(AnnotationMetadataimportingClassMetadata,BeanDefinitionRegistryregistry){1。importingClassMetadata可以获取EnableApolloConfig的注解的元信息,比如字段属性例如:importingClassMetadata。getAnnotationAttributes(EnableApolloConfig。class。getName())2。registry可以手动注册一个bean,需要BeanDefinition,和类信息BeanDefinitionbeanDefinitionBeanDefinitionBuilder。genericBeanDefinition(NoRegisterService。class)。getBeanDefinition();registry。registerBeanDefinition(noRegisterService,beanDefinition);}} 主要方法publicvoidregisterBeanDefinitions(AnnotationMetadataimportingClassMetadata,BeanDefinitionRegistryregistry);可以获取注解类的元信息,自定义注解可以BeanDefinitionRegistryPostProcessorExtensiontothestandardBeanFactoryPostProcessorSPI,allowingfortheregistrationoffurtherbeandefinitionsbeforeregularBeanFactoryPostProcessordetectionkicksin。 扩展标准的BeanFactoryPostProcessorSPI,允许在常规的BeanFactoryPostProcessor检测开始之前注册更多的bean定义。voidpostProcessBeanDefinitionRegistry(BeanDefinitionRegistryregistry)throwsBeansException; 在应用程序上下文的标准初始化之后修改它的内部bean定义注册表。所有常规bean定义都已加载,但还没有实例化任何bean。这允许在下一个后处理阶段开始之(BeanFactoryPostProcessor)前添加更多的bean定义。BeanFactoryPostProcessorAllowsforcustommodificationofanapplicationcontextsbeandefinitions,adaptingthebeanpropertyvaluesofthecontextsunderlyingbeanfactory。 允许自定义修改应用程序上下文的bean定义,调整上下文的底层bean工厂的bean属性值。此时已经上下文启动好了。但是bean还没有被实例化,可以获取bean的BeanDefinition,voidpostProcessBeanFactory(ConfigurableListableBeanFactorybeanFactory)throwsBeansException; 他的实现类:PropertyResourceConfigurer可以快速的使用,并且简单的使用BeanPostProcessorFactoryhookthatallowsforcustommodificationofnewbeaninstances, 允许自定义修改新的bean实例,可以对bean进行一些动态的修改,在程序运行后,publicinterfaceBeanPostProcessor{defaultObjectpostProcessBeforeInitialization(Objectbean,StringbeanName)throwsBeansException{returnbean;}defaultObjectpostProcessAfterInitialization(Objectbean,StringbeanName)throwsBeansException{returnbean;}}ImportIndicatesoneormoreConfigurationclassestoimport。 ProvidesfunctionalityequivalenttotheelementinSpringXML。AllowsforimportingConfigurationclasses,ImportSelectorandImportBeanDefinitionRegistrarimplementations,aswellasregularcomponentclasses(asof4。2;analogoustoAnnotationConfigApplicationContext。register)。 指示要导入的一个或多个Configuration类。提供与SpringXML中的元素相同的功能。允许导入Configuration类,ImportSelector和ImportBeanDefinitionRegistrar实现,以及常规组件类(从4。2;类似于AnnotationConfigApplicationContext。register)。也就四种。。。。。。。