Spring 介面根據MAP值動態選擇實現類
阿新 • • 發佈:2019-01-23
最近換了新工作,發現自己真是很多野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);
}
}
}