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);}}}
- Spring 接口根据MAP值动态选择实现类
- JS根据value的值动态选择
- Spring接口动态注入不同的实现类
- Map接口的实现类
- Map接口及其实现类
- Map接口实现类HashMap、Map.Entry接口
- Map接口,容器比较选择
- SprignMVC+myBatis整合+mybatis源码分析+动态代理实现流程+如何根据mapper接口生成其实现类
- java 集合(6) 选择集合类标准 / Map 接口用法
- List接口及其实现类、Map接口及其实现类
- 根据一个接口返回该接口的所有实现类
- 使用Spring特性实现接口多实现类的动态调用
- 使用Spring特性实现接口多实现类的动态调用
- 使用Spring特性实现接口多实现类的动态调用
- java之Map接口及其实现类
- Map接口常用的实现类
- Map 接口的其他实现类
- Map接口及实现
- C# GUID 知识点
- 在Lenovo的Y430上安装Ubuntu,用nomodeset解决soft lockup
- struts2 + JSON
- [易飞]用户密码加密解密
- 10723Cyborg Genes (LCS + 记忆化搜索)
- Spring 接口根据MAP值动态选择实现类
- 开源 免费 java CMS - FreeCMS1.5-数据对象-info
- 使用ssh向sqlserver2005数据库中保存image类型的二进制图片
- MSSQL还原数据库失败
- linux 判断文件是否存在的access()方法与示例
- 网络挂载
- JS和CSS的多浏览器兼容总结
- http://ffmpeg-windows.googlecode.com/svn/trunk/
- Top 8 Diagrams for Understanding Java