一、Spring IOC 源码解析(基于注解) 1.源码阅读环境的搭建   2.描述bean容器AnnotationConfigApplicationContext 
A、执行this()方法获取注解Bean的读取器和注解Bean的扫描器 
B、注册Bean,调用Bean扫描器上面的scan()方法 
C、重点来了,执行doScan()方法 
在指定的包中进行扫描,注册Bean。for (String basePackage : basePackages)首先遍历需要扫描包的路径;findCandidateComponents(basePackage)再逐个进行扫描 
判断是否指定Filter指定忽略包不扫描,没有则进行包扫描。 
扫描的时候组装扫描路径(classpath*:cn/fd/config/**/*.class);getResources(packageSearchPath)再根据路径获取资源对象   获取所有符合条件的BeanDefinition,将其存到Set集合中; 再通过resolveScopeMetadata(candidate)、setScope(scopeMetadata.getScopeName()进行 BeanDefinition和Scope进行绑定; generateBeanName(candidate, this.registry)查看是否配置类指定Bean的名称,如果没有指定则默认使用类名首字母小写 
checkCandidate(beanName, candidate)检查Bean是否存在;applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry)检查Scope是否存在,不存在则进行创建; 
注册BeanDefinition,将BeanDefinition存放到IOC Container中   
至此,BeanDefinition创建完毕 
D、执行refresh()方法 
|