ApplicaitionContext妙用request解耦合
本文记录一个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解耦合的更多相关文章
- 李洪强iOS开发之基于彻底解耦合的实验性iOS架构
基于彻底解耦合的实验性iOS架构 这周我决定做一个关于彻底解耦合的应用架构的实验.我想探究的主题是: “如果所有的应用内通讯都通过一个事件流来完成会怎么样?” 我构造了一个待办事项应用,因为这是我 ...
- 六 Struts2访问Servlet的API方式一:完全解耦合的方式
注意: 完全解耦合的方式,这种方式只能获得代表request.session.application的数据的Map集合. 不能操作这些对象的本身的方法. 1 jsp: <%@ page lang ...
- Unity中利用委托与监听解耦合的思路
这篇随笔是一篇记录性的随笔,记录了从http://www.sikiedu.com/my/course/304,这门课程中学到的内容,附带了一些自己的思考. 一.单例模式的应用 首先假想一种情况,现在需 ...
- Junit mockito解耦合测试
Mock测试是单元测试的重要方法之一. 1.相关网址 官网:http://mockito.org/ 项目源码:https://github.com/mockito/mockito api:http:/ ...
- JavaWeb项目前端规范(采用命名空间使js深度解耦合)
没有规矩不成方圆,一个优秀的代码架构不仅易于开发和维护,而且是一门管理与执行的艺术. 这几年来经历了很多项目,对代码之间的强耦合及书写不规范,维护性差等问题深恶痛绝.在这里,通过仔细分析后,结合自己的 ...
- 条件编译#ifdef的妙用详解_透彻
这几个宏是为了进行条件编译.一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部 分内容指定编译的条件,这就是“条件编译”.有时,希望当满足某条 ...
- 条件编译#ifdef的妙用详解
c语言中条件编译相关的预编译指令,包括 #define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. #define ...
- Spring IoC实现解耦合
public class UserDaoImpl implements UserDao{ @Override public void save(User user) { // TODO Auto-ge ...
- 妙用ES6解构和扩展运算符让你的代码更优雅
http://www.cnblogs.com/chrischjh/p/4848934.html
随机推荐
- Java通过SMS短信平台实现发短信功能
在项目中使用过发短信的功能,但那个由于公司内部的限制很麻烦,今天在网上找到一个简单的,闲来无事就把它记录如下: 本程序是通过使用中国网建提供的SMS短信平台实现的(该平台目前为注册用户提供5条免费短信 ...
- PowerShell 显示气球提示框 2
https://www.itninja.com/blog/view/reboot-required-toast-notifications-for-windows-machines [void][Sy ...
- 分析轮子(二)- << ,>>,>> (左移、右移、无符号右移)
前言:写 分析轮子(一)-ArrayList.java 的时候看到源码中有 int newCapacity = oldCapacity + (oldCapacity >> 1); 这样的代 ...
- Python的数据库mongoDB的入门操作
Python代码: import pymongo # 获取本地端口,激活mongo客户端 client = pymongo.MongoClient('localhost',27017) # 创建一个数 ...
- Unity应用架构设计(7)——IoC工厂理念先行
一谈到 『IoC』,有经验的程序员马上会联想到控制反转,将创建对象的责任反转给工厂.IoC是依赖注入 『DI』 的核心,大名鼎鼎的Spring框架就是一个非常卓越的的控制反转.依赖注入框架.遗憾的是, ...
- SNF软件开发机器人2018最新更新内容
SNF软件开发机器人从10月份到现在的更新升级情况如下: 1 表单 表单控件占多列时,宽度默认0,自适应宽度2 excel导出 部分excel导出方法移动到框架中,可通用获取3 生成代码 生成的代码, ...
- Atitit.如何文章写好 论文 文章 如何写好论文 技术博客 v4
Atitit.如何文章写好 论文 文章 如何写好论文 技术博客 1. 原则 2 1.1. 有深度, 有广度 2 1.2. 业务通用性有通用性 尽可能向上抽象一俩层..业务通用性与语言通用性. 2 ...
- [lvs]lvs的三种模式
回顾了下lvs的三种模式的调度机制 1.lvs的dr模式中的arp的抑制,eth用自己口arp回应. 2.keepalive是否直接操作rs? 不直接操作, 只操作dr(配lvs) 3.tunnel模 ...
- users-and-groups-in-linux
https://www.tecmint.com/compress-files-and-finding-files-in-linux/ https://www.tecmint.com/manage-us ...
- 不得不看,只有专家才知道的17个SQL查询提速秘诀!
不得不看,只有专家才知道的17个SQL查询提速秘诀! 原创 2018-01-23 布加迪编译 51CTO技术栈 “ 除非你遵循本文介绍的这些技巧,否则很容易编写出减慢查询速度或锁死数据库的数据库代码. ...