容器启动阶段:
1.配置元信息(创建对象所需要的必要信息)
-xml文件 properties文件 注解 硬编码
2.BeanDefinationReader加载配置文件,将其转化为内存形式的BeanDefination
XmlBeanDefinationReader - xml
PropertiesBeanDefinitionReader - properties
3.将BeanDefination注册到BeanDefinationRegistry中。
以键值对的形式,(Bean定义的id:BeanDefination)
BeanFactoryPostProcessor可对BeanDefinationRegistry中属性进行替换和修改($占位符)
Bean实例化:
1.对象创建策略 - 采用策略模式。 反射或CGlib字节码生成创建对象
2.BeanWrapper - 对创建出来的Bean进行包装,简化上层业务逻辑
3.设置对象属性
4.先检查Aware相关接口,然后从Spring的对象池中查找相关实例。
(例如对于ApplicationContextAware接口,就去找ApplicationContext实例),
也就是说我们必须要在配置文件中或者使用注解的方式,将相关实例注册容器中,
BeanFactory才可以为我们自动注入。
5.BeanPostProcessor前置处理
要生产的Bean实例放到容器之前,允许对Bean实例进行一定程度的修改,替换等操作。
6.自定义初始化逻辑
在所有的准备工作完成之后,如果我们的Bean还有一定的初始化逻辑,那么Spring将允许
我们通过两种方式配置我们的初始化逻辑:
(1)InitializingBean (2)配置init-method参数
一般通过配置init-method方法比较灵活。
7.BeanPostProcess后置处理 - 可自定义扩展逻辑
8.自定义销毁逻辑
两种方式:(1)实现DisposableBean接口 (2)配置destory-method参数。
这里一个比较典型的应用就是配置dataSource的时候destory-method为数据库连接的close()方法。
9.使用Bean
10.调用回调销毁接口 - 自定义销毁逻辑