Spring Bean作用域及其实例化

来源:互联网 发布:js获取子元素属性 编辑:程序博客网 时间:2024/06/09 07:57

什么是Bean?

Spring Bean是被实例的,组装的及被Spring 容器管理的Java对象。

Bean的作用域

1. singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。

2. prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。

3. request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。

4. Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。

5. global-sessionglobal-sessionPortlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。

Bean实例化

  简要说明Spring什么时候实例化bean,首先要分2种情况
  第一:如果你使用BeanFactory作为Spring Bean的工厂类,则所有的bean都是在第一次使用该Bean的时候实例化
  第二:如果你使用ApplicationContext作为Spring Bean的工厂类,则又分为以下几种情况:
    (1):如果bean的scope是singleton的,并且lazy-init为false(默认是false,所以可以不用设置),则 ApplicationContext启动的时候就实例化该Bean,并且将实例化的Bean放在一个map结构的缓存中,下次再使用该Bean的时候, 直接从这个缓存中取
    (2):如果bean的scope是singleton的,并且lazy-init为true,则该Bean的实例化是在第一次使用该Bean的时候进行实例化
    (3):如果bean的scope是prototype的,则该Bean的实例化是在第一次使用该Bean的时候进行实例化

Spring中Bean的实例化过程
http://static.oschina.net/uploads/space/2011/1222/204039_9370_218421.jpg