Spring Bean的生命周期
SpringBean生命周期总概括
SpringBean周期大致分为以下几个步骤:实例化、属性设置、初始化、对象使用、销毁;
还有些说,创建前准备、创建实例、依赖注入、容器缓存、销毁实例
步骤其实大同小异,换汤不换药。
实例化
创建前准备:
bean在开始加载之前,从上下文配置中去解析并且查找Bean有关的扩展实现,
比如:像init-method,容器在初始化bean时调用;
destroy-method,容器在销毁bean时调用;
beanFactoryPostProcessor这一类的bean加载过程中一些处理扩展实现
创建实例:
通过createBeanInstance方法 反射创建bean的实例对象,扫描bean声明的一些属性;
说到反射:大概类似下面这种获取方式
①、获取class对象
Class clazz = Class.forName("");
Class clazz = 类名.class;
Class clazz = 对象名.getClass();
②、获取构造器
Constructor ctor = clazz.getDeclaredConstructor()
③、创建对象
Object obj = ctor.newInstance()
属性设置
其实就是依赖注入,
设置自定义属性 populateBean 调用set方法赋值
设置容器对象属性 invokeAwareMethods 调用aware相关接口 【容器对象,例如:beanFactory 、ApplicationContext】
检查aware相关依赖并设置对应的一些相关依赖,其实就是设置容器属性
上述方法完成,对象是可以直接拿来使用,
但是要判断是否要对bean对象进行扩展,所以要执行一个前置处理方法 ;;;有前置肯定也会有有后置,
初始化
执行前置处理方法
BeanPostProcessor对应的是postProcessBeforeInitialization
紧接着调用初始化方法
实现一个初始化bean的接口, invokeInitMethods
判断当前bean是否实现了一个叫InitializingBean接口,
如果实现了,会调用AfterPropertiesSet方法
执行后置处理方法
BeanPostProcessor对应的postProcessAfterInitialization
在后置处理方法里面 完成代理对象的创建 (代理) jdkDynamicAopProxy cglibAopProxy
讲到BeanPostProcessor ,都知道AOP
Aop 底层实现原理 动态代理
jdk
cglib
将bean对象交给容器来管理
对象使用
对象销毁
先注册销毁的相关调用接口,再执行bean真正销毁对应的方法
一般面试问题
beanFactory 与 ApplicationContext 区别
【ApplicationContext是beanFactory 的子类实现】
beanFactory是访问Spring容器的根接口,里面提供了某些基本方法的约束规范,
为满足更多需求,ApplicationContext实现了此接口,并在此接口基础上做了某些扩展功能
提供了更加丰富的api调用
beanFactory Factorybean 都可创建对象
beanFactory 必须严格遵守bean生命周期,经过繁琐处理才能创建单例对象,流水式创建
---------------------------------------------------------------------------
Factorybean 自定义bean对象创建流程,不用按照bean生命周期,
此接口包含三个方法:
①、isSingleton 是否单例对象
②、getobjectType 获取对象类型
③、getobject 自己创建对象,使用new 或者代理对象都可以
用户按照自己意愿随意创建
spring中用到的设计模式
单例模式:spring 中bean都是单例的
工厂模式 beanFactory
代理模式:aop动态代理
策略模式:xmlBeanDefinitionReader
// 了解
模板方法:postProcessorBeanFactory onRefresh
观察者模式:listener event multicast
适配器模式 adapter
装饰者模式:beanWrapper
责任链模式:使用aop的时候会有
委托者模式:delegate
建造者模式:builder