码迷,mamicode.com
首页 > 编程语言 > 详细

Spring-framework应用启动loadtime源码分析

时间:2017-10-09 10:57:01      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:bsh   nsf   eps   ued   cvs   finish   scp   msf   foj   

1,实例化DefaultListableBeanFactory
DefaultListableBeanFactory是AnnotationConfigApplicationContext的组件,DefaultListableBeanFactory在AnnotationConfigApplicationContext实例化时被实例化。在SpringApplication.createApplicationContext()判断实例化那种类型ApplicationContext。DefaultListableBeanFactory实例化stack如下
Thread [main] (Suspended (breakpoint at line 181 in DefaultListableBeanFactory))    
    DefaultListableBeanFactory.<init>() line: 181    
    AnnotationConfigApplicationContext(GenericApplicationContext).<init>() line: 109    
    AnnotationConfigApplicationContext.<init>() line: 64    
    NativeConstructorAccessorImpl.newInstance0(Constructor<?>, Object[]) line: not available [native method]    
    NativeConstructorAccessorImpl.newInstance(Object[]) line: 62    
    DelegatingConstructorAccessorImpl.newInstance(Object[]) line: 45    
    Constructor<T>.newInstance(Object...) line: 423    
    BeanUtils.instantiateClass(Constructor<T>, Object...) line: 146    
    BeanUtils.instantiateClass(Class<T>) line: 106    
    SpringApplication.createApplicationContext() line: 586    
    SpringApplication.run(String...) line: 321    
    SpringApplication.run(Class<?>[], String[]) line: 1245    
    SpringApplication.run(Class<?>, String...) line: 1233    
    Application.main(String[]) line: 51    
Spring应用启动首先加载所有由spring容器管理对象的类定义保存在DefaultListableBeanFactory.beanDefinitionMap和DefaultListableBeanFactory.beanDefinitionNames,beanDefinitionNames记录排序如下图。
技术分享
第一个注册的是org.springframework.context.annotation.internalConfigurationAnnotationProcessor,在AnnotationConfigApplicationContext对象创建时注册如下面stack
Thread [main] (Suspended (breakpoint at line 779 in DefaultListableBeanFactory))    
    DefaultListableBeanFactory.registerBeanDefinition(String, BeanDefinition) line: 779    
    AnnotationConfigApplicationContext(GenericApplicationContext).registerBeanDefinition(String, BeanDefinition) line: 324    
    AnnotationConfigUtils.registerPostProcessor(BeanDefinitionRegistry, RootBeanDefinition, String) line: 219    
    AnnotationConfigUtils.registerAnnotationConfigProcessors(BeanDefinitionRegistry, Object) line: 164    
    AnnotationConfigUtils.registerAnnotationConfigProcessors(BeanDefinitionRegistry) line: 135    
    AnnotatedBeanDefinitionReader.<init>(BeanDefinitionRegistry, Environment) line: 87    
    AnnotatedBeanDefinitionReader.<init>(BeanDefinitionRegistry) line: 70    
    AnnotationConfigApplicationContext.<init>() line: 65    
    NativeConstructorAccessorImpl.newInstance0(Constructor<?>, Object[]) line: not available [native method]    
    NativeConstructorAccessorImpl.newInstance(Object[]) line: 62    
    DelegatingConstructorAccessorImpl.newInstance(Object[]) line: 45    
    Constructor<T>.newInstance(Object...) line: 423    
    BeanUtils.instantiateClass(Constructor<T>, Object...) line: 146    
    BeanUtils.instantiateClass(Class<T>) line: 106    
    SpringApplication.createApplicationContext() line: 586    
    SpringApplication.run(String...) line: 321    
    SpringApplication.run(Class<?>[], String[]) line: 1245    
    SpringApplication.run(Class<?>, String...) line: 1233    
    Application.main(String[]) line: 51    
AnnotationConfigUtils注册容器级processors,源码截图
技术分享
 
2,SpringApplication.prepareContext()
spring-boot启动添加不由容器管理的BeanFactoryPostProcessor,实例化后直接保存在AbstractApplicationContext.beanFactoryPostProcessors。BeanFactoryPostProcessor包括以下
org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer$ConfigurationWarningsPostProcessor
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer$CachingMetadataReaderFactoryPostProcessor
org.springframework.boot.context.config.ConfigFileApplicationListener$PropertySourceOrderingPostProcessor
Thread [main] (Suspended (breakpoint at line 477 in AbstractApplicationContext))    
    AnnotationConfigApplicationContext(AbstractApplicationContext).addBeanFactoryPostProcessor(BeanFactoryPostProcessor) line: 477    
    ConfigurationWarningsApplicationContextInitializer.initialize(ConfigurableApplicationContext) line: 60    
    SpringApplication.applyInitializers(ConfigurableApplicationContext) line: 624    
    SpringApplication.prepareContext(ConfigurableApplicationContext, ConfigurableEnvironment, SpringApplicationRunListeners, ApplicationArguments, Banner) line: 364    
    SpringApplication.run(String...) line: 325    
    SpringApplication.run(Class<?>[], String[]) line: 1245    
    SpringApplication.run(Class<?>, String...) line: 1233    
    Application.main(String[]) line: 51    
