AbstractApplicationContext refresh()方法 515行 获取新的IOC 容器
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
refreshBeanFactory() 调用子类AbstractRefreshableApplicationContext的方法
AbstractRefreshableApplicationContext类的第129行加载beanDefinition
因为是基于注解,这里看AnnotationConfigWebApplicationContext类的loadBeanDefinitions方法
第219行scanner.scan(StringUtils.toStringArray(this.basePackages));
继续看ClassPathBeanDefinitionScanner的247行scan方法
scan方法中doScan(basePackages);根据basePackages扫描业务类
ClassPathBeanDefinitionScanner的268行doScan()方法
Set<BeanDefinition> candidates = findCandidateComponents(basePackage);
将扫描到的组件都包装成BeanDefinition类型
在doScan()方法288行registerBeanDefinition(definitionHolder, this.registry);将扫描到的Bean定义添加到IOC容器
总结:Spring容器在启动的时候,先会保存所有注册进来的Bean的定义信息;
1、xml注册bean;<bean>
2、注解注册Bean;@Service、@Component、@Bean、xxx
2)、Spring容器会合适的时机创建这些Bean
1、用到这个bean的时候;利用getBean创建bean;创建好以后保存在容器中;
2、统一创建剩下所有的bean的时候;finishBeanFactoryInitialization();
3)、后置处理器;BeanPostProcessor
1、每一个bean创建完成,都会使用各种后置处理器进行处理;来增强bean的功能;
AutowiredAnnotationBeanPostProcessor:处理自动注入
AnnotationAwareAspectJAutoProxyCreator:来做AOP功能;
xxx....
增强的功能注解:
AsyncAnnotationBeanPostProcessor
....
4)、事件驱动模型;
ApplicationListener;事件监听;
ApplicationEventMulticaster;事件派发: