Springノート-A n n n o t atedBeanDefinitionReader

3987 ワード

このクラスを分析するのは、主にAnnotationConfigApplicationContext注釈ロード解析プロセスを分析するためです.

1.サンプルコード


以下のコードを実行すると、MyBeanConfig 3が主な構成のエントリポイントとなります.
@Configuration
public class MyBeanConfig3 {

    @Bean()
    public Country country1(){
        return new Country();
    }

    @Bean
    public UserInfo userInfo(){
        return new UserInfo(country1());
    }
}

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(
                MyBeanConfig3.class);
        MyBeanConfig3 config3=context.getBean(MyBeanConfig3.class);
    }
}

2.登録実行プロセス


以上のコードは、AnnotationConfigApplicationContextコンストラクタでAnnotatedBeanDefinitionReaderのregisterを呼び出すので、AnnotatedBeanDefinitionReaderが注目されるプロセスです.
    public AnnotationConfigApplicationContext() {
        this.reader = new AnnotatedBeanDefinitionReader(this);
        this.scanner = new ClassPathBeanDefinitionScanner(this);
    }

    public AnnotationConfigApplicationContext(Class>... annotatedClasses) {
        this();
        register(annotatedClasses);
        refresh();
    }

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

3.AnnotatedBeanDefinitionReader


主に2つのことをしました
1.内蔵BeanPostProcessor 2を登録する.関連BeanDefinitionの登録
3.1内蔵BeanPostProcessorの登録
これは後続の解析BeanとConfiguration注記の準備です.
    public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
        Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
        Assert.notNull(environment, "Environment must not be null");
        this.registry = registry;
        this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
        AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
    }

3.2.関連BeanDefinitionの登録
これは私たちが注目しているポイントですが、実際にはAnnotatedGenericBeanDefinitionオブジェクトを生成して登録することです.
     void doRegisterBean(Class annotatedClass, @Nullable Supplier instanceSupplier, @Nullable String name,
            @Nullable Class extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) {

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

        abd.setInstanceSupplier(instanceSupplier);
        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 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 definitionHolder = new BeanDefinitionHolder(abd, beanName);
        definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
        BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
    }

参照先:https://www.jianshu.com/p/86b53e3f0264