Spring Bean的生命周期管理(上)

1 Spring简介


  • 轻量级容器,提供集中式,自动配置与装配应用业务对象功能


  • 提供统一的事务管理抽象,基于插件式的事务管理(声明性事务管理)能够很容易的实现事务层管理,而无需了解底层事务实现


  • 提供统一的数据访问抽象,包括简单和有效率的JDBC框架,极大的改进了效率(大大减少了开发的代码量)并且减少了可能的错误


  • Spring的数据访问层集成了Toplink,Hibernate,JDO,and iBATIS SQL Maps等O/R mapping解决方案,其目的是提供统一的DAO支持类实现和事务管理策略


  • Spring提供了一个用标准Java编写的AOP框架(也能集成AspectJ),提供基于POJOs的声明式的事务管理和其他企业事务


  • 提供可以与IoC容器集成的强大而灵活的MVCWeb框架


Spring Bean的生命周期管理(上)


2 Bean对象生命周期管理

Spring Bean的生命周期管理(上)


1 Spring对Bean进行实例化


相当于new Class()


2 Spring将值和Bean的引用注进Bean对应的属性

3 实现BeanNameAware接口


  • Spring将Bean的ID传递给setBeanName()方法
  • 实现BeanNameAware主要为了通过Bean的引用获得Bean的ID,一般业务中是很少有用到Bean的ID

4 实现BeanFactoryAware接口


  • Spring将调用setBeanDactory(BeanFactory bf),并把BeanFactory容器实例作为参数传入
  • 实现BeanFactoryAware 主要为了获取Spring容器,如Bean通过Spring容器发布事件

5 实现ApplicationContextAwaer接口


Spring容器将调用setApplicationContext(ApplicationContext ctx),把应用上下文作为参数传入。

与BeanFactory类似都为获取Spring容器,不同是

Spring容器在调用setApplicationContext方法时会把它自己作为setApplicationContext 的参数传入

而Spring容器在调用setBeanDactory前需要程序员自己指定(注入)setBeanDactory里的参数BeanFactory


6 BeanPostProcess接口


Spring将调用它们的postProcessBeforeInitialization(预初始化)方法,在Bean实例创建成功后对进行增强处理,如对Bean进行修改,增加某个功能。


7 InitializingBean接口


为bean提供了初始化方法的方式。


只含afterPropertiesSet方法,凡是继承该接口的类,在初始化bean时会自动执行该方法。


Spring将调用它们的afterPropertiesSet方法,作用与在配置文件中对Bean使用init-method声明初始化同效,都是在Bean的全部属性设置成功后,执行的初始化方法。


实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init-method指定的方法相对来说效率要高。但init-method方式消除了对spring的依赖

若调用afterPropertiesSet方法时产生异常,则不会再调用init-method指定的方法


package org.springframework.beans.factory;

/**
 * 所有由BeanFactory设置的所有属性都需要响应的bean的接口:例如,执行自定义初始化,或者只是检查所有强制属性是否被设置。
 * 实现InitializingBean的替代方法是指定一个自定义init方法,例如在XML bean定义中。
 */
public interface InitializingBean {

    /**
     * 在BeanFactory设置了提供的所有bean属性后,由BeanFactory调用。 
     *这个方法允许bean实例在所有的bean属性被设置时才能执行
     */
    void afterPropertiesSet() throws Exception;

}

若class中实现该接口,在Spring Container中的bean生成之后,自动调用函数afterPropertiesSet()。


因其实现了InitializingBean接口,其中只有一个方法,且在Bean加载后就执行。该方法可被用来检查是否所有的属性都已设置好。


8 BeanPostProcess接口

Spring将调用它们的postProcessAfterInitialization(后初始化)方法,作用与6一样,只不过6是在Bean初始化前执行,而这是在Bean初始化后执行。


经过以上工作,Bean将一直驻留在应用上下文中给应用使用,直到应用上下文被销毁。


9 DispostbleBean接口

  • Spring将调用它的destory方法
  • 作用与在配置文件中对Bean使用destory-method属性的作用一样,都是在Bean实例销毁前执行的方法


Spring Bean是Spring应用中最最重要的部分了。所以来看看Spring容器在初始化一个bean的时候会做那些事情,顺序是怎样的,在容器关闭的时候,又会做哪些事情。


Spring容器初始化
=====================================
调用GiraffeService无参构造函数
GiraffeService中利用set方法设置属性值
调用setBeanName:: Bean Name defined in context=giraffeService
调用setBeanClassLoader,ClassLoader Name = sun.misc.Launcher$AppClassLoader
调用setBeanFactory,setBeanFactory:: giraffe bean singleton=true
调用setEnvironment
调用setResourceLoader:: Resource File Name=spring-beans.xml
调用setApplicationEventPublisher
调用setApplicationContext:: Bean Definition Names=[giraffeService, org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#0, com.giraffe.spring.service.GiraffeServicePostProcessor#0]
执行BeanPostProcessor的postProcessBeforeInitialization方法,beanName=giraffeService
调用PostConstruct注解标注的方法
执行InitializingBean接口的afterPropertiesSet方法
执行配置的init-method
执行BeanPostProcessor的postProcessAfterInitialization方法,beanName=giraffeService
Spring容器初始化完毕
=====================================
从容器中获取Bean
giraffe Name=JavaEdge
=====================================
调用preDestroy注解标注的方法
执行DisposableBean接口的destroy方法
执行配置的destroy-method
Spring容器关闭

先来看看,Spring在Bean从创建到销毁的生命周期中可能做得事情。


initialization 和 destroy

有时需要在Bean属性值set好后、Bean销毁前搞事情,比如检查Bean中某个属性是否被正常设值。

Spring提供了多种方法让我们可以在 Bean 的生命周期中执行initialization和pre-destroy方法。


1 实现InitializingBean/DisposableBean接口

这两个接口都只包含一个方法:


  • 实现InitializingBean#afterPropertiesSet(),可在Bean属性值设置好后操作
  • 实现DisposableBean#destroy(),可在销毁Bean前操作

案例


public class GiraffeService implements InitializingBean, DisposableBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("执行InitializingBean接口的afterPropertiesSet方法");
    }
    
    @Override
    public void destroy() throws Exception {
        System.out.println("执行DisposableBean接口的destroy方法");
    }
}

这种使用比较简单,但不推荐,会将Bean实现和Spring框架耦合。

上一篇:004-windows(64位)下使用curl命令


下一篇:不支持图形化界面的Linux系统如何显示图像化界面?飞腾服务器显示图像化界面方法,DISPLAY environment variable is undefined问题解决方法