Spring注入单例模式问题

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虽小,我心犹忧!

猜你喜欢

转载自Field-notes.iteye.com/blog/2237647