检查给定的bean定义是否是配置类(或在configuration/component类中声明的嵌套组件类,也要自动注册)的候选项,并相应地标记它。
public static boolean checkConfigurationClassCandidate( BeanDefinition beanDef, MetadataReaderFactory metadataReaderFactory) { //获取bean定义的class类名 String className = beanDef.getBeanClassName(); if (className == null || beanDef.getFactoryMethodName() != null) { return false; } AnnotationMetadata metadata; if (beanDef instanceof AnnotatedBeanDefinition && className.equals(((AnnotatedBeanDefinition) beanDef).getMetadata().getClassName())) { // Can reuse the pre-parsed metadata from the given BeanDefinition... metadata = ((AnnotatedBeanDefinition) beanDef).getMetadata(); } else if (beanDef instanceof AbstractBeanDefinition && ((AbstractBeanDefinition) beanDef).hasBeanClass()) { // 检查已经加载的类,如果存在的话 // 因为我们甚至可能无法加载这个类的类文件 //获取bean定义的class实例对象,如果class实例是下面四种类或接口的相同、子类、父接口等任何一种情况,直接返回 Class<?> beanClass = ((AbstractBeanDefinition) beanDef).getBeanClass(); if (BeanFactoryPostProcessor.class.isAssignableFrom(beanClass) || BeanPostProcessor.class.isAssignableFrom(beanClass) || AopInfrastructureBean.class.isAssignableFrom(beanClass) || EventListenerFactory.class.isAssignableFrom(beanClass)) { return false; } //使用反射为给定类创建新的AnnotationMetadata实例 metadata = AnnotationMetadata.introspect(beanClass); } else { try { //获取className的MetadataReader实例 MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(className); //读取底层类的完整注释元数据,包括带注释方法的元数据 metadata = metadataReader.getAnnotationMetadata(); } catch (IOException ex) { if (logger.isDebugEnabled()) { logger.debug("Could not find class file for introspecting configuration annotations: " + className, ex); } return false; } } //获取bean定义的元数据被@Configuration注解标注的属性字典值 Map<String, Object> config = metadata.getAnnotationAttributes(Configuration.class.getName()); //如果bean被@Configuration注解标注,且属性proxyBeanMethods为false(使用代理模式) //则将bean定义标记为full if (config != null && !Boolean.FALSE.equals(config.get("proxyBeanMethods"))) { beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_FULL); } //如果bean被@Configuration注解标注,且被注解@Component、@ComponentScan、@Import、@ImportResource //或@Bean标记的方法,则将bean定义标记为lite else if (config != null || isConfigurationCandidate(metadata)) { beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_LITE); } else { return false; } // bean定义是一个标记为full或lite的候选项,如果设置order则设置order属性值 Integer order = getOrder(metadata); if (order != null) { //设置bean定义的order值 beanDef.setAttribute(ORDER_ATTRIBUTE, order); } return true; }GitHub源码:https://github.com/mingyang66/spring-parent