注册完内部处理器类定义后再到用户级入口类定义注册,application是用户级的顶层类。
Thread [main] (Suspended (breakpoint at line 779 in DefaultListableBeanFactory))    
    DefaultListableBeanFactory.registerBeanDefinition(String, BeanDefinition) line: 779    
    AnnotationConfigApplicationContext(GenericApplicationContext).registerBeanDefinition(String, BeanDefinition) line: 324    
    BeanDefinitionReaderUtils.registerBeanDefinition(BeanDefinitionHolder, BeanDefinitionRegistry) line: 150    
    AnnotatedBeanDefinitionReader.doRegisterBean(Class<T>, Supplier<T>, String, Class<Annotation>[], BeanDefinitionCustomizer...) line: 246    
    AnnotatedBeanDefinitionReader.registerBean(Class<?>) line: 145    
    AnnotatedBeanDefinitionReader.register(Class<?>...) line: 135    
    BeanDefinitionLoader.load(Class<?>) line: 159    
    BeanDefinitionLoader.load(Object) line: 135    
    BeanDefinitionLoader.load() line: 127    
    SpringApplication.load(ApplicationContext, Object[]) line: 692    
    SpringApplication.prepareContext(ConfigurableApplicationContext, ConfigurableEnvironment, SpringApplicationRunListeners, ApplicationArguments, Banner) line: 381    
    SpringApplication.run(String...) line: 325    
    SpringApplication.run(Class<?>[], String[]) line: 1245    
    SpringApplication.run(Class<?>, String...) line: 1233    
    Application.main(String[]) line: 51    
 
3,AbstractApplicationContext.prepareBeanFactory()
准备容器beanFactory对象,添加两个必要beanPostProcessor到DefaultListableBeanFactory.beanPostProcessors,分别是org.springframework.context.support.ApplicationContextAwareProcessor和org.springframework.context.support.ApplicationListenerDetector,用于后面其它对象实例化时调用,每个beanPostProcessor有不能的增加功能。DefaultListableBeanFactory.createBean()执行时在适当时执行beanPostProcessors对应方法。参照文档Customizing beans using a BeanPostProcessor
Thread [main] (Suspended (breakpoint at line 849 in AbstractBeanFactory))    
    owns: Object  (id=74)    
    DefaultListableBeanFactory(AbstractBeanFactory).addBeanPostProcessor(BeanPostProcessor) line: 849    
    AnnotationConfigApplicationContext(AbstractApplicationContext).prepareBeanFactory(ConfigurableListableBeanFactory) line: 633    
    AnnotationConfigApplicationContext(AbstractApplicationContext).refresh() line: 517    
    SpringApplication.refresh(ApplicationContext) line: 750    
    SpringApplication.refreshContext(ConfigurableApplicationContext) line: 386    
    SpringApplication.run(String...) line: 327    
    SpringApplication.run(Class<?>[], String[]) line: 1245    
    SpringApplication.run(Class<?>, String...) line: 1233    
    Application.main(String[]) line: 51    
 
 
4,AbstractApplicationContext.invokeBeanFactoryPostProcessors()
invokeBeanFactoryPostProcessors()方法在AnnotationConfigApplicationContext(AbstractApplicationContext).refresh()被调用。实例化注册在DefaultListableBeanFactory.beanDefinitionNames容器级BeanFactoryPostProcessors如org.springframework.context.annotation.internalConfigurationAnnotationProcessor等。参照文档Customizing configuration metadata with a BeanFactoryPostProcessor执行所有BeanFactoryPostProcessor.postProcessBeanFactory()如下图:
技术分享
注册org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory
Thread [main] (Suspended (breakpoint at line 779 in DefaultListableBeanFactory))    
    owns: Object  (id=83)    
    DefaultListableBeanFactory.registerBeanDefinition(String, BeanDefinition) line: 779    
    SharedMetadataReaderFactoryContextInitializer$CachingMetadataReaderFactoryPostProcessor.register(BeanDefinitionRegistry) line: 90    
    SharedMetadataReaderFactoryContextInitializer$CachingMetadataReaderFactoryPostProcessor.postProcessBeanDefinitionRegistry(BeanDefinitionRegistry) line: 83    
    PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory, List<BeanFactoryPostProcessor>) line: 69    
    AnnotationConfigApplicationContext(AbstractApplicationContext).invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory) line: 686    
    AnnotationConfigApplicationContext(AbstractApplicationContext).refresh() line: 524    
    SpringApplication.refresh(ApplicationContext) line: 750    
    SpringApplication.refreshContext(ConfigurableApplicationContext) line: 386    
    SpringApplication.run(String...) line: 327    
    SpringApplication.run(Class<?>[], String[]) line: 1245    
    SpringApplication.run(Class<?>, String...) line: 1233    
    Application.main(String[]) line: 51   
