Spring中bean的作用范围

56 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

bean标签范围配置

  • scope属性指对象的作用范围,取值如下:

image.png

5种作用范围中,request、session和global session三种作用范围仅在基于web的应用中使用,不必关心你所采用的是什么web应用框架,只能用在基于web的SpringApplicationContext环境。

singleton

  • 在Spring IOC容器中仅存在一个Bean实例,Bean以单例方式存在,默认值。
  • 当一个bean的作用范围为singleton,所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。
  • 在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。
  • 通过配置文件中bean标签方式:
<bean id="userDao" class="com.rg.dao.impl.UserDaoImpl" scope="singleton"></bean>
  • 通过@Scope注解的方式:
@Scope("singleton")
public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("保存成功了....");
    }
}

prototype

  • 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行new xxxBean()
  • prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。
  • 通过配置文件中bean标签方式:
<bean id="userDao" class="com.rg.dao.impl.UserDaoImpl" scope="prototype"></bean>
  • 通过@Scope注解的方式
@Scope("prototype")
public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("保存成功了....");
    }
}

request

  • 每次HTTP请求都会创建一个新的Bean,该作用范围仅适用于WebApplicationContext环境
  • 在当前HTTP request内有效,当请求结束后,该对象的生命周期即结束。

session

  • 同一个HTTP Session共享一个Bean,不同Session使用不同Bean,仅适用于WebApplicationContext环境

globalSession

  • 一般用于Portlet应用环境,该作用范围仅适用于WebApplicationContext环境