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