zoukankan      html  css  js  c++  java
  • 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时候认为的线程安全了。

  • 相关阅读:
    openstack命令行
    Hub, bridge, switch, router, gateway的区别
    openstack奠基篇:devstack (liberty)于centos 7安装
    git常用命令备忘
    如何利用gatling创建一个性能测试例
    如何通过源码生成Gatling可执行工具
    博客园的第一篇博文
    Spring Oauth2 with JWT Sample
    你首先是一个人,然后你才是程序员。
    Maven——快速入门手册(学习记录) ****
  • 原文地址:https://www.cnblogs.com/iCanhua/p/8886601.html
Copyright © 2011-2022 走看看