SpringMVC的Controller中使用线程安全的初始化
因为SpringMVC的Controller默认是单例, 在这种情况下, Controller中使用的私有变量必须也是单例, 例如各种service, 否则会有多线程访问数据互相修改的问题.
对于需要对一类Controller做相同初始化的需求, 可以通过@ModelAttribute("some-variable") public init() 这样的方法解决.
首先创建一个基类如BasicController, 构造一个拦截器, 对基类实现preHandle(), postHandle()方法
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception exception) throws Exception
{
RequestBean requestBean = (RequestBean)request.getAttribute(RequestBean.ATTR_KEY);
if (requestBean != null)
{
requestBean.destroy();
request.removeAttribute(RequestBean.ATTR_KEY);
long current = System.currentTimeMillis();
logger.debug("Page end: " + current + ", time: " + (current - requestBean.getTimestamp()) + " milliseconds");
}
} public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView mav) throws Exception
{
if (handler instanceof HandlerMethod && mav != null)
{
HandlerMethod hm = (HandlerMethod)handler;
if (BasicController.class.isAssignableFrom(hm.getBean().getClass()))
{
mav.addObject("sys_config", Config.getConfigs());
}
}
} public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
long timestamp = System.currentTimeMillis();
logger.debug("Page start: " + timestamp); if (handler instanceof HandlerMethod)
{
HandlerMethod hm = (HandlerMethod)handler;
if (BasicController.class.isAssignableFrom(hm.getBean().getClass()))
{
RequestBean requestBean = new RequestBean(request, response, timestamp);
request.setAttribute(RequestBean.ATTR_KEY, requestBean);
}
}
return true;
}
然后在BasicController中, 通过如下形式对每次访问作初始化
@ModelAttribute("requestBean")
public RequestBean initRequest(HttpServletRequest request) {
return (RequestBean)request.getAttribute(RequestBean.ATTR_KEY);
}
然后在Controller方法中, 就可以直接引用这个初始化好的变量了
@RequestMapping(value = {"/edit","/add"}, method = RequestMethod.GET)
public String doEdit(
@ModelAttribute("requestBean") RequestBean rb)
{
...
}
@ModelAttribute("requestBean")
SpringMVC的Controller中使用线程安全的初始化的更多相关文章
- springmvc的controller中使用@Transactional无效
最近看mybatis的时候做了一个练习,但是进行事务处理的时候出了问题,如下 package com.henu.lz.controller; import org.springframework.be ...
- springmvc 解决 controller 中出现死循环并 stackoverflow 的问题
这是因为这个controller中的方法返回值为void类型,且没有request response这类衍生的重定向,或者返回值为String,但是是null等等的情况,都会引起死循环,然后stack ...
- 在springMVC的controller中获取request,response对象的一个方法
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttr ...
- springMVC:将controller中数据传递到jsp页面
1> 将方法的返回值该为ModelAndView在返回时,将数据存储在ModelAndView对象中如: newModelAndView("/WEBINF/jsp/showData.j ...
- 9.SpringMVC和json结合传递数据 && 10.SpringMVC获取controller中json的数据
- 聊聊Servlet、Struts1、Struts2以及SpringMvc中的线程安全
前言 很多初学者,甚至是工作1-3年的小伙伴们都可能弄不明白?servlet Struts1 Struts2 springmvc 哪些是单例,哪些是多例,哪些是线程安全? 在谈这个话题之前,我们先了解 ...
- SpringMVC Controller中注入Request成员域和在方法中定义中HttpServletRequest有啥区别
先说结论,在Controller中注入Request是线程安全的. 以下是解释: 我们先来看看这两者有什么不同 在controller注入成员变量request 可以看到注入的是一个代理对象 写在方法 ...
- (转)聊聊Servlet、Struts1、Struts2以及SpringMvc中的线程安全
前言 很多初学者,甚至是工作1-3年的小伙伴们都可能弄不明白?servlet Struts1 Struts2 springmvc 哪些是单例,哪些是多例,哪些是线程安全? 在谈这个话题之前,我们先了解 ...
- SpringMVC之八:基于SpringMVC拦截器和注解实现controller中访问权限控制
SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法. preHandle在业务处理器 ...
随机推荐
- Cordoval在iOS中的运用整理
一:关于Cordoval理论知识 1:PhoneGap是手机平台上流行的一款中间件.它构建在各种手机平台所提供的WebView(浏览器内核)组件的基础之上,使用javascript语言对应用开发者提供 ...
- sleep() 和 wait() 的区别
好多面经上都出现了,有必要好好熟悉一下 区别: 1.wait() 可以指定时间,也可以不指定(等五分钟你进来,或者是不叫你一直等着):sleep()必须指定时间(不能一睡不起) 2.wait()是Ob ...
- Android实用代码七段(五)
前言 每次分享意味着每次都有进步,本系列以实用为主,欢迎和我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯 ...
- ios git 终端提交
git status //检查提交状态 git status On branch master //检查分支 git branch //查看分支 git add * //添加所有本地更 ...
- iOS 在xib或storyboard里为控件添加圆角、外框和外框颜色
如果要在xib和storyboard里为控件添加圆角和外框宽度,只要这样做就可以 layer.borderWidth 设置外框宽度属性 layer.cornerRadius 设置圆角属性 ...
- store 加载异常处理与加载信息提示
var msgTip = ''; // 一定要定义在使用前,且定义为全局变量 /--------------------------------store--------------------- ...
- IrfanView 4.36 中文版发布了
IrfanView 4.36 简体中文便携版 小而快的图片浏览器 仅仅不到2M的小软件,功能却能与体积大到几十M的ACDSee相媲美!这个软件就是IrfanView.图片.音频.视频浏览,图片批量格式 ...
- 天书笔记:如何创建一个现代的footer(页脚)
此笔记纯属本人脑残笔记,阅读困难不理解属正常现象,初学者尽量不要阅读,否则轻则口吐白沫重则走火入魔,切记切记 老规矩,效果图 这个布局也是从b站看到的,回来自己实现了一遍 HTML: <div ...
- List 简单升\降序实现
public class User { public int Id { get; set; } public string Code { get; set; } } //示例 //升序 list.So ...
- SQL Server中字符串转化为GUID的标量函数实现
还是工作中遇到的需求,有时候和外部的系统对接,进行数据的核对功能,外部的系统有时候主键字段列数据类是UNIQUEIDENTIFER(GUID)类型的字符串格式,去除了GUID格式中的分隔符“- ...