SpringBean生命周期及作用域

bean作用域  

  在Bean容器启动会读取bean的xml配置文件,然后将xml中每个bean元素分别转换成BeanDefinition对象。在BeanDefinition对象中有scope 属性,就是它控制着bean的作用域。
  Spring框架支持5种作用域,有三种作用域是当开发者使用基于web的ApplicationContext的时候才生效的。下面就是Spring直接支持的作用域了,当然开发者也可以自己定制作用域。

    作用域              描述  

  单例(singleton)        (默认)每一个Spring IOC容器都拥有唯一的一个实例对象

  原型(prototype)         一个Bean定义,任意多个对象

  请求(request)         一个HTTP请求会产生一个Bean对象,也就是说,每一个HTTP

  会话(session)         限定一个Bean的作用域为HTTPsession的生命周期。同样,只有基于文本的Spring的Spring ApplicationContext才能使用

  全局会话(global session)   限定一个Bean的作用域为全局HTTPSession的生命周期。通常用于门户网站的场景,同样,只有基本web的Spring ApplicationConrext可用

  当一个bean的作用域为Singleton,那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,Singleton作用域是Spring中的缺省作用域。要在XML中将bean定义成singleton,可以这样配置:

    

  当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。在XML中将bean定义成prototype,可以这样配置:

    

bean生命周期

  

  Bean实例生命周期的执行过程如下:
    1)根据配置情况调用 Bean 构造方法或工厂方法实例化 Bean。
    2)利用依赖注入完成 Bean 
    3)如果 Bean 实现了 BeanNameAware 接口,则 Spring 调用 Bean 的 setBeanName() 方法传入当前 Bean 的 id 
    4)如果 Bean 实现了 BeanFactoryAware 接口,则 Spring 调用 setBeanFactory() 
    5)如果 Bean 实现了 ApplicationContextAware 接口,则 Spring 调用 setApplicationContext() 方法传入当前 ApplicationContext 
    6)如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调用该接口的预初始化方法 postProcessBeforeInitialzation() 对 Bean 进行加工操作,此处非常重要,Spring 的 AOP 
    7)如果 Bean 实现了 InitializingBean 接口,则 Spring 将调用 afterPropertiesSet() 
    8)如果在配置文件中通过 init-method 
    9)如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调用该接口的初始化方法 postProcessAfterInitialization()。此时,Bean 
    10)如果在 <bean> 中指定了该 Bean 的作用范围为 scope="singleton",则将该 Bean 放入 Spring IoC 的缓存池中,将触发 Spring 对该 Bean 的生命周期管理;如果在 <bean> 中指定了该 Bean 的作用范围为 scope="prototype",则将该 Bean 交给调用者,调用者管理该 Bean 的生命周期,Spring 不再管理该方法对 Bean 进行销毁。
    11)如果 Bean 实现了 DisposableBean 接口,则 Spring 会调用 destory() 方法将 Spring 中的 Bean 销毁;如果在配置文件中通过 destory-method 属性指定了 Bean 的销毁方法,则 Spring 将调用该方法对 Bean 进行销毁。
原文地址:https://www.cnblogs.com/wnwn/p/11752297.html