「这是我参与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")
其他
由于其他的几种作用范围各有自己的单独使用场景,并不常用,也就在此不进行过于具体的描述,只要根据定义使用即可。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。