注意:重在理解,用自己的理解来概述,最好理解后自己总结一篇博客哦~
以下也是个人看了多人的博客后总结出来的,个人觉得面试答上来下面的重点就已经可以了,毕竟每个人有每个人的想法~
建议先看图片,再看文字哦~
=========================================================
第一阶段(创建Bean前的准备)
Bean在开始加载之前从上下文和一些配置中解析并查找Bean有关的一些扩展的实现
1:比如java方法本身只有在spring初始化加载完之后才会执行,但是可以通过配置=======》innt-method来改变它的一个规则,在后面容器初始化之前就会与你配置的innt-method指定的方法一起执行,还有destroy-method,容器在销毁Bena的时候调用的一些方法。(简单来说,就好比玩王者荣耀有5位队友(方法),你个dog玩个云中君,开局4位队员还在泉水困着,你就先飞出去了)
2:还有BeanFactoryPostProcessor这一类的bean对加载过程中对前置和后置扩展的处理和实现。然而,这些类是spring提供给开发者添加扩展所用的,比如像添加Dubbo这样一类的中间件。还有BeanFactoryProcessor本身会比Bean先实例化。简单来说(你家有个智能洗衣机(BeanFactoryPostProcessor)你已经提前把要洗的衣物(中间件)放进去了,洗衣机启动后,洗衣机会帮你清洗衣服,但是,洗衣机肯定是先洗再脱水,先洗指的是beanFactoryPostProcessor处理你扩展的组件,脱水指的是bean的实例化,以洗衣机的生命周期概述了BeanFactoryPostProcessor)
第二阶段(创建实例阶段):
通过反射创建bean的实例对象,并且会扫描和解析一些Bean扫描的属性和方法 ,算是正式的创建了Bean,但是这个阶段的Bean还不对外可用,因为还没有依赖注入,机制不允许。
第三阶段(依赖注入):
1: 如果被实例化的bean依赖于其他的bean对象,则会自动或者手动配置要被注入的bean来注入对应的bean对象。简单来说(在类中有一个private User user1;的一个对象属性,使用@Autoired(自动装配)给它注入,private User user1;是要被注入的Bean。而@Autoired会查找在标注了类似@Component之类的注解的类,如果有名为User的类,则注入,没有就报错呗,除非@Autoired(required = false)表示哪怕没有User也不报错)。
2 : 在这个阶段还会触发一些扩展的调用,比如说上述所说BeanFactoryPostProcessor在Bean创建之前就已经对中间件做好了处理实现,然而在依赖注入这个阶段,会触发BeanPostProcessors来回调BeanFactoryPostProcessor已经帮你实现的Bean,简单来说(在家做饭,凉菜(中间件)已经提前调好,已经可以吃了,但是要等热菜(bean)炒好之后一起端上桌)
第四阶段(容器缓存阶段):
将已经准备好的Bean保存到Spring的容器以及缓存中,现在的bean已经可以使用了,在这个阶段还会涉及到一些操作,比如第一阶段所说的innt-method所配置的要先执行的方法,在这个阶段就会调用,还有BeanPostProcessors后置处理器的方法也会在这个阶段被触发。(就好比上述所说,菜都上好了,等人来齐(一些配置的方法和组件的方法来齐),再开吃)
第五阶段(销毁Bena):
当Spring应用上下文被关闭的时候,上下文中的Bean都会被销毁,如果存在的某些Bean实现了DisposableBena的接口或者配置了上述所说的destory-method的一些方法,则会在这个阶段被调用。
逻辑图大概