Spring 接口根据MAP值动态选择实现类

来源:互联网 发布:一元一级域名 编辑:程序博客网 时间:2024/06/07 01:34

最近换了新工作,发现自己真是很多野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 {@Autowiredprivate QueryService queryService;@Autowiredprivate CrudService crudService;private Map<String,TransferHandler> transferHandlerMap;@Autowiredprivate UserProfileService userProfileService;@Autowiredprivate MailService mailService;@Autowiredprivate TransferQueryService transferQueryService;@Override@Transactionalpublic int addDepositTransfer(Agent agent,TransferTypeEnum type,float amount) {Transfer transfer = add(agent.getId(), type, amount, agent.getSaler(), agent.getProvider());return transfer.getId();}@Override@Transactionalpublic 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@Transactionalpublic void delete(int id) {crudService.delete(Version.class, id);}@Override@Transactionalpublic 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@Transactionalpublic void deleteByIds(String ids) {crudService.executeUpdate("delete from Version where id in ( "+ ids +" )");}//根据Map值调用相应的Handler@Override@Transactionalpublic 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);}@Overridepublic 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 {@Autowiredprivate QueryService queryService;@Autowiredprivate CrudService crudService;@Autowiredprivate SubTradeService subTradeService;@Overridepublic 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);}}@Overridepublic 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);}}@Overridepublic 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);}}}