1. 程式人生 > >spring原始碼學習——ConfigurationClassBeanDefinition

spring原始碼學習——ConfigurationClassBeanDefinition

本文難免會有錯誤,如有錯誤,歡迎指出

什麼是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解析完畢