Springboot的Bean的Scope
这周在项目中遇到这样一个Bug,代码大致是这样的,有一个LogEntity日志类,里面有一个InnerLog负责存储每次请求的RPCInfo相关信息,
每次请求的时候会把RPC相关信息加入到InnerLog中。
public class LogEntity {
public LogEntity() {
}
private InnerLog inner = new InnerLog();
public void addRpcInfo(RpcInfo rpcInfo) {
if (gene == null) {
initRpcGene();
}
if (rpcInfo.getRpctype() != null) {
if (StringUtils.isBlank(rpcInfo.getRpcid())) {
rpcInfo.setRpcid(gene.genRpcId());
}
inner.getInnerinfo().add(rpcInfo);
}
}
}
然后在Controller中,注入LogEntity,记录日志信息。
@RestController
@RequestMapping("/v")
public class VideoController extends BaseController { @Autowired
public VideoService videoService; @Autowired
LogEntity logEntity;
@Override
@RequestMapping(value = "/search", method = RequestMethod.GET)
public Response search(Request request) {
long start = System.currentTimeMillis();
logEntity.put(LogConst.STARTTIMESTAMP, String.valueOf(start));
......
......
logEntity.logging(logger);
}
}
然后在压测的时候发现日志很快就到几十个G了。排查发现第二次请求时候的InnerLog中也包括第一次的InnerLog信息。这说明第二次请求和第一次请求
的时候用的是一个LogEntity实例。因此,想到这应该是注入的问题。因为对SpringBoot研究不是很深入,只是会简单的实用。因此,对一些性质还不是很
了解。查阅资料发现,注入的Bean是有范围可选的,默认的范围是Singleton,也就是容器中只有一个Bean实例。接下来,详细的看看Bean都有那几类范
围:
(1)singleton: 表示在spring容器中的单例,通过spring容器获得该bean时总是返回唯一的实例
(2)prototype:表示每次获得bean都会生成一个新的对象
(3)request:表示在一次http请求内有效(只适用于web应用)
(4)session:表示在一个用户会话内有效(只适用于web应用)
(5)globalSession:表示在全局会话内有效(只适用于web应用)
在多数情况,我们只会使用singleton和prototype两种scope,如果未指定scope属性,默认为singleton。
因此,针对这个问题,我们可以再LogEntity类上加上@Scope("prototype")注解,问题就解决了。也可以不改变LogEntity的范围,不过每次请求的时候新建
一个InnerLog就好了。
Springboot的Bean的Scope的更多相关文章
- springboot创建bean
springboot创建bean的方式有两种: 1.直接类上加注解@Component@Controller@Service ... 2.使用@Bean注解配合@Configuration注解 区别是 ...
- Spring揭秘 读书笔记 三 bean的scope与FactoryBean
本书可作为王富强所著<<Spring揭秘>>一书的读书笔记 第四章 BeanFactory的xml之旅 bean的scope scope有时被翻译为"作用域&quo ...
- spring中bean的scope属性理解
bean的scope属性有prototype,singleton,request, session几个属性 spring和struts2整合的时候,struts2的action要配置成scope=&q ...
- Bean的Scope
Bean的scope: 1.Singleton(单例): 一个Spring容器只有以这个Bean实例. 2.prototype(多例): 每次调用新建一个Bean的实例. 3.request:一个ht ...
- Spring(三)之Ioc、Bean、Scope讲解
Spring容器是Spring Framework的核心.容器将创建对象,将它们连接在一起,配置它们,并管理从创建到销毁的整个生命周期.Spring容器使用DI来管理组成应用程序的组件.这些对象称为S ...
- spring bean的scope
scope用来声明容器中的对象所应该处的限定场景或者说该对象的存活时间,即容器在对象进入其相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象. ...
- 【Spring】IoC容器 - Spring Bean作用域Scope(含SpringCloud中的RefreshScope )
前言 上一章学习了[依赖来源],本章主要讨论SpringBean的作用域,我们这里讨论的Bean的作用域,很大程度都是默认只讨论依赖来源为[Spring BeanDefinition]的作用域,因为在 ...
- spring bean中scope="prototype“的作用
今天写代码时,遇到个问题,问题大概如下:在写一个新增模块,当各文本框等输入值后,提交存入数据库,跳到其它页面,当再次进入该新增页面时,上次输入的数据还存在. 经过检查发现是,spring配置文件中,配 ...
- Spring中bean的scope详解
如何使用spring的作用域: <bean id="role" class="spring.chapter2.maryGame.Role" scope=& ...
随机推荐
- hdu-1231 连续最大子序列(动态规划)
Time limit1000 ms Memory limit32768 kB 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj ...
- Hadoop4.2HDFS测试报告之三
第一组:文件存储写过程记录 NameNode:1 DataNode:1 本地存储 scp localpath romotepath 500 2 1 23.67 NameNode:1 DataNode: ...
- python基础学习笔记——循环语句(while、for)
while 循环 流程控制语句 while 1.基本循环 while 条件: # 循环体 # 如果条件为真,那么循环则执行 # 如果条件为假,那么循环不执行 2.break break 用于退出当 ...
- linux的vi和vim编辑器操作
vi:linux内部的文本编辑器:vim:vi的增强版,具有程序编辑的能力. vi和vim的三种常见模式: (1)正常模式(一般模式):vim一打开就是这种模式,此模式下可以使用各种快捷键,比如复制粘 ...
- ogre3D学习基础10 -- 键盘控制与鼠标控制(直接控制)
要实现键盘,鼠标对场景的控制,首先要帧监听,就是在每一帧的渲染前后对它进行操作.这里的操作没有用到缓冲区,只是简单的直接获取. 1.这些步骤和前面的一样,直接上代码,操作还是在createScene函 ...
- bootstrap3兼容ie8浏览器
bootstrap3 兼容IE8浏览器 2016-01-22 14:01 442人阅读 评论(0) 收藏 举报 分类: html5(18) 目录(?)[+] 近期在使用bootstrap这 ...
- 聊聊、Jstack 解决生产问题
最近项目很多,所在公司是一家金融企业.从 APP 端到 基金公司,整个体系涉及到很多系统.而我所负责的,正好是整个体系尾部,业务核心.前段时间,隔几天总会有用户购买理财产品失败,但是日志里面没有任何异 ...
- JAVA-两种后台页面跳转方式
1.请求转发 RequestDispatcher rd = request.getRequestDispatcher("url"); rd.forward(request, res ...
- Wannafly挑战赛2
Cut 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld 题目描述 给你一个长度为n的序列,你每次可以将一个序 ...
- 我们为什么要研究docker
一.docker整体概述 Docker会是改变世界的那只"箱子"吗? 是什么:世界领先的软件容器平台: 开发者使用docker可以解决"在我的机器上没问题" ...