Spring学习(一)---IoC介绍(2)

五 Bean的生命周期
  在Spring中,有两个层面的Bean生命周期:1)Bean的作用范围
  2)实例化Bean时所经历的一系列阶段
 
  1.BeanFactory中Bean的生命周期
 
 


  • 1.当调用者通过getBean(beanName)向容器请求某一个Bean时,如果容器注册了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,在实例化Bean之前,将调用接口的postProcessBeforeInstantiation()方法;
  • 2.根据配置情况调用Bean构造函数或工厂方法实例化Bean;
  • 3.如果容器注册了InstantitationAwareBeanPostProcessor()接口,在实例化Bean之后,调用该接口的postProcessAfterInstantiation()方法,可在这里对已经实例化的对象进行一些“梳妆打扮”;
  • 4.如果Bean配置了属性信息,容器在这一步招收将配置值设置到Bean对应的属性中,不过在设置每个属性之前将先调用InstantiationAwareBeanPostProcessor接口的postProcessProperyValues()方法;
  • 5.调用Bean的属性这只方法设置属性值;
  • 6.如果Bean实现了org.springframework.beans.factory.BeanNameAware接口,将调用setBeanName()接口方法,将配置文件中该Bean对应的名称设置到Bean中;
  • 7.如果Bean实现了org.springframework.bean.factory.BeanFactoryAware接口,将调用setBeanFactory()接口方法,将BeanFactory容器实例设置到Bean中;
  • 8.如果Bean实现了org.springframework.beans.factory.config.BeanPostProcessor后处理器,将调用BeanPostProcessor的Object postProcessBeforeInitialization(Object bean,String beanName)接口方法对Bean进行加工操作。其中入参bean是当前正在处理的Bean,而beanName是当前Bean的配置名,返回的对象为加工处理后的Bean。用户可以使用该方法对某些Bean进行特殊处理,是指改变Bean的行为。
  • 9.如果在Bean实现InitializingBean的接口,将调用接口的afterPropertiesSet()方法;
  • 10.如果在<bean>通过init-method属性定义初始化方法,将执行这个方法;
  • 11.BeanPostProcessor后处理器定义了两个方法:其一是postProcessBeforeInitialization()在第8步调用;其二是Object postProcessAfterInitialization(Object bean ,String beanName)方法,这个方法在此时调用,容器在此获得对Bean进行加工处理的机会;
  • 12.如果在<bean>中指定Bean的作用范围为scope=“prototype”,将Bean返回给调用者,调用者负责Bean后续生命的管理,SPring不在管理这个Bean的生命周期。如果作用范围设置为scope="singleton",则将Bean放入到Spring IoC容器的缓存池中,并将Bean引用返回给调用者,Spring继续对这些Bean进行后续的生命管理;
  • 13.对于scope="singleton"的Bean,当容器关闭时,将触发Spring对Bean的后续生命周期的管理工作,首先如果Bean实现DisposableBean接口,则将调用接口的afterPropertiesSet()方法,可以再次编写释放资源,记录日志等操作;
  • 14.对于scope=“singleton”的Bean,如果通过<bean>的destroy-method属性指定了Bean的销毁方法,Spring将执行Bean的这个方法,完成Bean资源的释放等操作。

简单讲就是



  Spring提倡“不对应用程序类做任何限制”,所以推荐使用<bean>的init-method和destroy-mehtod属性配置方式为Bean指定初始化和销毁的方法。

2.ApplicationContext中Bean的生命周期
  ApplicationContext中Bean的生命周期与BeanFactory的基本相同,其中最大的不同点是:前者会利用java反射机制自动识别出配置文件中定义的BeanPostProcessor,InstantiationAwareBeanPostProcessor和BeanFactoryPostProcessor,并自动将他们注册到应用上下文;而后者需要在代码中通过手工调用addBeanPostProcessor()方法进行注册。所以,在应用开发中普遍使用ApplicationContext。

猜你喜欢

转载自happiness0617.iteye.com/blog/2298609
今日推荐