注解方式的IOC初始化


先在AnnotationConfigApplicationContext#AnnotationConfigApplicationContext(java.lang.String…basePackages)的构造方法完成
AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner的初始化,
然后调用AnnotationConfigApplicationContext#scan 方法开始通
ClassPathBeanDefinitionScanner#scan再调用
ClassPathBeanDefinitionScanner#doScan 扫描配置的路径,这个值是一个数组,因为路径可以写多个,


然后根据配置的路径去扫描target下的编译好的class文件放到一个Resource数组里面, 然后循环遍历Resource数组里面,检查类上面是否有@includeFilters这个注解,如果有还需要处理,同时找到符合@Component注解条件的class文件封装成一个个ScannedGenericBeanDefinition 对象放入LinkedHashSet的candidates容器里面.
然后再对这个candidates容器里面循环检查是否有@Lazy注解@DependOn等等,进一步进行处理封装成BeanDefinitionHolder对象放入beanDefinitions容器(LinkedHashSet)
再调用ComponentScanBeanDefinitionParser#registerComponents 开始注册组件

ClassPathBeanDefinitionScanner#registerBeanDefinition调用
BeanDefinitionReaderUtils#registerBeanDefinition调用
BeanDefinitionRegistry#registerBeanDefinition方法里面将beanDefinition处理完放入到beanDefinitionMap容器
然后BeanName放入 beanDefinitionNames容器里面,这个容器(beanDefinitionNames)在bean实例化的时候会用到.



最后调用AbstractApplicationContext#refresh 方法.调用
AbstractApplicationContext#finishBeanFactoryInitialization方法,把beanDefinitionNames容器里面的beanName
拿出来封装成RootBeanDefinition 然后调用getBean() 进行初始化,后面的初始化过程就和xml的ioc方式一模一样了.


注解方式的getBean操作和Xml方式的getBean操作是一模一样的.