关于spring中Bean的注入,我们首先要看的就是 org.springframework.context.annotation.ClassPathBeanDefinitionScanner 这个类
在扫描过程中对于资源描述的转换 class->Resource->MetadataReader->BeanDefinition
1 public Set<BeanDefinition> findCandidateComponents(String basePackage) { 2 Set<BeanDefinition> candidates = new LinkedHashSet<BeanDefinition>(); 3 try { 4 String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + 5 resolveBasePackage(basePackage) + '/' + this.resourcePattern; 6 Resource[] resources = this.resourcePatternResolver.getResources(packageSearchPath); //将classPath下的.class变成Resource 7 boolean traceEnabled = logger.isTraceEnabled(); 8 boolean debugEnabled = logger.isDebugEnabled(); 9 for (Resource resource : resources) { 10 if (traceEnabled) { 11 logger.trace("Scanning " + resource); 12 } 13 if (resource.isReadable()) { 14 try { 15 MetadataReader metadataReader = this.metadataReaderFactory.getMetadataReader(resource); //将Resource封装成MetadataReader 16 if (isCandidateComponent(metadataReader)) { //判断类是否能匹配include filter,此处的inclider filter是那些类似于Compent这样的注解 17 ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader); 18 sbd.setResource(resource); 19 sbd.setSource(resource); 20 if (isCandidateComponent(sbd)) { //此处判断这个BeanDefination是否是个独立的实体类或者带注解的抽象类 21 if (debugEnabled) { 22 logger.debug("Identified candidate component class: " + resource); 23 } 24 candidates.add(sbd); //将BeanDefination注入BeanFactory 25 } 26 else { 27 if (debugEnabled) { 28 logger.debug("Ignored because not a concrete top-level class: " + resource); 29 } 30 } 31 } 32 else { 33 if (traceEnabled) { 34 logger.trace("Ignored because not matching any filter: " + resource); 35 } 36 } 37 } 38 catch (Throwable ex) { 39 throw new BeanDefinitionStoreException( 40 "Failed to read candidate component class: " + resource, ex); 41 } 42 } 43 else { 44 if (traceEnabled) { 45 logger.trace("Ignored because not readable: " + resource); 46 } 47 } 48 } 49 } 50 catch (IOException ex) { 51 throw new BeanDefinitionStoreException("I/O failure during classpath scanning", ex); 52 } 53 return candidates; 54 }