目录
1.元信息配置阶段
2.元信息解析阶段(封装BeanDefinition)
3.Bean注册阶段
4.实例化阶段
5.属性赋值阶段
6.初始化阶段
6.1 Aware接口回调阶段
6.2 实例化前置增强阶段
6.3 调用初始化
6.4 实例化后置增强阶段
7.销毁阶段
7.1 销毁前阶段
7.2 销毁中阶段
1.元信息配置阶段
Spring 最早支持在 xml 中配置 Bean 的元信息,这些 bean 元信息的配置都处于资源文件中,由于需要大量手工配置,因此目前使用比较多的是注解,配合类扫描使我们不必将配置元信息限制在某一文件中。
2.元信息解析阶段(封装BeanDefinition)存储在xml中的信息Spring需要先读取,然后将读取到的元信息封装到一个Java对象中,这个对象就是BeanDefinition。读取时用到了BeanDefinitionReader这个类,详细类图如下:
AbstractBeanDefinitionReader 将各种资源转换为 Resource,其子类分别从 Resource 中解析 bean,XmlBeanDefinitionReader 用于解析 xml 文件、PropertiesBeanDefinitionReader 用于解析 properties 文件,GroovyBeanDefinitionReader 用于解析 groovy 文件,使用这种方式可以很方便的进行扩展。详细细节可见我《Spring创建BeanDefinition全流程解析(5.2.x)》这篇博文。
3.Bean注册阶段 bean 注册是指将表示 bean 元信息的 BeanDefinition 保存在 Spring 中,Spring 注册 BeanDefinition 的类为 BeanDefinitionRegistry ,使用 BeanDefinitionReader 加载或者注册 bean 的时候便会通过 BeanDefinitionRegistry#registerBeanDefinition 方法注册 BeanDefinition,Spring 内部 BeanDefinitionRegistry 的实现是 DefaultListableBeanFactory,使用了 一个 Map
如果 Spring BeanFactory 中没有添加 InstantiationAwareBeanPostProcessor ,那么就会走正常的流程实例化 bean,此时需要根据参数解析出需要调用的构造方法或者工厂方法。不管是构造方法还是工厂方法最后都会委托到 InstantiationStrategy#instantiate,默认的 InstantiationStrategy 实现是 CglibSubclassingInstantiationStrategy,可用于创建 bean 时通过 Cglib 生成代理。实例化 bean 的具体代码,感兴趣的小伙伴可参见AbstractAutowireCapableBeanFactory#createBeanInstance。
5.属性赋值阶段实例化后需要把Bean所需要的属性值或所需要的依赖注入到Bean对象中,解决循环依赖也是在这个过程中。详细细节在AbstractAutowireCapableBeanFactory#populateBean方法中
6.初始化阶段Spring 初始化是指调用某些初始化的方法。
6.1 Aware接口回调阶段Spring BeanFactory 在 bean 初始化前首先会调用 Aware 相关的接口,代码位置为 AbstractAutowireCapableBeanFactory#invokeAwareMethods,对于 BeanFactory,会分别调用 BeanNameAware#setBeanName、BeanClassLoaderAware#setBeanClassLoader 以及 BeanFactoryAware#setBeanFactory 方法。
6.2 实例化前置增强阶段Bean 初始化前 Spring 将首先调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法。
6.3 调用初始化如果XML中配置了自定义初始化方法,那么就会调用AbstractAutowireCapableBeanFactory#invokeCustomInitMethod方法
6.4 实例化后置增强阶段Bean 初始化后 Spring 会调用 BeanPostProcessor 的 postProcessAfterInitialization 方法。
7.销毁阶段通常情况我们不会手动对 bean 进行销毁,Spring 应用上下文关闭之后才会 bean 进行自动销毁。Spring 将销毁阶段又划分为销毁前和销毁中阶段。
7.1 销毁前阶段 为了通知到用户 Spring 将对 bean 进行销毁,Spring 同样提供了扩展点,方法为DestructionAwareBeanPostProcessor#postProcessBeforeDestruction
,该方法将在 Spring 指定销毁方法前调用:
这个阶段是 Spring 真正销毁 bean 的阶段,会调用 bean 的销毁方法。如果xml中配置了自定义销毁方法,在DisposableBeanAdapter#invokeCustomDestroyMethod方法:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)