spring bean 生命周期 2 (spring5.0版本)

spring bean 生命周期1
上一篇spring bean 生命周期主要分析了this()方法;
本主要讲如下的register(componentClasses)方法;

	public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
     
		this();
		register(componentClasses);
		refresh();
	}

跟踪register(componentClasses)到以下方法:
注解写在了方法上

private <T> void doRegisterBean(Class<T> beanClass, @Nullable String name,
			@Nullable Class<? extends Annotation>[] qualifiers, @Nullable Supplier<T> supplier,
			@Nullable BeanDefinitionCustomizer[] customizers) {
     
			
		//这里是给我们自己的beanclass注册成AnnotatedGenericBeanDefinition(简称bd)
		//注意这里的bd是AnnotatedGenericBeanDefinition类型
		//并且会把类上的注解全部找出来存到该bd的metadata的map中
		AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(beanClass);
		
		//conditionEvaluator是专门用来校验@conditional注解的bean,这里调用
		//shouldSkip方法,判断该bd是否有@conditional注解,有的话就要判断注解
		//里的属性数组condition的matches是否都满足条件,都满足就往下走执行代码
		//本文例子中该class是没加@conditional注解,所以这个判断返回false
		if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {
     
			return;
		}

		abd.setInstanceSupplier(supplier);

		//这里是给bd设置scope,如果我们配了@scope注解,配成"prototype"这个
		//那么就会bd的setScope()设置成"prototype",本文默认是单例也就是
		//bd中的scope值为singleton
		ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);
		abd.setScope(scopeMetadata.getScopeName());
		//获取beanName
		String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));
		
		//这里是判断该class是否有,加注解:lazy,Primary,Role,Description
		//有的话给对应的bd的属性设置对应的值,
		AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
		//默认这里不会走
		if (qualifiers != null) {
     
			for (Class<? extends Annotation> 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);
			}
		}
		
		//给bd包装了一成对象BeanDefinitionHolder 
		BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
		
		//判断是否要给scope注解生成个代理的ScopedProxyMode默认为No不需要
		definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
		
		//这里把bd注册到beanfactory的bdmap中如果该bd的alias(别名)存在
		//还会把他的beanname和alias存到beanfactory的aliasMap中
		BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
	}

基本上 register(componentClasses);大致都讲完了;
总结:
register(componentClasses)方式进行注册bd,这时候beanfactory中多了一个bd总共就有6个了;

你可能感兴趣的:(spring源码,java,spring)