您当前的位置: 首页 >  spring

梁云亮

暂无认证

  • 1浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Spring Bean的作用域

梁云亮 发布时间:2021-09-06 09:24:45 ,浏览量:1

SpringBean作用域有:
  • singleton:单例模式,当spring创建applicationContext容器的时候,spring会欲初始化所有的该作用域实例,加上 lazy-init 可以避免预处理
  • prototype:原型模式,每次通过getBean()方法获取bean就会新产生一个实例,创建后spring将不再对其管理
  • equest:每次请求都新产生一个实例
  • session: 每次会话,只要是同一个会话,就使用同一个实例
  • global session: 全局的web域,类似于servlet中的application
Controller默认是单例的

正因为单例,所以Controller不是线程安全的。

示例:创建SpringBoot项目,然后在其中创建如下所示的Controller:

@RestController
public class TestController {
    private int num = 0;
    @GetMapping("/fun")
    public void fun(HttpServletRequest request) {
        final String sid = request.getSession().getId();
        System.out.println(sid + " " + ++num);
    }
}

启动项目,分别在两个不同的浏览器中请求fun,发现控制台输出结果: 在这里插入图片描述 结论:不同的访问者的请求,结果是相互干扰的,线程不安全。

示例:为Controller指定作用域prototype

@RestController
@Scope("prototype")
public class TestController {
    private int num = 0;

    @GetMapping("/fun")
    public void fun(HttpServletRequest request) {
        final String sid = request.getSession().getId();
        System.out.println(sid + " " + ++num);
    }

}

启动项目,分别在两个不同的浏览器中请求fun,发现控制台输出结果: 在这里插入图片描述 结论:指定了@Scope(“prototype”)后,不同请求者之间不再会产生影响了。

关注
打赏
1665409997
查看更多评论
立即登录/注册

微信扫码登录

0.0386s