实例化ConfigurationClassPostProcessor,这是BeanFactoryPostProcessor 
Thread [main] (Suspended (modification of field sourceExtractor in ConfigurationClassPostProcessor))    
    owns: ConcurrentHashMap<K,V>  (id=2116)    
    owns: Object  (id=2117)    
    ConfigurationClassPostProcessor.<init>() line: 95    
    NativeConstructorAccessorImpl.newInstance0(Constructor<?>, Object[]) line: not available [native method]    
    NativeConstructorAccessorImpl.newInstance(Object[]) line: 62    
    DelegatingConstructorAccessorImpl.newInstance(Object[]) line: 45    
    Constructor<T>.newInstance(Object...) line: 423    
    BeanUtils.instantiateClass(Constructor<T>, Object...) line: 146    
    CglibSubclassingInstantiationStrategy(SimpleInstantiationStrategy).instantiate(RootBeanDefinition, String, BeanFactory) line: 88    
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).instantiateBean(String, RootBeanDefinition) line: 1235    
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBeanInstance(String, RootBeanDefinition, Object[]) line: 1142    
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 542    
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 498    
    DefaultListableBeanFactory(AbstractBeanFactory).lambda$doGetBean$0(String, RootBeanDefinition, Object[]) line: 305    
    2099051403.getObject() line: not available    
    DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory<?>) line: 233    
    DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class<T>, Object[], boolean) line: 303    
    DefaultListableBeanFactory(AbstractBeanFactory).getBean(String, Class<T>) line: 198    
    PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory, List<BeanFactoryPostProcessor>) line: 88    
    AnnotationConfigApplicationContext(AbstractApplicationContext).invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory) line: 686    
    AnnotationConfigApplicationContext(AbstractApplicationContext).refresh() line: 524    
    SpringApplication.refresh(ApplicationContext) line: 750    
    SpringApplication.refreshContext(ConfigurableApplicationContext) line: 386    
    SpringApplication.run(String...) line: 327    
    SpringApplication.run(Class<?>[], String[]) line: 1245    
    SpringApplication.run(Class<?>, String...) line: 1233    
    Application.main(String[]) line: 51    
如果使用kafka配置,注册kafka处理器类定义,KafkaListenerAnnotationBeanPostProcessor对象定义注册在DefaultListableBeanFactory.registerBeanDefinition(),使用名称为KafkaListenerConfigUtils.KAFKA_LISTENER_ANNOTATION_PROCESSOR_BEAN_NAME,如下列stack:
Thread [main] (Suspended (breakpoint at line 779 in DefaultListableBeanFactory))    
    owns: Object  (id=130)    
    DefaultListableBeanFactory.registerBeanDefinition(String, BeanDefinition) line: 779    
    ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(BeanMethod) line: 262    
    ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClass, ConfigurationClassBeanDefinitionReader$TrackedConditionEvaluator) line: 141 
    ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(Set<ConfigurationClass>) line: 117    
    ConfigurationClassPostProcessor.processConfigBeanDefinitions(BeanDefinitionRegistry) line: 320    
    ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(BeanDefinitionRegistry) line: 229    
    PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(Collection<BeanDefinitionRegistryPostProcessor>, BeanDefinitionRegistry) line: 271    
    PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory, List<BeanFactoryPostProcessor>) line: 94    
    AnnotationConfigApplicationContext(AbstractApplicationContext).invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory) line: 686    
    AnnotationConfigApplicationContext(AbstractApplicationContext).refresh() line: 524    
    SpringApplication.refresh(ApplicationContext) line: 750    
    SpringApplication.refreshContext(ConfigurableApplicationContext) line: 386    
    SpringApplication.run(String...) line: 327    
    SpringApplication.run(Class<?>[], String[]) line: 1245    
    SpringApplication.run(Class<?>, String...) line: 1233    
    Application.main(String[]) line: 51    
 
5,AbstractApplicationContext.registerBeanPostProcessors()
实例化和添加更多beanProcessor,包括实例化DefaultListableBeanFactory时注册在DefaultListableBeanFactory.beanDefinitionNames的org.springframework.context.annotation.internalAutowiredAnnotationProcessor等processor。部分beanProcessor如下
org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor@34448e6c 
org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor@435ce306
org.springframework.context.annotation.CommonAnnotationBeanPostProcessor@907f2b7
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor@1ce93c18
org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor@60e9df3c
 
