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);
		}
	}

	
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值