Spring默认单例模式自然不用多说,作为开发人员肯定对“慎用全局变量”这个经典都“耳熟能详”,但是真正在开发中却未必会注意到这个问题,只有真能遇到过才能理解的更深刻。
前段时间迁移架构,迁移完成后需要把代码结构更改以符合文档需要,其实个人觉得就是为了美观,麻烦的还是开发人员。 下面是迁移后的代码结构:
/*原始参数集合*/ private Map<String, Object> request = new HashMap<String, Object>(); /*返回值集合*/ private Map<String, Object> response = new HashMap<String, Object>(); /*上下文变量集合*/ private Map<String, Object> processorContext = new HashMap<String, Object>(); public Map<String, Object> process(Map<String, Object> requestMap) { logger.info("网银支付入参: " + requestMap); request.clear();response.clear();processorContext.clear(); request.putAll(requestMap); before(); doProcess(); after(); logger.info("网银支付处理结束,返回参数 " + response); return response; }
其中代码第十行是为了避免全局变量引起的数据混乱问题,所以在每次请求时均clear一下,本以为这样就能保持每个请求的数据的独立性,但是后来测试时发现每次有新的请求进来都会在clear时报空指针,自己远程debug连服务器和测试小妹妹加班debug才发现是每次请求进来时response都为空,但是我在外面直接生成对象了啊,一阵郁闷。后面看了下面的代码才发现是自己不小心把全局变量response给重新赋值了,然后前面有交易失败时直接把response给置为空了。解决办法就是:
response.putAll(reResult);
而非之前的:
reResult=map.get("reResult");
bug虽小,我心犹忧!