本文记录一个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. nginx配置实例

    user root root; worker_processes ; #error_log logs/error.log; #error_log logs/error.log notice; #err ...

  2. Lua MD5加密字符串

    function md5_sumhexa(k) local md5_core = require "md5.core" k = md5_core.sum(k) return (st ...

  3. Java全栈程序员之05:Ubuntu下安装TOMCAT、集成到IDEA

    使用idea绝不是开发一个Hello World这么简单,现在我们要使用idea进行企业级开发(也就是JavaEE)的准备了,那么首先,我们就得有一个web应用服务器.选什么呢?当然首选是大名鼎鼎的T ...

  4. CentOs7 HP找回root密码

    linuxman本人尝试了两种方式修改密码,只有一种成功.现展示如下第一种:成功1. 在启动界面选择  centos linux, with linux***.x86_642. 按 e 键进入编辑模式 ...

  5. Substr与mb_substr区别

      <?php $str = substr('helloword',3,4);//从下标3开始截取截取4个字符 $str = substr('helloword',3);//从截取掉前三个字符 ...

  6. protobuf 动态创建

    https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/index.html https://originlee.com/2015/03/14/ana ...

  7. 用反向代理nginx proxy_pass配置解决ie8 ajax请求被拦截问题 ie8用nginx代理实现跨域请求访问 nginx405正向代理request_uri

    最近调PC版网站ie8的兼容性,发现所有ajax请求还没到后端服务器就直接ajax error了 ie8发不出ajax请求,断点调试发现ajax全进入了error,提示“No transport” 我 ...

  8. TLB的作用及工作原理

    TLB的作用及工作过程 以下内容摘自<步步惊芯——软核处理器内部设计分析>一书 页表一般都很大,并且存放在内存中,所以处理器引入MMU后,读取指令.数据需要访问两次内存:首先通过查询页表得 ...

  9. PHP事件机制

    先用 3W1H(who what why how) 分析法的思路来解释一下 事件机制, 更重要的是, 这个有什么用. 正常的程序执行, 或者说人的思维趋势, 都是按照 时间线性串行 的, 保持 连续性 ...

  10. logstash之filter处理中括号包围的内容

    如题,logstash之filter处理中括号包围的内容: $grep -v "#" config/logstash-nlp.yml input { kafka { bootstr ...