2022更文挑战6-bean作用范围

176 阅读2分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」。

bean作用范围

前文

在java开发的过程中,bean几乎是一个无法逃脱的问题。作为spring框架的核心思想依赖注入的实现者,bean的作用范围同样是经常遇到的一个问题。本文主要就将来讨论一下bean作用范围的几种情况。

具体内容

bean作用范围来说,主要分为如下的几类:

  • singleton 单例模式,对于每一个ioc容器仅有一个实例对象
  • prototype 具有若干实例对象,每次获取对象时,都会生成一个新的对象
  • request 对于每一个http请求,都会生成一个实例对象
  • session 对于每一个session会话,都会生成一个实例对象
  • application 对于servletContext上下文,有同一个对象,仅在web的上下文中可用
  • websocket 对于每一个websocket连接,都会有一个实例对象

单例模式

下面具体来了解一下十分常用的单例模式。

对于bean来说,如果使用注解时没有对作用范围进行指定,那么默认的作用范围就是单例模式。例如常见的@Controller、@Service、@Component等等在没有特殊指定的情况下,默认都是单例模式。

@Service
public class ChainService {

    private int data;
    @Autowired
    Executor asyncServiceExecutor;
    @Autowired
    SysMapper sysMapper;
    @Autowired
    RuleMapper ruleMapper;

    public int getData() {
        return ++data;
    }
}

当然,由于采用了单例模式,数据自然就变为全局共享同一份数据,不可避免的也会出现出局共享问题。如上面的代码所示,当我们在默认的@Service单例模式下,如果每次获取变量时都对变量进行改变,后续再次调用方法时,就会出现数据不统一的问题。而这种情况一般就需要进行生命周期的指定。

prototype

为了解决上述的问题,我们经常采用的方式就是将bean指定为prototype。这样每次使用bean时,都会重新获取生成新的实例对象,也就避免了线程不安全的问题。

@Service
@Scope("prototype")

其他

由于其他的几种作用范围各有自己的单独使用场景,并不常用,也就在此不进行过于具体的描述,只要根据定义使用即可。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。