spring注解是如何注入Bean的

关于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     }

猜你喜欢

转载自www.cnblogs.com/wanghaoyang/p/10579233.html