系列十五、BeanDefinition

一、BeanDefinition

1.1、概述

         BeanDefinition是一个接口,主要负责存储bean的定义信息,决定bean的生产方式,类似于说明书。后续BeanFactory就可以根据这些信息生产bean了。比如实例化:可以通过反射得到实例对象;比如:lazy,则不会在IOC加载的时候创建bean;

1.2、存储bean定义信息的时机

说明:以下代码是基于注解的方式

第一步:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MySpringConfig.class);

第二步:

系列十五、BeanDefinition_第1张图片

第三步:

系列十五、BeanDefinition_第2张图片

第四步:

系列十五、BeanDefinition_第3张图片

第五步:

系列十五、BeanDefinition_第4张图片

第六步:

系列十五、BeanDefinition_第5张图片

private  void doRegisterBean(Class beanClass, @Nullable String name,
		@Nullable Class[] qualifiers, @Nullable Supplier supplier,
		@Nullable BeanDefinitionCustomizer[] customizers) {

	AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(beanClass);
	if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {
		return;
	}

	abd.setInstanceSupplier(supplier);
	ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);
	abd.setScope(scopeMetadata.getScopeName());
	String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));

	AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
	if (qualifiers != null) {
		for (Class qualifier : qualifiers) {
			if (Primary.class == qualifier) {
				abd.setPrimary(true);
			}
			else if (Lazy.class == qualifier) {
				abd.setLazyInit(true);
			}
			else {
				abd.addQualifier(new AutowireCandidateQualifier(qualifier));
			}
		}
	}
	if (customizers != null) {
		for (BeanDefinitionCustomizer customizer : customizers) {
			customizer.customize(abd);
		}
	}

	BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
	definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
	BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
}

1.3、类比小汽车的制造过程

系列十五、BeanDefinition_第6张图片

你可能感兴趣的:(Spring5系列,java,spring)