Spring-framework应用程序启动loadtime源码分析笔记(一)
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
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
7,一个普通Spring-framework应用程序实例化的类对象
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.annotation.internalPersistenceAnnotationProcessor
application
org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory
producer
kafkaConsumerConfig
kafkaProducerConfig
orderService
transactionDataSourceConfiguration
transactionService
userDataSourceConfiguration
userService
org.springframework.kafka.annotation.KafkaBootstrapConfiguration
org.springframework.kafka.config.internalKafkaListenerAnnotationProcessor
org.springframework.kafka.config.internalKafkaListenerEndpointRegistry
kafkaListenerContainerFactory
consumerFactory
consumerConfigs
producerFactory
producerConfigs
kafkaTemplate
transactionDataSourceProperties
transactionDataSource
transactionEntityManagerFactory
transactionManager
org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension#0
emBeanDefinitionRegistrarPostProcessor
jpaMappingContext
jpaContext
transactionRepository
userDataSourceProperties
userDataSource
userEntityManagerFactory
userTransactionManager
userRepository
updatesAppliedRepository
org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration
org.springframework.transaction.config.internalTransactionAdvisor
transactionAttributeSource
transactionInterceptor
org.springframework.transaction.config.internalTransactionalEventListenerFactory
org.springframework.jms.annotation.JmsBootstrapConfiguration
org.springframework.jms.config.internalJmsListenerAnnotationProcessor
org.springframework.jms.config.internalJmsListenerEndpointRegistry
queue
org.springframework.boot.autoconfigure.AutoConfigurationPackages
org.springframework.aop.config.internalAutoProxyCreator
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration
org.springframework.boot.autoconfigure.condition.BeanTypeRegistry
propertySourcesPlaceholderConfigurer
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration
jsonComponentModule
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration
mbeanExporter
objectNamingStrategy
mbeanServer
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration$CglibAutoProxyConfiguration
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration
spring.jta-org.springframework.boot.autoconfigure.transaction.jta.JtaProperties
org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor
org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.store
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration
persistenceExceptionTranslationPostProcessor
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration
spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties
org.springframework.boot.autoconfigure.jms.activemq.ActiveMQConnectionFactoryConfiguration
jmsConnectionFactory
org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration$MessagingTemplateConfiguration
jmsMessagingTemplate
org.springframework.boot.autoconfigure.jms.JmsAnnotationDrivenConfiguration
jmsListenerContainerFactoryConfigurer
jmsListenerContainerFactory
org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration
spring.jms-org.springframework.boot.autoconfigure.jms.JmsProperties
org.springframework.boot.autoconfigure.kafka.KafkaAnnotationDrivenConfiguration
kafkaListenerContainerFactoryConfigurer
org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration
spring.transaction-org.springframework.boot.autoconfigure.transaction.TransactionProperties
org.springframework.orm.jpa.SharedEntityManagerCreator#0
org.springframework.orm.jpa.SharedEntityManagerCreator#1