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个了;