Spring 接口根據MAP值動態選擇實現類

最近換了新工作,發現自己真是很多野5識。睇來要加把勁了~~~~

昨日發現原來可以這麼實現BEAN之間的調用管理的。

雖然不是很懂原理,先記錄下來。以後弄懂了再補充翻!!


先看配置文檔

value-ref是相應的BEAN值

<!-- 開啓註解 -->    
	<context:component-scan base-package="com.xxx"/>
	<import resource="classpath*:sanwn-authority-service.xml" />
	<import resource="classpath*:sanwn-taobao-service.xml" />
	<import resource="classpath*:sanwn-distribution-mail.xml" />
	
	<bean id="xxxx_TransferService" class="com.xxx.xxxxx.transfer.service.TransferServiceImpl">
		<property name="transferHandlerMap">
			<map >
				<entry key="DEPOSIT" value-ref="xxxx_DepositTransferHandler"></entry>
				<entry key="SINGLE_RECKONING" value-ref="xxxx_SingleReckoningTransferHandler"></entry>
				<entry key="MONTH_RECKONING" value-ref="xxxx_MonthReckoningTransferHandler"></entry>
			</map> 
		</property>
	</bean>

service接口和實現類

主要看add(Transfer transfer)方法。

public interface TransferService {
	public int addDepositTransfer(Agent agent,TransferTypeEnum type,float amount);
	public Transfer add(int relationId,TransferTypeEnum type,float amount,UserProfile payer,UserProfile receiver);
	public void delete(int id);
	public void deleteByIds(String ids);
	
	public void cancel(int id);
	public void add(Transfer transfer);
	public void confirm(int id);
}


public class TransferServiceImpl implements TransferService {
	
	@Autowired
	private QueryService queryService;
	
	@Autowired
	private CrudService crudService;
	
	private Map<String,TransferHandler> transferHandlerMap;
	
	@Autowired
	private UserProfileService userProfileService;
	
	@Autowired
	private MailService mailService;
	
	@Autowired
	private TransferQueryService transferQueryService;
	
	@Override
	@Transactional
	public int addDepositTransfer(Agent agent,TransferTypeEnum type,float amount) {
		Transfer transfer = add(agent.getId(), type, amount, agent.getSaler(), agent.getProvider());
		return transfer.getId();
	}

	@Override
	@Transactional
	public Transfer add(int relationId,TransferTypeEnum type,float amount,UserProfile payer,UserProfile receiver) {
		Transfer transfer = new Transfer();
		transfer.setAddTime(new Date());
		transfer.setRelationId(relationId);
		transfer.setPayerId(payer.getId());
		transfer.setPayerAccount(payer.getAlipayAccounts());
		transfer.setReceiverId(receiver.getId());
		transfer.setReceiverAccount(receiver.getAlipayAccounts());
		transfer.setStatus(TransferStatusEnum.WAIT_PAYMENT);
		transfer.setAmount(amount);
		transfer.setType(type);
		crudService.create(transfer);
		return transfer;
	}
	
	
	


	@Override
	@Transactional
	public void delete(int id) {
		crudService.delete(Version.class, id);
		
	}
	

	@Override
	@Transactional
	public void cancel(int id) {
		Transfer transfer = transferQueryService.findById(id);
		transfer.setStatus(TransferStatusEnum.CANCEL);
		crudService.update(transfer);
		TransferTypeEnum type = transfer.getType();
		TransferHandler handler = transferHandlerMap.get(type.name());
		handler.cancel(transfer);
	}
	
	
	@Override
	@Transactional
	public void deleteByIds(String ids) {
		crudService.executeUpdate("delete from Version where id in ( "+ ids +" )");
	}



	//根據Map值調用相應的Handler
	@Override
	@Transactional
	public void add(Transfer transfer) {
		transfer.setAddTime(new Date());
		crudService.create(transfer);
		if (transfer.getStatus() == TransferStatusEnum.WAIT_CONFIRM) {
			//提醒收款方確認收款
			confirmTransferNotify(transfer);
		}
		TransferTypeEnum type = transfer.getType();
		TransferHandler handler = transferHandlerMap.get(type.name());  //根據類型調用調用實現service,從而實現類的方法
		handler.create(transfer);
	}

	private void confirmTransferNotify(Transfer transfer) {
		UserProfile  payer = userProfileService.findById(transfer.getPayerId());
		UserProfile receiver = userProfileService.findById(transfer.getReceiverId());
		if (receiver.getEmail() == null) {
			return;
		}
		MailBuilder mailBuilder = (MailBuilder) ApplicationContextHolder.getApplicationContext().getBean("distribution_ConfirmTransferNotifyMailBuild");
		Map<String,Object> context = new HashMap<String,Object>();
		context.put("username",receiver.getUser().getRealName());
		context.put("transfer",transfer);
		context.put("payer", payer);
		mailBuilder.setTo(receiver.getEmail());
		mailService.send(mailBuilder, context);
	}


	@Override
	public void confirm(int id) {
		Transfer transfer = transferQueryService.findById(id);
		TransferTypeEnum type = transfer.getType();
		transfer.setStatus(TransferStatusEnum.SUCCESS);
		TransferHandler handler = transferHandlerMap.get(type.name());
		handler.confirm(transfer);
	}


	//關鍵。這個是倒入配置文件的類
	public void setTransferHandlerMap(
			Map<String, TransferHandler> transferHandlerMap) {
		this.transferHandlerMap = transferHandlerMap;
	}


	

}

handler類

public interface TransferHandler {

	public void cancel(Transfer transfer);

	public void create(Transfer transfer);

	public void confirm(Transfer transfer);
}


相應的實現類

@Service("xxx_SingleReckoningTransferHandler")
public class SingleReckoningTransferHandler implements TransferHandler {
	
	@Autowired
	private QueryService queryService;
	
	@Autowired
	private CrudService crudService;
	
	@Autowired
	private SubTradeService subTradeService;



	
	@Override
	public void cancel(Transfer transfer) {
		SubTrade subTrade = subTradeService.findById(transfer.getRelationId());
		if (subTrade.getSendGoodsStatus() == SendGoodsStatusEnum.WAIT_SALER_PAY_FOR || subTrade.getSendGoodsStatus() == SendGoodsStatusEnum.WAIT_CONFIRM_PAY_FOR ) {
			subTrade.setSendGoodsStatus(SendGoodsStatusEnum.WAIT_SALER_PAY_FOR);
			crudService.update(subTrade);
		}
	}

	@Override
	public void create(Transfer transfer) {
		SubTrade subTrade = subTradeService.findById(transfer.getRelationId());
		if (subTrade.getSendGoodsStatus() == SendGoodsStatusEnum.WAIT_SALER_PAY_FOR) {
			subTrade.setSendGoodsStatus(SendGoodsStatusEnum.WAIT_CONFIRM_PAY_FOR);
			crudService.update(subTrade);
		}
	}

	@Override
	public void confirm(Transfer transfer) {
		SubTrade subTrade = subTradeService.findById(transfer.getRelationId());
		if (subTrade.getSendGoodsStatus() == SendGoodsStatusEnum.WAIT_CONFIRM_PAY_FOR) {
			subTrade.setSendGoodsStatus(SendGoodsStatusEnum.WAIT_SEND_GOODS);
			crudService.update(subTrade);
		}
	}

	
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章