Spring的Bean的作用域

88 阅读2分钟

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

  • singleton:单例模式Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象Singleton作用域是Spring中的缺省作用域,也可以显示的将Bean定义为singleton模式,配置为:

  • XML

     <bean id="userDao" class="com.ioc.UserDaoImpl" scope="singleton"/>
    
  • Java注解

    @Scope(value = "singleton") 
    
  • prototype:原型模式每次通过Spring容器获取prototype定义的bean时容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态,而singleton全局只有一个对象。根据经验,对有状态的Bean使用prototype作用域,而对无状态的Bean使用singleton作用域。

  • XML

      <bean id="userDao" class="com.ioc.UserDaoImpl" scope="prototype"/>
    
  • Java注解

    @Scope(value = "prototype") 
    
  • request:在一次Http请求中,容器会返回该Bean的同一实例,而对不同的Http请求则会产生新的Bean而且该bean仅在当前Http Request内有效。针对每一次Http请求,Spring容器根据该Bean的定义创建一个全新的实例,且该实例仅在当前Http请求内有效,而其它请求无法看到当前请求中状态的变化,当当前Http请求结束,该Bean实例也将会被销毁。

  • XML

    <bean id="loginAction" class="com.cnblogs.Login" scope="request"/>
    
  • Java注解

    @Scope(value = "request") 
    
  • Session:在一次Http Session中,容器会返回该Bean的同一实例。而对不同的Session请求则会创建新的实例该bean实例仅在当前Session内有效。同Http请求相同,每一次session请求创建新的实例,而不同的实例之间不共享属性,且实例仅在自己的session请求内有效,请求结束,则实例将被销毁。

  • XML

    <bean id="userPreference" class="com.ioc.UserPreference" scope="session"/>,
    
  • Java注解

    @Scope(value = "session") 
    
  • global Session:在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效。该作用域仅在基于webSpring ApplicationContext情形下有效。