spring学习之源码分析AnnotationConfigApplicationContext之register和scan

32次阅读

共计 4725 个字符,预计需要花费 12 分钟才能阅读完成。

AnnotationConfigApplicationContext

AnnotationConfigApplicationContext 继承了 GenericApplicationContext,GenericApplicationContext 里有个很重要的实例 –DefaultListableBeanFactory。DefaultListableBeanFactory 是 spring 中,默认注册、加载的实现。
sacn 和 register 方法,是把扫描或者指定的配置 bean 信息,注册到容器中。

register

register 方法是通过注解 bean 读取器 AnnotatedBeanDefinitionReader 来实现的。

public void register(Class<?>... annotatedClasses) {Assert.notEmpty(annotatedClasses, "At least one annotated class must be specified");
    this.reader.register(annotatedClasses);
}

register

AnnotatedBeanDefinitionReader 的方法
按指定的配置 bean 注册信息

public void register(Class<?>... annotatedClasses) {for (Class<?> annotatedClass : annotatedClasses) {registerBean(annotatedClass);
    }
}

registerBean

public void registerBean(Class<?> annotatedClass) {doRegisterBean(annotatedClass, null, null, null);
}

doRegisterBean

<T> void doRegisterBean(Class<T> annotatedClass, @Nullable Supplier<T> instanceSupplier, @Nullable String name,
        @Nullable Class<? extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) {
    // 其实就是创建 BeanDefinition 了,只是多了一个注解的属性 metadata
    AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);
    // @Conditional 注解的判断在这里,如果不符合条件,就不注册了
    if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {return;}
    // 回调用的
    abd.setInstanceSupplier(instanceSupplier);
    // 解析 bean 的作用域,scope,没有设置默认单例
    ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);
    abd.setScope(scopeMetadata.getScopeName());
    // 解析 bean 的名称
    String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));
    // 设置 abd 的 Lazy, primary DependsOn, Role ,Description 这五个属性
    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);
    }
    // 定义一个 BeanDefinitionHolder,就是 beanName 和 BeanDefinition 的映射
    BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
    // 是否有代理
    definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
    // 往容器注册
    BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
}

scan

scan 方法是通过按类路径扫描注解 bean 的扫描器 ClassPathBeanDefinitionScanner 来实现的。

public void scan(String... basePackages) {Assert.notEmpty(basePackages, "At least one base package must be specified");
    this.scanner.scan(basePackages);
}

scan

ClassPathBeanDefinitionScanner 的方法。
根据指定目录扫描,返回注册的 bean 的个数

public int scan(String... basePackages) {
    // 获取没扫描前 bean 的个数
    int beanCountAtScanStart = this.registry.getBeanDefinitionCount();
    // 主要方法
    doScan(basePackages);

    // Register annotation config processors, if necessary.
    if (this.includeAnnotationConfig) {AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
    }
    // 当前 bean 的个数 - 没扫描前 bean 的个数 = 本次扫描时注册的 bean 的个数
    return (this.registry.getBeanDefinitionCount() - beanCountAtScanStart);
}

doScan

protected Set<BeanDefinitionHolder> doScan(String... basePackages) {Assert.notEmpty(basePackages, "At least one base package must be specified");
    // 初始化容器
    Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<>();
    for (String basePackage : basePackages) {
        // 根据路径扫描,获取 BeanDefinition,这个 BeanDefinition 是 ScannedGenericBeanDefinition。默认 Component、ManagedBean、Named 注解会被扫描进来,其中 ManagedBean 是 JSR-250 规范,Named 是 JSR-330 规范,都需要额度的 jar 包支持。// register 的 conditionEvaluator 判断 @Conditional 注解也是在这里判断。Set<BeanDefinition> candidates = findCandidateComponents(basePackage);
        for (BeanDefinition candidate : candidates) {
            // 解析 bean 的作用域,scope,没有设置默认单例
            ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(candidate);
            candidate.setScope(scopeMetadata.getScopeName());
            // 解析 bean 的名称
            String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry);
            // 设置默认的属性,比如 lazy 属性是 false,还有 autowireMode、dependencyCheck、initMethodName、destroyMethodName、enforceInitMethod、enforceDestroyMethod 这几个属性设置
            if (candidate instanceof AbstractBeanDefinition) {postProcessBeanDefinition((AbstractBeanDefinition) candidate, beanName);
            }
            // 如果是注解的话,设置 abd 的 Lazy, primary DependsOn, Role ,Description 这五个属性
            if (candidate instanceof AnnotatedBeanDefinition) {AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition) candidate);
            }
            // 检查 beanName 如果没注册过,返回 false。如果注册过了,要看是否兼容,如果不兼容,抛异常,如果兼容,这边不在注册。if (checkCandidate(beanName, candidate)) {
                // 定义一个 BeanDefinitionHolder,就是 beanName 和 BeanDefinition 的映射
                BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(candidate, beanName);
                // 是否有代理
                definitionHolder =
                        AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
                // 加入到 beanDefinitions
                beanDefinitions.add(definitionHolder);
                // 注册 bean
                registerBeanDefinition(definitionHolder, this.registry);
            }
        }
    }
    return beanDefinitions;
}

正文完
 0