Spring~debug源码, 完整走一遍Spring创建一个bean的总结

文章目录

前言

今天自己debug完整的走了一遍Spring创建一个Bean对象的过程, 收获颇多
总结如下:;

  1. Spring会先创建BeanFacory容器中需要的对象, 这也是Spring自己所需要的一些对象

  2. 然后无论是xml还是注解还是properies还是yaml方式, 最后都会经过beanDeinitionReader把其抽象初始化成beandefinition, beandefinition 是bean对象的定义信息, 存储着bean对象的定义信息 包装成一个个的BeanDefinition

  3. 然后会经过许多的beanFactoryPostProcessor完成完善beanDefinition的数据,比如一些占位符的替换, 因为我们在配置文件中可能会有一些$(url)的东西出现, 那在这里就会变成真实的数据

  4. 进行一系列准备工作, 比如初始化好BeanPostProcessor,广播器(观察者模式,用于广播事件) 和一些监听器, 将这些东西set进BeanFactory, 也就是在这里完善了BeanFactory, 包括配置资源的set

  5. 此时BeanFactory就会获取到我们需要实例化的bean的BeanNames, 因为Spring的bean默认是单例的所以在实际实例化之前还会GetBean一下看之前有没有实例化过, 如果已经实例化过就会报异常, 没有实例化就会通过反射创建对象, 反射很简单, 直接获取其class对象, 然后.getDeclaredConstructor, 最后.newinstance;

  6. 此时的bean对象不是完整的, 因为普通属性还没有设置进去(这里的普通属性也就是我们定义这个bean的时候需要set的一些数据), 然后会执行populatedBean进行普通属性的设置

  7. 然后会执行一系列的 if (bean instanceof XXXAware) 如果实现了这些接口就会set对应的数据, 这些XXXAware就是让Spring自动给我们自定义的对象set一些属性,能够使自定义对象能够方便的获取容器对象或者知道自己在容器中的一些信息, 比如BeanNameAware就是让我们这个bean对象知道自己在IOC容器中叫什么

  8. 在bean对象初始化之前执行applyBeanPostProcessorsBeforeInitialization, 在调用显示initmethods的初始化之前完成一些定制的初始化任务, 比如applicationContext就是在这初始化的

  9. 然后执行initmethods系列方法实现自定义的初始化方法
    在这里插入图片描述

  10. 初始化bean对象之后执行applyBeanPostProcessorsAfterInitialization 在这里进行AOP的实现, 而且还会进行判断, 如果你配置的bean是单例的会放到IOc池中, 如果是原型的,不会放到池中

  11. 如果 Bean 实现了 DisposableBean 接口,则 Spring 会调用 destory() 方法将 Spring 中的 Bean 销毁;如果在配置文件中通过 destory-method 属性指定了 Bean 的销毁方法,则 Spring 将调用该方法对 Bean 进行销毁。

猜你喜欢

转载自blog.csdn.net/Shangxingya/article/details/114175145