spring原始碼學習——ConfigurationClassBeanDefinition
阿新 • • 發佈:2018-12-17
本文難免會有錯誤,如有錯誤,歡迎指出
什麼是ConfigurationClassBeanDefinition
在@Configuration註解的類中,使用@Bean註解例項化的Bean,其定義會用ConfigurationClassBeanDefinition儲存
ConfigurationClassBeanDefinition的預設設定
1、如果@Bean註解沒有指定bean的名字,預設會用方法的名字命名bean
2、@Configuration註解的類會成為一個工廠類,而所有的@Bean註解的方法會成為工廠方法,通過工廠方法例項化Bean,而不是直接通過建構函式初始化
3、@Bean註解註釋的類會使用建構函式自動裝配
原始碼
ConfigurationClassBeanDefinition是一個內部類,其外部類是ConfigurationClassBeanDefinitionReader,這個類負責將@Bean註解的方法轉換為對應的ConfigurationClassBeanDefinition類,原始碼就不過多解釋了,和之前幾個BeanDefinition差不多
private static class ConfigurationClassBeanDefinition extends RootBeanDefinition implements AnnotatedBeanDefinition { 可以獲得註解相關的資訊 private final AnnotationMetadata annotationMetadata; 可以獲得工廠方法相關的資訊 private final MethodMetadata factoryMethodMetadata; public ConfigurationClassBeanDefinition(ConfigurationClass configClass, MethodMetadata beanMethodMetadata) { this.annotationMetadata = configClass.getMetadata(); this.factoryMethodMetadata = beanMethodMetadata; setLenientConstructorResolution(false); } public ConfigurationClassBeanDefinition( RootBeanDefinition original, ConfigurationClass configClass, MethodMetadata beanMethodMetadata) { super(original); this.annotationMetadata = configClass.getMetadata(); this.factoryMethodMetadata = beanMethodMetadata; } private ConfigurationClassBeanDefinition(ConfigurationClassBeanDefinition original) { super(original); this.annotationMetadata = original.annotationMetadata; this.factoryMethodMetadata = original.factoryMethodMetadata; } @Override public AnnotationMetadata getMetadata() { return this.annotationMetadata; } @Override public MethodMetadata getFactoryMethodMetadata() { return this.factoryMethodMetadata; } @Override public boolean isFactoryMethod(Method candidate) { return (super.isFactoryMethod(candidate) && BeanAnnotationHelper.isBeanAnnotated(candidate)); } @Override public ConfigurationClassBeanDefinition cloneBeanDefinition() { return new ConfigurationClassBeanDefinition(this); } }
至此,所有的BeanDefinition解析完畢