最近换了新工作,发现自己真是很多野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);
}
}
}