本文记录一个web应用中,如果要获取request对象怎么获取,本次主要思考来自看到上次文件必须把request对象放进service层导致的疑问,然后学习总结之。

  第一,也是我们最常用的,在controller的方法中让request作为参数传入,但是这个的坏处就是我的疑问,必须要把该request传来穿去,导致耦合度高,因为你也不想你的类依赖request。

  第二,通用Spring注入的方式进行。下面代码也可以在基类BaseController中注意,后者更好,避免多次写代码,但原理都是一样的。这种方法不用担心线程安全问题,因为Spring后台会类似数据库连接一样,使用ThreadLocal来对实例进行保存,因此也能保证每个线程唯一。

@Controller
public class TestController extends BaseController{ @Autowired
private HttpServletRequest request; //自动注入request @RequestMapping("/test")
public void test() throws InterruptedException{
//模拟程序执行了一段时间
Thread.sleep(1000);
}

  第三,手动调用,效果和原理同二

@Controller
public class TestController {
@RequestMapping("/test")
public void test() throws InterruptedException {
HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
// 模拟程序执行了一段时间
Thread.sleep(1000);
}
}

  其中自动注入方法和手动注入方法都可以在专门需要request的地方注入,使得代码简练,接口明确解耦合,不依赖框架。下面给出一个在bean中注入的场景:

@Service
public class RecommendationProxy implements PreDiagnosis, Diagnose, DoctorMatch { @Autowired
private PreDiagnosis preDiagnose; @Autowired
private Diagnose diagnose; @Autowired
private DoctorMatch doctorMatch; @Autowired
private HttpServletRequest request; Map<Doctor, Float> doctorAndIndex; public Diagnose getDiagnose() {
return diagnose;
}
}

  可以看到,直接在需要使用request对象的类中获取它而不是在方法中传来传去,贯穿多少层就依赖耦合多少,利用这个思想,可以实现一些分页的方法也可以,因为你不需要要处理数据的时候附带分页信息,可以看出,有了容器,就用了容器上下文,这才是ApplicationContext的实用意义所在。

  涉及Spring和request的还有就是作用域,首先说到Spring作用域的都是指prototype和singleton,前者创建边自生自灭、而singleton则被容器一直引用,知道容易销毁调用其destory方法,那到底什么是request作用域呢?其实不仅仅针对request,还有session,globalSession两个作用域,也就是Spring中的bean,仅在一次请求、回话中有效,所以每一次请求都是创建新的bean,这个就等同于我们不知道ThreadLocal时候认为的线程安全了。

ApplicaitionContext妙用request解耦合的更多相关文章

  1. 李洪强iOS开发之基于彻底解耦合的实验性iOS架构

    基于彻底解耦合的实验性iOS架构   这周我决定做一个关于彻底解耦合的应用架构的实验.我想探究的主题是: “如果所有的应用内通讯都通过一个事件流来完成会怎么样?” 我构造了一个待办事项应用,因为这是我 ...

  2. 六 Struts2访问Servlet的API方式一:完全解耦合的方式

    注意: 完全解耦合的方式,这种方式只能获得代表request.session.application的数据的Map集合. 不能操作这些对象的本身的方法. 1 jsp: <%@ page lang ...

  3. Unity中利用委托与监听解耦合的思路

    这篇随笔是一篇记录性的随笔,记录了从http://www.sikiedu.com/my/course/304,这门课程中学到的内容,附带了一些自己的思考. 一.单例模式的应用 首先假想一种情况,现在需 ...

  4. Junit mockito解耦合测试

    Mock测试是单元测试的重要方法之一. 1.相关网址 官网:http://mockito.org/ 项目源码:https://github.com/mockito/mockito api:http:/ ...

  5. JavaWeb项目前端规范(采用命名空间使js深度解耦合)

    没有规矩不成方圆,一个优秀的代码架构不仅易于开发和维护,而且是一门管理与执行的艺术. 这几年来经历了很多项目,对代码之间的强耦合及书写不规范,维护性差等问题深恶痛绝.在这里,通过仔细分析后,结合自己的 ...

  6. 条件编译#ifdef的妙用详解_透彻

    这几个宏是为了进行条件编译.一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部 分内容指定编译的条件,这就是“条件编译”.有时,希望当满足某条 ...

  7. 条件编译#ifdef的妙用详解

    c语言中条件编译相关的预编译指令,包括  #define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. #define           ...

  8. Spring IoC实现解耦合

    public class UserDaoImpl implements UserDao{ @Override public void save(User user) { // TODO Auto-ge ...

  9. 妙用ES6解构和扩展运算符让你的代码更优雅

    http://www.cnblogs.com/chrischjh/p/4848934.html

随机推荐

  1. echarts-环形图处理图列中的点击,使百分比的数据列不发生变化,默认追加其他选项

    将下列代码copy的echarts编辑器中 app.title = '环形图'; var $legendData = ['直接访问','邮件营销','联盟广告','视频广告','搜索引擎']; var ...

  2. html学习笔记之2——多媒体

    一:插件 插件可以通过 <object> 标签或者 <embed> 标签添加在页面中. <object width="400" height=&quo ...

  3. 在GDAL中添加GDALRasterizeGeometriesBuf函数

    缘起 GDAL的栅格化算法中有GDALRasterizeLayers.GDALRasterizeLayersBuf和GDALRasterizeGeometries函数,但是没有GDALRasteriz ...

  4. iOS 内购讲解

    一.总说内购的内容 1.协议.税务和银行业务 信息填写 2.内购商品的添加 3.添加沙盒测试账号 4.内购代码的具体实现 5.内购的注意事项 二.协议.税务和银行业务 信息填写 2.1.协议.税务和银 ...

  5. 【PHP】解析PHP中的变量

    php是一门脚本语言,同时php中的变量类型也是弱语言类型,这和javascript非常相似.笔者在这里说一说PHP中的变量知识点. 1. 引用类型变量 看下面的案例: <?php class ...

  6. EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象

    EF+LINQ事物处理   在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...

  7. Java中的Cloneable接口理解

    Cloneable接口是一个标记接口,也就是没有任何内容,定义如下: 这里分析一下这个接口的用法,clone方法是在Object种定义的,而且是protected型的,只有实现了这个接口,才可以在该类 ...

  8. 安装最新版RabbitMQ v3.7.13 以及基本配置

    之前用的老版本,新项目新气象,RabbitMQ也用最新版吧 首先打开官网:http://www.rabbitmq.com/install-rpm.html 先到右侧导航栏来看一下 : 第一个红框是指的 ...

  9. 【Git】git pull和git pull --rebase的使用

    git pull = git fetch + git mergegit pull --rebase = git fetch + git rebase 现在来看看git merge和git rebase ...

  10. DTD约束简介

    DTD约束简介 文档类型声明 文档类型声明就是DOCTYPE,它告诉解析器,XML文档必须遵循DTD定义.同时,他也告诉解析器,到哪里找到文档定义的其余内容.在前边的例子里DOCTYPE很简单: &l ...