詳しく書いてあるところが見当たらなかったので単にコードを追った
完全に個人的なメモ
tl;dr
最終的に DefaultSingletonBeanRegistry
で持ってそう
spring.pleiades.io
バージョン
- Spring Boot 3.1.5
- Spring Framework 6.0.13
コード
data class Example(val value: String) @Configuration class ExampleConfig { @Bean fun exampleA(): Example { return Example( value = "ExampleA", ) } }
メモ
SpringApplication#run
が呼ばれる(省略)SpringApplication#refreshContext
が呼ばれるSpringApplication#refresh
が呼ばれるapplicationContext.refresh()
が呼ばれるServletWebServerApplicationContext#refresh
が呼ばれるServletWebServerApplicationContext
->GenericWebApplicationContext
->GenericApplicationContext
->AbstractApplicationContext
の継承関係でAbstractApplicationContext#refresh
が呼ばれるAbstractApplicationContext#finishBeanFactoryInitialization
が呼ばれる- ここの
beanFactory
はGenericApplicationContext
がDefaultListableBeanFactory
をbeanFactory
として持っているので
AbstractApplicationContext#obtainFreshBeanFactory
で取得した場合にそれが返される
なので、DefaultListableBeanFactory#preInstantiateSingletons
が呼ばれる DefaultListableBeanFactory
->AbstractAutowireCapableBeanFactory
->AbstractBeanFactory
の継承関係で、factoryBean
じゃないので、AbstractBeanFactory#getBean
が呼ばれる- https://github.com/spring-projects/spring-framework/blob/v6.0.13/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java#L199
mbd
はConfigurationClassBeanDefinitionReader$ConfigurationClassBeanDefinition
ConfigurationClassBeanDefinitionReader.ConfigurationClassBeanDefinition
->org.springframework.beans.factory.support.RootBeanDefinition
->AbstractBeanDefinition
- の継承関係で
org.springframework.beans.factory.support.AbstractBeanDefinition#isSingleton
でSingletonかをチェックしている
- の継承関係で
DefaultSingletonBeanRegistry#getSingleton
が呼ばれる- 渡した
singletonFactory
がAbstractBeanFactory
のlambdaなので、
内部処理してcreateBean
を呼び出す DefaultListableBeanFactory
->AbstractAutowireCapableBeanFactory
の継承関係でAbstractAutowireCapableBeanFactory#createBean
が呼ばれるAbstractAutowireCapableBeanFactory#doCreateBean
が呼ばれるAbstractAutowireCapableBeanFactory#createBeanInstance
が呼ばれるAbstractAutowireCapableBeanFactory#instantiateUsingFactoryMethod
が呼ばれるConstructorResolver#instantiateUsingFactoryMethod
が呼ばれる ここで呼び出すfactoryMethod
が検出されているConstructorResolver#instantiate
が呼ばれるSimpleInstantiationStrategy#instantiate
が呼ばれる- さっき検出した
factoryMethod.invoke
が呼ばれる
で、ここでリフレクションしてメソッドへアクセスしてExampleConfig#exampleA
が呼ばれる DefaultSingletonBeanRegistry
まで帰ってきてDefaultSingletonBeanRegistry#addSingleton
が呼ばれる