欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring Bean 的生命周期,如何被管理的?

程序员文章站 2022-07-02 16:42:08
定义 Bean是一个被实例化,组装,并通过Spring IOC容器(BeanFactory和ApplicationContext容器)所管理的对象。 作用域 Spring支持五个作用域,分别是singleton、prototype、request、session、global session 说明 ......

定义

bean是一个被实例化,组装,并通过spring ioc容器(beanfactory和applicationcontext容器)所管理的对象。

作用域

spring支持五个作用域,分别是singleton、prototype、request、session、global session

  作用域                   

说明

singleton singleton 是默认的作用域,在spring ioc容器仅存在一个bean实例,bean以单例方式存在,在创建起容器时就同时自动创建了一个bean的对象
prototype 每次从容器中调用bean时,都返回一个新的实例,即每次调用getbean()时,相当于执行newxxxbean()。prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象
request  每次http请求都会创建一个新的bean,该作用域仅适用于webapplicationcontext环境
session 同一个http session共享一个bean,不同session使用不同的bean,仅适用于webapplicationcontext环境

global-session

一般用于portlet应用环境,该运用域仅适用于webapplicationcontext环境

 

 

 

 

 

 

 

 

 

  

       

生命周期

bean的生命周期可以表达为:bean的实例化(定义)- bean的初始化 - bean的使用 - bean的销毁

Spring Bean 的生命周期,如何被管理的?

  1、实例化一个bean--也就是我们常说的new;

    2、按照spring上下文对实例化的bean进行配置(属性注入)--也就是ioc注入;

    3、如果这个bean已经实现了beannameaware接口,会调用它实现的setbeanname(string)方法,此处传递的就是spring配置文件中bean的id值

    4、如果这个bean已经实现了beanfactoryaware接口,会调用它实现的setbeanfactory(setbeanfactory(beanfactory)传递的是spring工厂自身(可以用这个方式来获取其它bean,只需在spring配置文件中配置一个普通的bean就可以);

    5、如果这个bean已经实现了applicationcontextaware接口,会调用setapplicationcontext(applicationcontext)方法,传入spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为applicationcontext是beanfactory的子接口,有更多的实现方法);

    6、如果这个bean关联了beanpostprocessor接口,将会调用postprocessbeforeinitialization(object obj, string s)方法,beanpostprocessor经常被用作是bean内容的更改,并且由于这个是在bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;

    7、如果bean在spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。

    8、如果这个bean关联了beanpostprocessor接口,将会调用postprocessafterinitialization(object obj, string s)方法、;

    注:以上工作完成以后就可以应用这个bean了,那这个bean是一个singleton的,所以一般情况下我们调用同一个id的bean会是在内容地址相同的实例,当然在spring配置文件中也可以配置非singleton。

    9、当bean不再需要时,会经过清理阶段,如果bean实现了disposablebean这个接口,会调用那个其实现的destroy()方法;

    10、最后,如果这个bean的spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。