Spring最重要的功能就是管理bean,所以bean的生命周期特别重要
Spring配置文件分两种,一种是xml配置,一种是注解(Java代码)的配置
第一步:Spring 扫描(通过加载两种配置文件扫描)并且加载类定义(BeanDefinition),这个时候会生成一个 BeanDefinitionMap,并且判断扫描出来的类型中有没有实现 BeanPostProcessor,如果实现了,就需要实例化,并且放入List
第二步:推导构造方法,使用哪个构造方法进行实例化 (如果是 拥有lazy标签,或者prototype原型模式,则不会进行实例化流程)
第三步:实例化前,可以在实例化进行一些操作
第四步:实例化:对类进行实例化,这个时候会把实例化的对象放入到 BeanFactoryMap(三级缓存中)
第五步:实例化后:实例化后对对象进行操作
第六步:依赖注入(DI),这个时候会先去SingletonMap(一级缓存)中获取属性,如果没有则会去 earlySingletonMap(二级缓存)获取,如果没有则会去BeanFactoryMap(三级缓存)中获取BeanFactoty(半成品bean),然后调用early方法提前暴露的bean,如果这个提前暴露的bean存在aop,则会返回代理对象,并且存入earlySingletonMap(二级缓存)中,如果不需要aop,则直接返回 BeanFactoty(半成品bean)
第七步:如果对象实现了各种aware接口,context则需要调用这些方法,将对应的值传入bean中,比如BeanNameAware,ApplicationContextAware,这些aware主要是对值进行补充
第八步:初始化前:这里就是对扫描中拿到的 List
第九步:初始化:这里判断是否实现了InitializingBean接口,如果实现了,则会调用 afterPropertiesSet方法
第十步:初始化后:这里就是对扫描中拿到的 List
在第十步执行之后,会将实例化之后的singletonObject放入 singletonObjectMap(一级缓存) 中,IOC(控制反转,Spring自己控制bean)就是获取这些 bean
然后正常使用bean即可
第十一步:容器关闭,销毁bean,这里会将bean适配成 disposableBean对象,然后调用销毁方法 destroy 即可