spring 事务 会话

在基于Spring的Web应用程序中,bean的作用域可以是用户“会话”。 从本质上讲,这意味着对会话范围Bean的状态更改仅在用户会话范围内可见。

本条目的目的是简单地突出显示Spring Test MVC提供的一种方法,用于测试将会话范围的bean作为依赖项的组件。

考虑一下UserPreferences类的Spring参考文档中的示例,其中包含用户的timeZoneId:

@Component
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class UserPreferences {private String timeZoneId="default";public String getTimeZoneId() {return timeZoneId;}public void setTimeZoneId(String timeZoneId) {this.timeZoneId = timeZoneId;}
}

在这里,范围被标记为“会话”,并且proxyMode被明确指定为TARGET_CLASS,以指示Spring创建CGLIB代理(因为UserPreferences没有实现任何其他接口)。

现在考虑使用此会话范围的bean作为依赖项的控制器:

@Controller
public class HomeController {@Autowired private UserPreferences userPreferences;@RequestMapping(value="/setuserprefs")public String setUserPrefs(@RequestParam("timeZoneId") String timeZoneId, Model model) {userPreferences.setTimeZoneId(timeZoneId);model.addAttribute("timeZone", userPreferences.getTimeZoneId());return "preferences";}@RequestMapping(value="/gotopage")public String goToPage(@RequestParam("page") String page, Model model) {model.addAttribute("timeZone", userPreferences.getTimeZoneId());return page;}
}

这里有两种控制器方法,第一种方法是设置用户首选项,第二种方法是读取用户首选项。 如果会话作用域的bean运行正常,则在用户会话中对“ / setuserprefs”的调用应在UserPreferences bean中设置timeZoneId首选项,而在同一会话中的另一个调用“ / gotopage”应成功检索先前设置的首选项。

使用现在与Spring-test模块打包在一起的Spring MVC测试支持,测试起来很简单。

测试看起来像这样:

首先使用Spring Java Configuration进行测试的bean定义:

@Configuration
@EnableWebMvc
@ComponentScan({"scope.model","scope.services", "scope.web"})
public class ScopeConfiguration {}

和测试:

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.web.context.WebApplicationContext;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=ScopeConfiguration.class)
@WebAppConfiguration
public class ScopeConfigurationTest {@Autowiredprivate WebApplicationContext wac;private MockMvc mockMvc;@Beforepublic void setup() {this.mockMvc = webAppContextSetup(this.wac).build();}@Testpublic void testSessionScope() throws Exception {MockHttpSession mocksession = new MockHttpSession();this.mockMvc.perform(get("/setuserprefs?timeZoneId={timeZoneId}", "US/Pacific").session(mocksession)).andExpect(model().attribute("timeZone", "US/Pacific"));this.mockMvc.perform(get("/gotopage?page={page}", "home").session(mocksession)).andExpect(model().attribute("timeZone", "US/Pacific"));this.mockMvc.perform(get("/gotopage?page={page}", "home").session(new MockHttpSession())).andExpect(model().attribute("timeZone", "default"));}
}

在测试中,首先创建一个MockHttpSession来模拟用户会话。 随后的两个请求是在此模拟会话的上下文中发出的,因此期望在测试中声明的控制器中可以看到相同的UserPreferences bean。 在第三个请求中,创建了一个新会话,这次是在控制器中看到另一个UserPreferences bean,这是通过查找其他属性来断言的。

这演示了使用Spring测试MVC支持来测试会话范围的bean的干净方法。

参考: all和其他博客中的JCG合作伙伴 Biju Kunjummen 测试了Spring的“会话”范围 。

翻译自: https://www.javacodegeeks.com/2013/06/testing-spring-session-scope.html

spring 事务 会话

