Spring Bean的生命周期

43 阅读2分钟

参考b站视频:www.bilibili.com/video/BV158…

生产 --> 使用 --> 销毁

生产bean,首先2大步骤:loadBeanDefinition和creatBean;

准备容器/环境之后,即可开始生产bean啦。

loadBeanDefinition。

通过xml文件或扫描注解将所有用户定义的bean 放到容器的beanDefitionMap中。

之后就到了creatBean步骤啦

遍历BeanDefinitionMap集合生成一个个的Bean。 分为4步:构造对象,属性填充,初始化,注册销毁

构造对象(creatBeanInstance方法):

1、用反射机制从BeanDefinition中的类拿到构造方法。 (拿构造方法的规则:如果只有一个构造方法,就拿它。多个构造方法,会先拿带Autowire注解的。如果多个构造方法都带有Autowire注解,就报错了。如果都没有,优先拿无参的,如果都有参数,又没有Autowire注解,就又只能报错了。不建议添加多个构造方法。)
2、确定构造方法后,如果有参数,这时就要准备构造方法的参数了。先byType,再byName。先查找容器内是否有该参数的类型,如果有,且有多个实例,又会根据参数名确定一个对象,找不到的话就报错了。 参数准备好后,就可以构造对象了。

填充属性(populateBean方法):

通过三级缓存进行属性填充,也就是依赖注入。

初始化(initialzeBean方法)

1、初始化第一步是初始化容器相关信息。通过invokeWareMethods方法为实现了各种Aware接口的bean设置BeanName,BeanFactory等容器信息。Aware接口是信息感知接口,一旦实现了这些接口就可以在Bean实例中获取对应的信息。 2、接着就是invokeInitMethods方法执行bean的初始化方法啦,这个初始化方法是用户通过实现InitializingBean接口而实现的afterPropertiesSet方法。方法名很直接,表示Bean填充属性后执行。afterPropertiesSet执行完后,还会继续执行用户在bean上定义的initMethod方法。 3、初始化方法之前和之后,要对BeanPostProcess进行处理(对Bean的后置处理器处理),通过applyBeanPostProcessBeforeInitilization(处理@PostConstruct)和applyBeanPostProcessAfterInitialization(处理@PreDestroy)分别在初始化之前和之后处理各种Bean的后置处理器,这些处理器中包括负责AOP的处理器,用户实现BeanPostProcess自定义的处理器等等,有很多可以通过实现PriorityOrdered接口来执行顺序进行逐一处理。

注册销毁

为了让Bean优雅地销毁,通过registerDisposableBean方法将实现了DisposableBean接口的bean进行注册。这样在销毁时就可以执行destroy方法了。

最后通过addSingleton方法将bean加入容器的单例池中。
销毁:

postProcessBeforeDestruction方法。 可以调用@PreDestroy注解。 然后用destroyBeans方法逐一销毁bean。 这时可以执行实现了DisposableBean接口的destroy方法。 invokeCustomDestroyMethod调用用户自定义的destroyMethod方法。