- spring容器第一步:整理所有的beanDefinition--- 存放到一个map中
- 系统自带的beanDefinition -- RootBeanDefinition
- 扫描传入的地址需要进行实例化的bean- GenericBeanDefinition
- annotation注解扫描-
new AnnotationConfigApplicationContext("com.study.spring.bean");
- xml文件扫描-
new ClassPathXmlApplicationContext("spring.xml");
- annotation注解扫描-
- 创建BeanFactory - 初始化beanDefinitionMap / beanDefinitionNames
- 将已经整理的beanDefinition=======>全都存入beanDefinitionMap中
- 还需要扫描路径整理的BeanDefinition =======>全都存入beanDefinitionMap中
- 实现BeanFactoryPostProcessor 类工厂增强类 -
- condidate进行排序
- 检查包含 @Configurate 注解的类-进行扫描实例化(import/CompentScan/...)
Parse each @Configuration class
- 注册BeanPostProcessor(实现 IOC / AOP功能的实例)
- 进行BeanPostProcessor排序
- 标记BeanPostProcessor作用
- hasInstantiationAwareBeanPostProcessors
- hasDestructionAwareBeanPostProcessors
- 其他
- 完成Bean工厂的初始化
- 循环所有的BeanDefination
- 抽象类/非单例/懒加载-不需要进行Bean实例化
- &beanName - 去三级缓存中查看是否已经存在实例
- 进行Bean实例化-这时候实例属性都为空
- 循环执行所有beanPostProcessor - 前置操作,搜集类中注解
- 进行bean的提前暴露 - bean引用存放到三级缓存的第三级缓存中
- populateBean 进行DI-依赖注入 -
- 进行propertyValue属性注入--- 在配置文件的属性-注入到bean中
- 进行引用类型注入- autowireAnnotationBeanPostProcessor 处理
- (类似 autowire B b ====> 触发B对象的实例化) - 循环依赖的问题--单独写一篇文章解析循环依赖
- initializeBean 初始化动作 -
- 先解析注解@postContract
- 在执行实现 InitializingBean接口的方法
- 最后运行init-method指定的方法
- ------接下来就是AOP相关知识
- 循环所有的BeanDefination