詳しく書いてあるところが見当たらなかったので単にコードを追った
完全に個人的なメモ
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$ConfigurationClassBeanDefinitionConfigurationClassBeanDefinitionReader.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が呼ばれる