spring源碼02——registerBean源碼解析

類名:AnnotatedBeanDefinitionReader
registerBean(java.lang.Class<?>, java.lang.String, java.lang.Class<? extends java.lang.annotation.Annotation>…)

public void registerBean(Class<?> annotatedClass, String name, Class<? extends Annotation>... qualifiers) {
        AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);
        AnnotationMetadata metadata = abd.getMetadata();
		//profile註解處理
        if (metadata.isAnnotated(Profile.class.getName())) {
            AnnotationAttributes profile = MetadataUtils.attributesFor(metadata, Profile.class);
            if (!this.environment.acceptsProfiles(profile.getStringArray("value"))) {
                return;
            }
        }

		//對bean的scope註解和proxymode屬性進行處理
		//https://blog.csdn.net/u013423085/article/details/82872533
        ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);
		//將作用域添加到數據結構中
        abd.setScope(scopeMetadata.getScopeName());
        String beanName = name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry);
		//處理Primary、Lazy、DependsOn等註解;並添加進入數據結構中
        AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
		//處理qualifiers屬性
        if (qualifiers != null) {
            Class[] arr$ = qualifiers;
            int len$ = qualifiers.length;

            for(int i$ = 0; i$ < len$; ++i$) {
                Class<? extends Annotation> qualifier = arr$[i$];
                if (Primary.class.equals(qualifier)) {
                    abd.setPrimary(true);
                } else if (Lazy.class.equals(qualifier)) {
                    abd.setLazyInit(true);
                } else {
                    abd.addQualifier(new AutowireCandidateQualifier(qualifier));
                }
            }
        }
		//存放BeanDefinition的一種結構,多了beanName和aliases
		//https://blog.csdn.net/qq924862077/article/details/73558848
        BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
		//如果scope屬性使用了proxymode,並且proxymode不是NO。涉及到把多實例bean注入到單例bean中的代理創建
        definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
		//把definitionHolder註冊到registry,這個AnnotationConfigApplicationContext實現了registry接口,其實就是註冊到AnnotationConfigApplicationContext中;
        BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章