不要问我阅读spring源码有什么用,问就是没有用,只是让我本身使用spring的过程当中自信点!java
spring-相关文章spring
直接看代码app
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
//这里在上篇已经说过了,主要是注册了几个spring内部的bean
this();
//本文的主要内容为下面这句的代码
register(annotatedClasses);
refresh();
}
复制代码
public void register(Class<?>... annotatedClasses) {
Assert.notEmpty(annotatedClasses, "At least one annotated class must be specified");
//这个读取器应该记得是 AnnotationConfigApplicationContext 的无参构造器中建立的吧,里面有一个注册器
this.reader.register(annotatedClasses);
}
复制代码
public void register(Class<?>... annotatedClasses) {
for (Class<?> annotatedClass : annotatedClasses) {
// 这里
registerBean(annotatedClass);
}
}
复制代码
<T> void doRegisterBean(Class<T> annotatedClass, @Nullable Supplier<T> instanceSupplier, @Nullable String name, @Nullable Class<? extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) {
//annotatedClass为你传递的参数,也就是本身的配置类
//这个地方根据你的配置类的class类型去建立一个beanDefinition
//之前额文章中我记得我说过 beanDefinition 是对bean 的描述,就行是Class 是对类的描述同样,只不过可能里面东西多了点
AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);
//这个地方是判断当前类是否被Conditional注释
if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {
return;
}
abd.setInstanceSupplier(instanceSupplier);
ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);
//设置做用于 默认为singleton
abd.setScope(scopeMetadata.getScopeName());
//获取beanNam
String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));
//设置一些属性,例如Primary ,懒加载之类
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));
}
}
}
for (BeanDefinitionCustomizer customizer : definitionCustomizers) {
customizer.customize(abd);
}
//建立beanDefinition 的持有者,其实呢也就是对beanDefinition进行封装
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
//注册beanDefinition
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
}
复制代码
解释beanDefinitionide
public AnnotatedGenericBeanDefinition(Class<?> beanClass) {
//把当前class类型赋值给beanClass属性
setBeanClass(beanClass);
//建立一个注解元数据,这个还挺重要,其实也就是对当前类的注解进行封装保存下
this.metadata = new StandardAnnotationMetadata(beanClass, true);
}
复制代码
public static void registerBeanDefinition( BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry) throws BeanDefinitionStoreException {
// Register bean definition under primary name.
String beanName = definitionHolder.getBeanName();
//去注册,传递的参数为 beanName beanDefinition
registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());
// Register aliases for bean name, if any.
String[] aliases = definitionHolder.getAliases();
//假如配置了别名,去设置别名
if (aliases != null) {
for (String alias : aliases) {
registry.registerAlias(beanName, alias);
}
}
}
复制代码
注册的最后一段代码post
@Override
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException {
Assert.hasText(beanName, "Bean name must not be empty");
Assert.notNull(beanDefinition, "BeanDefinition must not be null");
if (beanDefinition instanceof AbstractBeanDefinition) {
try {
((AbstractBeanDefinition) beanDefinition).validate();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
"Validation of bean definition failed", ex);
}
}
//去beanDefinitionMap这个map中根据beanName查询下是否存在
BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);
if (existingDefinition != null) {
//假如存在
if (!isAllowBeanDefinitionOverriding()) {
throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);
}
else if (existingDefinition.getRole() < beanDefinition.getRole()) {
// e.g. was ROLE_APPLICATION, now overriding with ROLE_SUPPORT or ROLE_INFRASTRUCTURE
if (logger.isInfoEnabled()) {
logger.info("Overriding user-defined bean definition for bean '" + beanName +
"' with a framework-generated bean definition: replacing [" +
existingDefinition + "] with [" + beanDefinition + "]");
}
}
else if (!beanDefinition.equals(existingDefinition)) {
if (logger.isDebugEnabled()) {
logger.debug("Overriding bean definition for bean '" + beanName +
"' with a different definition: replacing [" + existingDefinition +
"] with [" + beanDefinition + "]");
}
}
else {
if (logger.isTraceEnabled()) {
logger.trace("Overriding bean definition for bean '" + beanName +
"' with an equivalent definition: replacing [" + existingDefinition +
"] with [" + beanDefinition + "]");
}
}
//直接覆盖了
this.beanDefinitionMap.put(beanName, beanDefinition);
}
else {
//不存在
if (hasBeanCreationStarted()) {
// Cannot modify startup-time collection elements anymore (for stable iteration)
synchronized (this.beanDefinitionMap) {
this.beanDefinitionMap.put(beanName, beanDefinition);
List<String> updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);
updatedDefinitions.addAll(this.beanDefinitionNames);
updatedDefinitions.add(beanName);
this.beanDefinitionNames = updatedDefinitions;
if (this.manualSingletonNames.contains(beanName)) {
Set<String> updatedSingletons = new LinkedHashSet<>(this.manualSingletonNames);
updatedSingletons.remove(beanName);
this.manualSingletonNames = updatedSingletons;
}
}
}
else {
// Still in startup registration phase
//以beanName为key,beanDefinition为vlaue存入beanDefinitionMap
//如今应该知道注册是意思了吧,就是把描述bean信息的beanDefinition 存放在一个map中
this.beanDefinitionMap.put(beanName, beanDefinition);
//把bean名字也存放下
this.beanDefinitionNames.add(beanName);
//这个暂时不知道干啥的
this.manualSingletonNames.remove(beanName);
}
this.frozenBeanDefinitionNames = null;
}
if (existingDefinition != null || containsSingleton(beanName)) {
resetBeanDefinition(beanName);
}
}
复制代码