前言
Spring框架,承上文,已经基本了解了复习了关于Bean工厂,以及ApplicationContext,
复习了Sping 的一个心脏,和身躯的区别。
从结构上面看。Bean工厂作为根类接口,方法比较有限,但是从Application显然对Bean方法进行了增强,比如全自动实例化,不需要一个个实例化,增加了国家化messageResource服务,以及增强了ResourceLoader的强化,同时包括对拦截器等增强。现在使用xmlBeanFactory比较少了。
在应用当中一般用两个实现类,直接获取ApplicationContext,
ClassPathXmlApplicationContext。以及FileSystemXmlApplicationContext。自动加载,避免了BeanFactory的延时加载。所以说ApplicationContext是Spring的心脏的扩展表述为Spring容器不为过。
那么获得的Bean 他的生命周期是怎么回事。我罗列了一些知识。由于等级不高,只能大概对于他有个了解记忆,具体的需要下源码来分析。
整体Bean的生命周期如下面网络逻辑图所示
结构
走一下流程
当调用者通过 getBean(beanName)向容器请求某一个 Bean 时
如果容器注册了
org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor 接口,在实例化 Bean 之前,
第一步
调用接口方法 postProcessBeforeInstantiation() ;
根据配置情况调用 Bean 构造函数或工厂方法实例化 Bean;
Bean被创建出来
第二步
在实例化 Bean 之后,调用该接口的 **postProcessAfterInstantiation()**方法,对已经实例化的对象进行一些“修饰”
第三步
如果 Bean 配置了属性信息,容器在这一步着手将配置值设置到 Bean 对应的属性中
在设置每个属性之前将先调用 该接口 **postProcessPropertyValues()**方法
设置属性值
如果 Bean 实现了 org.springframework.beans.factory.BeanNameAware 接口,将调用
setBeanName()接口方法,将配置文件中该 Bean 对应的名称设置到 Bean 中
如果 Bean 实现了 org.springframework.beans.factory.BeanFactoryAware 接口,将调用 setBeanFactory()接口方法,将 BeanFactory 容器实例设置到 Bean 中;
如果 BeanFactory 装配org.springframework.beans.factory.config.BeanPostProcessor
后处理器,将调用 BeanPostProcessor 的 Object postProcessBeforeInitialization(Object bean,
String beanName)接口方法对 Bean 进行加工操作。其中入参 bean 是当前正在处理的 Bean,而 beanName 是当前 Bean 的配置名,返回的对象为加工处理后的 Bean。用户可以使用该方法对某些 Bean 进行特殊的处理,甚至改变 Bean 的行为,BeanPostProcessor 在 Spring 框架中占有重要的地位,为容器提供对 Bean 进行后续加工处理的切入点,Spring 容器所提供的各种“神奇功能”(如 AOP,动态代理等)都通过 BeanPostProcessor 实施;
如果 Bean 实现了 InitializingBean 的接口,将调用接口的 afterPropertiesSet()方法
如果在通过 init-method 属性定义了初始化方法,将执行这个方法
BeanPostProcessor 后处理器定义了两个方法:其一是postProcessBeforeInitialization()
其二 Object postProcessAfterInitialization(Object bean, String beanName)方
法,这个方法在此时调用,容器再次获得对 Bean 进行加工处理的机会;
如果在中指定 Bean 的作用范围为 scope=“prototype”,将 Bean 返回给调用
者,调用者负责 Bean 后续生命的管理,Spring 不再管理这个 Bean 的生命周期。如果作用
范围设置为 scope=“singleton”,则将 Bean 放入到 Spring IoC 容器的缓存池中,并将 Bean引用返回给调用者,Spring 继续对这些 Bean 进行后续的生命管理;
对于 scope=“singleton”的 Bean,当容器关闭时,将触发 Spring 对 Bean 的后续生
命周期的管理工作,首先如果 Bean 实现了 DisposableBean 接口,则将调用接口的
afterPropertiesSet()方法,可以在此编写释放资源、记录日志等操作