SpringBoot Bean的作用域
在Spring Ioc容器最顶级接口BeanFactory中, 可以看到 isSingleton 和 isPrototype 两个方法, 其中, 如果 isSingleton 返回true, 则Bean在Ioc容器中是以单例的状态存在的, 这也是Spring Ioc容器的默认值, 如果 isPrototype 返回true, 则当我们每次获取Bean的时候, Ioc容器都会创建一个新的Bean, 这显然存在很大的不同, 这就是Spring Bean的作用域问题. 在一般的容器中, Bean多会存在 单例 和 多例 两种作用域, JavaEE广泛的使用在互联网, 而在Web容器中, 则存在页面page, 请求request, 会话session 和 应用application 4种作用域, 对于页面page, 是针对JSP当前页面的作用域, 所以Spring无法支持, 为了满足各类的作用域, 在Spring的作用域中就存在如下的几种类型
表3-1的作用域中, 常用的是加粗的4种, 对于application作用域, 完全可以使用单例来代替
下面探讨单例和原型的区别
@SpringBootTest
@RunWith(SpringRunner.class)
public class ScopeBeanTest {
@Autowired
ApplicationContext context;
@Test
public void test() {
ScopeBean bean1 = context.getBean(ScopeBean.class);
ScopeBean bean2 = context.getBean(ScopeBean.class);
System.out.println(bean1 == bean2);
}
}
@Component
// @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
class ScopeBean {
}
上面代码中使用Junit来进行测试, 定义了简单的类ScopeBean, 类上注解@Scope已经被注释掉了, 这样就使用了默认的单例作用域, 然后我们运行test方法, 从容器中获取两次ScopeBean的Bean, 然后测试bean1==bean2, 此时测试的结果是true, 说明bean1和bean2两个Bean指向了同一个Bean的实例, 所以容器中只有一个Bean, 此时在将注解@Scope放开, 测试结果为false, 因为作用域被改为了原型, 每次获取的都是一个新的实例, 所以bean1==bean2结果为false
注意, 这里@Scope注解中的ConfigurableBeanFactory, 只能提供单例(SCOPE_SINGLETON)和原型(SCOPE_PROTOTYPE)两种作用域, 如果实在SpringMVC环境中, 还可以使用WebApplicationContext去定义其他的作用域, 如请求(SCOPE_REQUEST), 会话(SCOPE_SESSION) 和 应用(SCOPE_APPLICATION)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2020-06-22 《阿里巴巴 Java开发手册》常用规范