6,AbstractApplicationContext).finishBeanFactoryInitialization() 
实例化余下非延时加载单列对象,单列对象保存在DefaultSingletonBeanRegistry.singletonObjects
首先实例化LoadTimeWeaverAware类,如LocalContainerEntityManagerFactoryBean类实例化,源码如下
技术分享
其他类实例化源码如下
技术分享
Thread [main] (Suspended (breakpoint at line 64 in MethodKafkaListenerEndpoint))    
    owns: ConcurrentHashMap<K,V>  (id=86)    
    owns: Object  (id=87)    
    MethodKafkaListenerEndpoint<K,V>.setBean(Object) line: 64    
    KafkaListenerAnnotationBeanPostProcessor<K,V>.processListener(MethodKafkaListenerEndpoint<?,?>, KafkaListener, Object, Object, String) line: 377    
    KafkaListenerAnnotationBeanPostProcessor<K,V>.processKafkaListener(KafkaListener, Method, Object, String) line: 340    
    KafkaListenerAnnotationBeanPostProcessor<K,V>.postProcessAfterInitialization(Object, String) line: 270    
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).applyBeanPostProcessorsAfterInitialization(Object, String) line: 435    
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).initializeBean(String, Object, RootBeanDefinition) line: 1721    
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 581    
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 498    
    DefaultListableBeanFactory(AbstractBeanFactory).lambda$doGetBean$0(String, RootBeanDefinition, Object[]) line: 305    
    2099051403.getObject() line: not available    
    DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory<?>) line: 233    
    DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class<T>, Object[], boolean) line: 303    
    DefaultListableBeanFactory(AbstractBeanFactory).getBean(String, Class<T>) line: 198    
    CommonAnnotationBeanPostProcessor.autowireResource(BeanFactory, CommonAnnotationBeanPostProcessor$LookupElement, String) line: 512    
    CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor$LookupElement, String) line: 483    
    CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(Object, String) line: 617    
    CommonAnnotationBeanPostProcessor$ResourceElement(InjectionMetadata$InjectedElement).inject(Object, String, PropertyValues) line: 172    
    InjectionMetadata.inject(Object, String, PropertyValues) line: 89    
    CommonAnnotationBeanPostProcessor.postProcessPropertyValues(PropertyValues, PropertyDescriptor[], Object, String) line: 317    
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).populateBean(String, RootBeanDefinition, BeanWrapper) line: 1353    
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 579    
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 498    
    DefaultListableBeanFactory(AbstractBeanFactory).lambda$doGetBean$0(String, RootBeanDefinition, Object[]) line: 305    
    2099051403.getObject() line: not available    
    DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory<?>) line: 233    
    DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class<T>, Object[], boolean) line: 303    
    DefaultListableBeanFactory(AbstractBeanFactory).getBean(String, Class<T>) line: 198    
    CommonAnnotationBeanPostProcessor.autowireResource(BeanFactory, CommonAnnotationBeanPostProcessor$LookupElement, String) line: 512    
    CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor$LookupElement, String) line: 483    
    CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(Object, String) line: 617    
    CommonAnnotationBeanPostProcessor$ResourceElement(InjectionMetadata$InjectedElement).inject(Object, String, PropertyValues) line: 172    
    InjectionMetadata.inject(Object, String, PropertyValues) line: 89    
    CommonAnnotationBeanPostProcessor.postProcessPropertyValues(PropertyValues, PropertyDescriptor[], Object, String) line: 317    
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).populateBean(String, RootBeanDefinition, BeanWrapper) line: 1353    
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 579    
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 498    
    DefaultListableBeanFactory(AbstractBeanFactory).lambda$doGetBean$0(String, RootBeanDefinition, Object[]) line: 305    
    2099051403.getObject() line: not available    
    DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory<?>) line: 233    
    DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class<T>, Object[], boolean) line: 303    
    DefaultListableBeanFactory(AbstractBeanFactory).getBean(String) line: 193    
    DefaultListableBeanFactory.preInstantiateSingletons() line: 747    
    AnnotationConfigApplicationContext(AbstractApplicationContext).finishBeanFactoryInitialization(ConfigurableListableBeanFactory) line: 861    
    AnnotationConfigApplicationContext(AbstractApplicationContext).refresh() line: 542    
    SpringApplication.refresh(ApplicationContext) line: 750    
    SpringApplication.refreshContext(ConfigurableApplicationContext) line: 386    
    SpringApplication.run(String...) line: 327    
    SpringApplication.run(Class<?>[], String[]) line: 1245    
    SpringApplication.run(Class<?>, String...) line: 1233    
    Application.main(String[]) line: 51   

Spring-framework应用启动loadtime源码分析

标签:bsh   nsf   eps   ued   cvs   finish   scp   msf   foj   

原文地址:http://www.cnblogs.com/birdstudio/p/7639887.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!