AnnotationConfigApplicationContex的类图
BeanDefinition是定义 Bean 的配置元信息接口,类图
把注解的配置类放到ioc容器中 <T> void doRegisterBean(Class<T> annotatedClass, @Nullable Supplier<T> instanceSupplier, @Nullable String name, @Nullable Class<? extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) { //注解的方式注入ioc中bean的信息 AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass); //判断是否有加Condition注解,有条件的注入对象 if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) { return; } //设置回调 abd.setInstanceSupplier(instanceSupplier); ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd); //设置是否单例还是多例 abd.setScope(scopeMetadata.getScopeName()); //获取beanId 没有的话就使用类的小写 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); } //把AnnotatedGenericBeanDefinition封装成一个对象 BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName); definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry); //把注解方式的配置类注册到ioc容器中 BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry); }流程图