spring 事务 会话_测试Spring的“会话”范围相关推荐

  1. java spring 事务传播_实战Spring事务传播性与隔离性

    一.事务传播性 1.1 什么是事务的传播性 事务的传播性一般在事务嵌套时候使用,比如在事务A里面调用了另外一个使用事务的方法,那么这俩个事务是各自作为独立的事务执行提交,还是内层的事务合并到外层的事务 ...

  2. spring 多租户_使用Spring Security的多租户应用程序的无状态会话

    spring 多租户 从前, 我发表了一篇文章,解释了构建无状态会话的原理 . 巧合的是,我们再次为多租户应用程序执行同一任务. 这次,我们将解决方案集成到Spring Security框架中,而不是 ...

  3. spring 事务持久性_项目学生:Spring数据的持久性

    spring 事务持久性 这是Project Student的一部分. 其他职位包括带有Jersey的Webservice Client,带有Jersey的 Webservice Server和业务层 ...

  4. spring boot测试_测试Spring Boot有条件的合理方式

    spring boot测试 如果您或多或少有经验的Spring Boot用户,那么很幸运,在某些时候您可能需要遇到必须有条件地注入特定bean或配置的情况 . 它的机制是很好理解的 ,但有时这样的测试 ...

  5. java 事务嵌套_解惑 spring 嵌套事务

    解惑spring嵌套事务 在所有使用spring的应用中,声明式事务管理可能是使用率最高的功能了,但是,从我观察到的情况看,绝大多数人并不能深刻理解事务声明中不同事务传播属性配置的的含义,让我们来看一 ...

  6. Spring事务管理一:Spring事务管理的优点

    (翻译自spring-framework-reference.pdf 第四章 Data Access) 通常情况下,J2EE有2种事务管理方式:全局事务和本地事务,2种事务都比较明显的缺陷. 全局事务 ...

  7. spring mysql 注解_【Spring】SpringMVC之基于注解的实现SpringMVC+MySQL

    目录结构: contents structure [-] SpringMVC是什么 MVC的全称是Model View Controller,通过实现MVC框架可以很好的数据.视图.业务逻辑进行分离. ...

  8. 一步一步深入spring(1)--搭建和测试spring的开发环境

    1.引用jar包 到spring的网站上下载spring的jar包(本文是2.5.6),解压缩后找到 使用spring必须引用的jar包 spring.jar  commons-logging.jar ...

  9. spring生命周期_理解Spring应用上下文生命周期

    Spring应用上下文启动准备阶段 `BeanFactory`创建阶段 `BeanFactory`准备阶段 `BeanFactory`后置处理阶段 `AnnotationConfigServletWe ...

最新文章

  1. 程序员过关斩将--从用户输入手机验证码开始
  2. 独家 | 在浏览器中使用TensorFlow.js和Python构建机器学习模型(附代码)
  3. 理解Java中的弱引用(Weak Reference)
  4. python画散点图类型-python画时间序列散点图
  5. 【干货】硅谷创业教父:如何获得创业idea
  6. LeetCode 535. TinyURL 的加密与解密(哈希)
  7. 反应器(Reactor):用于事件多路分离和分派的体系结构模式
  8. oracle+10g+cpu补丁,Oracle 10g打补丁(p5490848_10202_LINUX)
  9. centos7解压安装mysql_CentOS7 安装Mysql5.7 解压缩版
  10. c# 定义operator运算符
  11. arma找不到合适的模型_愉悦宝贝丨投资水育早教找不到合适品牌?那是因为你没遇到愉悦宝贝!...
  12. GD32VF103启动流程分析
  13. Java性能调优指南pdf阅读0-100页
  14. 前端工程师必备的ps技巧 — 切图
  15. Data Binding 详解(一)-从零开始
  16. 有限域f9的特征是多少_机械公差f9的上下偏差各是多少啊?
  17. Python中的各种占位符
  18. 【无标题】 二手车汽车资质认证 二手车汽车资质认证
  19. LabVIEW编程实例:如何通过TCP协议进行数据通信
  20. pitch yaw roll方向

热门文章

  1. 21、java中的反射机制
  2. 20、java中的类加载机制
  3. Hadoop入门(十七)Mapreduce的多表关联程序
  4. 自定义ClassLoader和双亲委派机制
  5. 使用JDOM2.0.4 操作/解析xml
  6. C++比较两个字符串是否完全相同
  7. android 设置视频音量大小,为cocos2d-x添加调节视频音量的功能(Android)
  8. 开发app用户协议_APP软件开发如何让用户更开心地付钱?
  9. jedis对redis键加锁+解锁+事务提交
  10. 对象作为参数示例java_功能Java示例 第6部分–用作参数