加载 -> 解析 -> 实例化 -> 依赖注入 -> 初始化 -> 销毁
流程图
AnnotationConfigApplicationContex或者 ClassPathXmlApplicationContext
都会进入AbstractApplicationContext 的 refresh方法
1.obtainFreshBeanFactory() 解析XML 封装成BeanDefinitions
BeanDefinitions里会存放beanName beanClass 是否单例 是否懒加载这些字段
先会创建BeanFactory对象 调用refreshBeanFactory() 实例beanFactory
解析XML的bean 并封装成BeanDefinition对象
loadBeanDefinitions(beanFactory) 创建xml的解析器 XmlBeanDefinitionReader
loadBeanDefinitions(beanDefinitionReader);
获取需要加载的xml配置文件 ConfigLocations.getConfigLocations();
把字符串类型的xml文件路径,形如:classpath*:user/**/*-context.xml,转换成Resource对象类型,其实就是用流
doLoadBeanDefinitions 把读到的封装成Document文件对象
registerBeanDefinitions(doc, resource); 根据解析出来的document对象,拿到里面的标签元素封装成BeanDefinition
doRegisterBeanDefinitions(doc.getDocumentElement())传进去xml元素
parseBeanDefinitions(root, this.delegate); 标签具体解析过程
parseDefaultElement解析标签元素
processBeanDefinition解析bean标签
registerBeanDefinition完成BeanDefinition的注册 beanName beanClass等
把BeanDefinition放到BeanDefinitionMap中缓存
把beanName放到beanDefinitionNames list中,这个list着重记住,bean实例化的时候需要用到
2.invokeBeanFactoryPostProcessors(beanFactory)
扫描@Component注解
找到所有实现了BeanDefinitionRegistryPostProcessor的类,执行
postProcessBeanDefinitionRegistry方法 这个方法可以直接把一个类注册成beanDefinition
找到所有实现了BeanFactoryPostProcessor的类,执行
postProcessBeanFactory方法可以扩展用
3.registerBeanPostProcessors(beanFactory)把实现了BeanPostProcessor接口的类实例化,并且加入到BeanFactory中
4.finishBeanFactoryInitialization(beanFactory) baean实例化 DI 初始化
bean实例化过程
1.finishBeanFactoryInitialization(beanFactory)
2.beanFactory.preInstantiateSingletons(); 具体实例化过程
3.从beanDefinitionNames里面拿到所有的beanDefinition的beanNams
然后循环的 实例化 DI 初始化
4.进入getBean准备获取实例
5.getBean进入doGetBean 会判断这个bean是单例还是原型
6.如果是单例 singletonFactory.getObject()获取singletonObject(单例容器) 如果没有就会creatBean
如果是原型 每次都会creatBean
7.creatBean 调用 doCreatBean 创建实例
8.doCreatBean BeanWrapper 先判断是否是单例 如果是单例从
createBeanInstance 通过反射创建BeanWrapper 实例
进入DI流程
9.populateBean 依赖注入的方法
找到filed 并且自动赋值,比如autowired注解的对象,没有就会getBean先去创建 最后返回原来bean的流程
进入初始化流程
10.initializeBean 初始化方法
//生命周期一部分
11.invokeAwareMethods(beanName, bean);
BeanFactoryAware,BeanClassLoaderAware BeanNameAware都继承Aware接口
如果这个bean实现了Aware接口
就会调用BeanNameAware的setBeanName方法
BeanFactoryAware,BeanClassLoaderAware同理
12.applyBeanPostProcessorsBeforeInitializatior()
13.invokeInitMethods
如果有类实现了BeanPostProcessor接口 就会调用实现他的postProcessBeforeInitialization与postProcessAfterInitialization这两个方法
@PostConstrust
InitializingBean接口 afterPropertiesSet方法
14.applyBeanPostProcessorsAfterInitialization(AOP)
最后的对象交给singletonObjects容器(一级缓存)
Bean销毁
1.如果scope不是单例,则跟随JVM销毁
2.如果scope是单例,则容器回收的时候,会进行回收
如果Bean实现了DisposableBean接口,则在容器关闭时,调用Bean的
destroy方法