小弟在做WEBSERVICE的开发工作。目前在看以前公司的一个平台的代码发现一个问题,之前的开发里,用户合法性的判断是和服务逻辑的边界类代码混在一起的。造成了代码的大量重复。(呵呵,汗一个,说问题的时候光说别人,其实我自己写的代码还不如人家呢)所以我考虑以后进入开发后,这类型的代码要抽取出来。WEBSERVICE里又没有filter之类的东西,所以我想到的办法就是AOP验证用户合法性的代码在代理类里,服务边界类只需要关注自己的逻辑就可以了。但是现在问题来了,仔细看了代码后发现服务类里也有一些逻辑需要用户信息,这些逻辑是各不相同的。但是如果这样一来,我等于每一次提供服务的时候一个用户信息就要查两次数据库如果代理类在处理完毕后可以把用户信息这个对象传给被代理类就好了。或者说如果要实现这个东西有可能代理类和被代理类对外公布的方法参数是不一样的。(这样貌似就违背了代理模式的原则)
我想到的解决方法,是让接口尽量抽象化一些比如对外接口是JSON数据格式的。那么我可以在查询完用户信息后,把用户信息补充到JSON里去或者发布的接口有MAP之类的对象,代理类验证完毕后,把用户信息往MAP里放但是总觉得还应该有好的办法,所以上来问问众位高人啊~
谢谢大家

解决方案 »

  1.   

    不好意思, 8楼的兄弟,我又看了下,貌似ThreadLocal解决不了这个问题因为 定义一个变量时TreadLocal类型的要在一个类里定义而代理类和被代理类是通过配置文件配置的,他们之间是不知道互相的存在的,也就无从谈起去访问ThreadLocal变量了恕我愚钝,你还得指点我一下。
      

  2.   

    我太毛躁了太毛躁了我自己试了一下,8楼兄弟给的方法写一个类,里面有两个static变量
    public class LocalVars{    public static ThreadLocal<String> local1 = new ThreadLocal<String>();    public static String local2;}
    然后写一个线程类
    public class Thread1 extends Thread{       public void run(){
              LocalVars.local1.set(String.valueOf(new Random().nextInt()));
              LocalVars.local2 = String.valueOf(new Random().nextInt());          for(int index = 0; index < 10; index++){
                  if(index == 4){
                      System.out.println("local1 = " + LocalVars.local1.get());
                      System.out.println("local2 = " + LocalVars.local2);
                  }else{
                      sleep(1000);
                  }
              }
           }
    }然后在main方法里创建两个线程,这两个线程打出来的值local1的值是不一样的,因为ThreadLocal是线程的局部变量local2的值是一样的,因为两个线程中后一个赋值的线程把前一个线程赋的值给擦掉了
    8楼的兄弟给的答案是可以实行的
    恕我山炮了~