解析@Configuration和@Component@Service@Controller等等

总结@Component到Spring bean容器管理过程。第一步,初始化时设置了Component类型过滤器;第二步,根据指定扫描包扫描.class文件,生成Resource对象;第三步、解析.class文件并注解归类,生成MetadataReader对象;第四步、使用第一步的注解过滤器过滤出有@Component类;第五步、生成BeanDefinition对象;第六步、把BeanDefinition注册到Spring容器。以上是@Component注解原理,@Service、@Controller和@Repository上都有@Component修饰,所以原理是一样的。


ClassPathBeanDefinitionScanner#doScan调用到 ClassPathScanningCandidateComponentProvider#scanCandidateComponents,在这个方法内部根据配置的路径进行扫描classpath路径下的.class文件,返回结果是Resources数组.然后循环Resources数组里面的resource,如果符合条件就封装成ScannedGenericBeanDefinition对象返回给doScan方法.
ClassPathBeanDefinitionScanner#doScan接着循环符合条件的BeanDefinitionSet容器然后判断是否有@Lazy注解等等

ClassPathBeanDefinitionScanner#doScan调用ClassPathBeanDefinitionScanner#registerBeanDefinition注册BeanDefinition