首页 > 其他分享 >Spring Bean的五个作用域

Spring Bean的五个作用域

时间:2023-03-18 19:47:52浏览次数:45  
标签:Session 作用域 Spring flag Bean session public

 Spring支持五个作用域:singleton、prototype、request、session、global session

1.singleton:默认作用域Spring IOC容器仅存在一个Bean实例,Bean以单例方式存在,在创建容器时就同时自动创建了一个Bean对象。作用域范围是ApplicationContext中。

2.prototype:每次从容器中调用Bean时,都会返回一个新的实例,即每次调用getBean时。作用域返回是getBean方法调用直至方法结束。

相当于执行newXxxBean().Prototype是原型类型,再我们创建容器的时候并没有实例化,而是当我们获取Bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。

3.request:每次HTTP请求都会创建一个新的Bean,作用域范围是每次发起http请求直至拿到相应结果。该作用域仅适用于WebApplicationContext环境。

4.session:首次http请求创建一个实例,作用域是浏览器首次访问直至浏览器关闭。

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

5.global-session:作用域范围是WebApplicationContext中。一般用于Portlet应用环境,该运用域仅适用于WebApplicationContext环境。

 

作用域范围比较:

prototype < request < session < global-session < singleton

为什么要定义作用域:

可以通过Spring配置的方式限定Spring Bean的作用范围,可以起到对Bean使用安全的保护作用

 

request请求作用域
考虑如下的bean定义:

<bean id="loginController" class="com.example.LoginController" scope="request"/>
@Scope("request")
@Controller
public class LoginController{
   private int flag = 0;
 
    @RequestMapping("/login")
    public int login(){
        return flag++;
    }
}
@RestController
@RequestScope
public class LoginController {
 
    private int flag = 0;
 
    @RequestMapping("/login")
    public int login(){
        return flag++;
    }
}

 

对于每个http请求,Spring容器会创建一个 LoginController Bean 的新实例。也就是说,LoginController Bean 的作用域限于 HTTP 请求范围。 你可以在请求内随意修改这个Bean实例的状态,因为其他 LoginController Bean实例看不到这些变化,Bean实例是与特定的请求相关的。 当请求处理完毕,对应的Bean实例也就销毁(被回收)了。

 

session会话作用域
考虑如下的Bean定义:

<bean id="userController" class="com.example.UserController" scope="session"/>

 

@RestController
@Scope("session")
public class UserController {
    private int flag = 0;
    
    @RequestMapping("/getUser")
    public int getUser(){
        return flag++;
    }
 
}

 

@RestController
@SessionScope
public class UserController {
    private int flag = 0;
    
    @RequestMapping("/getUser")
    public int getUser(){
        return flag++;
    }
 
}

 

在每个HTTP Session的生命周期内,Spring容器会根据id为 UserController 的Bean定义创建一个 UserController Bean的新实例。 也就是说,UserController Bean的作用域限于 HTTP Session范围。和请求作用域 request-scoped Bean 类似, 因为每个会话域 session-scoped Bean的范围限于特定的 HTTP Session 内部,所以一个 Session 内的 UserController Bean也是可以被随意修改, 而不会影响到其他 Session 中的 UserController Bean。当一个HTTP Session 最终用完被JVM回收时,相关的会话域 session-scoped Bean也被一起回收。

 

标签:Session,作用域,Spring,flag,Bean,session,public
From: https://www.cnblogs.com/2324hh/p/17231546.html

相关文章

  • Spring Bean的五个作用域
    ​ Spring支持五个作用域:singleton、prototype、request、session、globalsession1.singleton:默认作用域SpringIOC容器仅存在一个Bean实例,Bean以单例方式存在,在创建容......
  • Spring框架中使用了哪些设计模式及应用场景
    1、工厂模式在各种BeanFactory以及ApplicationContext创建中都有用到2、模板模式在各种BeanFactory以及ApplicationContext创建中都有用到3、代理模式SpringAOP......
  • Spring Bean的五个作用域
     Spring支持五个作用域:singleton、prototype、request、session、globalsession1.singleton:默认作用域SpringIOC容器仅存在一个Bean实例,Bean以​​单例​​方式存在,在创......
  • Spring Bean的五个作用域
     Spring支持五个作用域:singleton、prototype、request、session、globalsession1.singleton:默认作用域SpringIOC容器仅存在一个Bean实例,Bean以​​单例​​方式存在,在创......
  • IDEA社区版找不到SpringAssistant插件下载的解决办法
    进入JetBrains的官方网站搜索插件网址如下https://plugins.jetbrains.com/plugin/10229-spring-assistant/versions/stable打开IntelliJ文件夹,将下载所得内容解压缩到如下......
  • SpringCould
       1.注意springboot与SpringCould的版本兼容关系 ......
  • Spring Study -lesson11-动态代理扩展-2023-03-18
    一个动态代理接口类,可以作为工具接口,便于不同程序公共使用packagecom.feijian.Demo02;importcom.feijian.Demo.Rent;importcom.sun.corba.se.impl.ior.OldJIDLObje......
  • springBoot项目中常用工具类
    springBoot项目中常用工具类目录springBoot项目中常用工具类一、RedisUtils二、JwtUtil三、Result一、RedisUtils导入依赖<dependency><groupId>org.springf......
  • Spring Study -lesson11-动态代理(反射机制)-2023-03-18
    第一:接口类(增删改查)packagecom.feijian.Service;publicinterfaceUserService{publicvoidaddUser();publicvoidupdateUser();publicvoiddelet......
  • 玩转SpringBoot原理:掌握核心技术,成为高级开发者
    本文通过编写一个自定义starter来学习springboot的底层原理,帮助我们更好的使用springboot集成第三方插件步骤一:创建项目步骤二:添加依赖步骤三:创建自动配置类步骤四:创......