JdonFramework 6.6 运行Robot DCI两次获得Service不equals的疑问?

13-03-18 owerlen
以下代码基于JdonFramewo6.6-->examples-->Robot

1、用于Application方式运行

public class RobotSetup {

public static void main(String[] args) {

AppUtil appUtil = new AppUtil();

Context context = (Context) appUtil.getService("context");

Context context1 = (Context) appUtil.getService("context");

System.out.println(context);

System.out.println(context1);

System.out.println(context.hashCode());

System.out.println(context1.hashCode());

System.out.println(context == context1);

System.out.println(context.hashCode() == context1.hashCode());

System.out.println(context.equals(context1));

appUtil.stop();

}

// output:

// com.test.jdon.demo.robot.service.TestContext@93d6bc

// com.test.jdon.demo.robot.service.TestContext@93d6bc

// 9688764

// 9688764

// false

// true

// false

}

发现两次拿到的context hashcode相等,但是不==,不equals,谁能帮忙分析一下吗?

2、用于Web App方式运行

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String myname = req.getParameter("myname");

System.out.println("doGet active :" + myname);

Context context = (Context) WebAppUtil.getService("context", req);

Context context1 = (Context) WebAppUtil.getService("context", req);

System.out.println(context);

System.out.println(context1);

System.out.println(context.hashCode());

System.out.println(context1.hashCode());

System.out.println(context == context1);

System.out.println(context.hashCode() == context1.hashCode());

System.out.println(context.equals(context1));

Robot robot = new Robot();

robot.setName(myname);

String id = Integer.toString(robot.hashCode());

robot.setId(id);

context.save(robot);

String result = context.hello(id);

resp.getWriter().print("robot response:" + result);

resp.getWriter().print("\n");

result = context.touch(id);

resp.getWriter().print("robot response:" + result);

resp.getWriter().close();

}

// output

// doGet active :jdon

// 2013-03-18 16:15:33,678 [http-8080-1] INFO JdonFramework - is ready.

// 2013-03-18 16:15:34,910 [http-8080-1] INFO JdonFramework - Jdon Framework started successfully!

// init object...

// com.test.jdon.demo.robot.service.TestContext@df33ae

// com.test.jdon.demo.robot.service.TestContext@df33ae

// 14627758

// 14627758

// true

// true

// false

}

发现两次拿到的context hashcode相等,context==context1,但是不equals,谁能帮忙分析一下吗?

[该贴被owerlen于2013-03-18 16:30修改过]

banq
2013-03-18 16:32
拿到的都是代理proxy.

在web app中你调用方式是WebAppUtil.getService("context", req);

将request传入,那么就默认激活HttpSession缓存proxy对象,两次取得都是同一个。

而如果调用WebAppUtil.getService("context", sc);只是将ServletContext传入,那么就不缓存。Application也是这个道理。

owerlen
2013-03-18 17:25
谢谢banq的回复。

context在Robot里面是配置了单例的注解的

@Singleton

@Service("context")

public class TestContext implements Context ,

那么在整个JdonFramework容器里面不是仅仅只有一个context对象吗。

在web app中你调用方式是WebAppUtil.getService("context", req);

将request传入,那么就默认激活HttpSession缓存proxy对象,两次取得都是同一个。

而如果调用WebAppUtil.getService("context", sc);只是将ServletContext传入,那么就不缓存。

你说将request传入,那么就默认激活HttpSession缓存proxy对象,两次取得都是同一个。而如果调用WebAppUtil.getService("context", sc);只是将ServletContext传入,那么就不缓存。我是不是可以这样理解呢:context实例不仅仅存在ServletContext层,而且在HttpSession层也有一份。这样整个系统中不是存在了几个Context对象了吗。

banq
2013-03-18 19:34
通过appUtil.getService等获得的都是代理实例,它和原始实例是不同的,这是一种代理模式,代理实例类似原始实例的引子或者说引用地址,代理实例表面上和原始实例类似,同一个接口,实际上,你调用代理实例的方法时,才真正激活原始实例。

@Singlton 元注解等都是针对原始实例。这个方面类似Spring框架。

owerlen
2013-03-18 21:30
有点明白了,谢谢banq的解答。

系统在启动的时候把Service对象创建好,然后放到JdonFramework容器里面,当客户端向JdonFramework容器获取Service Bean的时候,容器找到这个Bean,接着把这个Service Bean再包装一次,然后返回一个Service Bean的Proxy对象。所以客户端拿到的是Service Bean的Proxy。

猜你喜欢