Springboot启动可以分为两个阶段。1是在调用AbstractApplicationContext的refresh方法之前,调用AbstractApplicationContext的refresh。我们知道AbstractApplicationContext的refresh方法是一个模板方法。几乎所有类型的ApplicationContext的初始化都是围绕这个refresh方法进行的。1、refresh方法之前1.1ApplicationContextInitializer是Springboot***调用的一个类,主要是初始化一些BeanFactoryPostProcessor(后面介绍),或者是Application初始化的时候需要做的一些事情。而这些类通过扫描casspath路径下的META-INF/spring.factories文件中的org.springframework.context.ApplicationContextInitializer词来加载类的全路径名,通过反射获取对象,然后调用initialize方法。1.2ApplicationListener这个和ApplicationContextInitializer的加载方式类似,也是从META-INF/spring.factories文件配置的。它的主要作用是在Springboot初始化的不同阶段对不同的事件(ApplicationEvent及其子类)进行惩罚,而这些监听器控制器会根据自身对不同事件的触发完成自己的处理逻辑。例如,ConfigFileApplicationListener负责加载配置文件。当然也可以通过其他方式添加到beanFactory中。具体可以参考beanFactory添加BeanFactoryPostProcessor的方法1.ApplicationListener的一些事件在ApplicationContextInitializer之前触发。注入。2.refresh方法是spring的模板方法。有3个重要的接口2.1BeanFactoryPostProcessorpublicinterfaceBeanFactoryPostProcessor{voidpostProcessBeanFactory(ConfigurableListableBeanFactorybeanFactory)throwsBeansException;}这个方法是对beanFactory进行一些自定义的操作,比如添加一些bean等,当然前提是我们定义的bean在beanFactory中。有许多办法可以做到在ApplicationContextInitializer中定义加入,例如publicclassMyContextInitializerimplementsApplicationContextInitializer{publicvoidinitialize(ConfigurableApplicationContextapplicationContext){applicationContext.addBeanFactoryPostProcessor(newMyBeanFactoryPostProcessor());}}通过其他BeanFactoryPostProcessor加入,可以通过注解@Import或者加载XML)例如通过@Import(value={AnnotationBeanDefinitionRegistrar.class})@ConfigurationpublicclassAnnotationBeanDefinitionRegistrarimplementsImportBeanDefinitionRegistrar{privateStringBEAN_NAME="annotationBeanPostProcessor";publicvoidregisterBeanDefinitions(AnnotationMetadataimportingClassMetadata,BeanDefinitionRegistryregistry){ListbasePackages=getPackagesToScan(importingClassMetadata);if(!registry.containsBeanDefinition(BEAN_NAME)){addPostProcessor(registry,basePackages);}}privatevoidaddPostProcessor(BeanDefinitionRegistryregistry,ListbasePackages){GenericBeanDefinitionbeanDefinition=newGenericBeanDefinition();beanDefinition.setBeanClass(AnnotationBeanPostProcessor.class);beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(basePackages);beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);registry.registerBeanDefinition(BEAN_NAME,beanDefinition);}privateListgetPackagesToScan(AnnotationMetadatametadata){AnnotationAttributesattributes=AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(EnableDubbo.class.getName()));String[]basePackages=atgetStringArray("basePackages");返回Arrays.asList(basePackages);}}这样,我们就可以添加我们自定义的BeanFactoryPostProcessor,在Bean注册层面进行开发2.2BeanPostProcessorpublicinterfaceBeanPostProcess或{ObjectpostProcessBeforeInitialization(Objectbean,StringbeanName)throwsBeansException;ObjectpostProcessAfterInitialization(Objectbean,StringbeanName)throwsBeansException;}这个接口主要是bean实例化前后的一些自定义开发,一般只针对某个接口或者某个注解进行批量操作3.概述1.如果需要做SpringApplication初始化的时候,使用ApplicationContextInitializer2.如果需要在SpringApplication的特定阶段做一些事情,使用ApplicationListener(推荐)3.如果需要在beanFactory级别做一些开发,使用BeanFactoryPostProcessor(推荐)4.如果需要在某个bean的实例化层面开发,使用BeanPostProcessor(一般业务开发用InitializingBean或者init-method就可以满足)。转载请注明出处:https://my.oschina.net/u/3039671/blog/852211使用dubbo码云的Springboot风格示例:https://git.oschina.net/null_584_3382/spring-dubbo-parentgithub:https://github.com/Athlizo/spring-dubbo-parent