最近遇到一个问题。同样一份数据需要上传到另外的接口,接口定义完全一样,就是域名不一样。怎么可以避免重写一套代码呢?
答案就是,切面。
例子1:
@Aspect
@Component
@Setter(onMethod_ = @Autowired)
public class CrmAspect {
private CrmClient crmClient;
@After(value = "execution(* com.xxxx.clients.ZhlsClient.addOrder(..)) && args(request)")
public void addOrder(AddOrderRequest request) {
crmClient.addOrder(request);
}
@After(value = "execution(* com.xxxx.clients.ZhlsClient.addWxappVisitPage(..)) && args(request)")
public void addWxappVisitPage(UploadVisitPageIDTO request) {
crmClient.addWxappVisitPage(request);
}
@After(value = "execution(* com.xxxx.clients.ZhlsClient.addOrderSum(..)) && args(request)")
public void addOrderSum(AddOrderSumIDTO request) {
crmClient.addOrderSum(request);
}
}
例子2:
@Aspect
@Component
@Setter(onMethod_ = @Autowired)
public class GaZhlsAspect {
private GaZhlsClient gaZhlsClient;
private UnexConfig unexConfig;
@SneakyThrows
@Around(value = "execution(* com.xxxx.clients.ZhlsClient.getDataSource(..)) && args(merchantId)")
public Object getDataSource(ProceedingJoinPoint pjp, String merchantId) {
if ("ARMANI0S06".equals(unexConfig.getStoreCode())) {
return gaZhlsClient.getDataSource(merchantId);
}
return pjp.proceed();
}
@SneakyThrows
@Around(value = "execution(* com.xxxx.clients.ZhlsClient.addOrder(..)) && args(request)")
public Object addOrder(ProceedingJoinPoint pjp, AddOrderRequest request) {
if ("ARMANI0S06".equals(unexConfig.getStoreCode())) {
return gaZhlsClient.addOrder(request);
}
return pjp.proceed();
}
@SneakyThrows
@Around(value = "execution(* com.xxxx.clients.ZhlsClient.addWxappVisitPage(..)) && args(request)")
public Object addWxappVisitPage(ProceedingJoinPoint pjp, UploadVisitPageIDTO request) {
if ("ARMANI0S06".equals(unexConfig.getStoreCode())) {
return gaZhlsClient.addWxappVisitPage(request);
}
return pjp.proceed();
}
@SneakyThrows
@Around(value = "execution(* com.xxxx.clients.ZhlsClient.addOrderSum(..)) && args(request)")
public Object addOrderSum(ProceedingJoinPoint pjp, AddOrderSumIDTO request) {
if ("ARMANI0S06".equals(unexConfig.getStoreCode())) {
return gaZhlsClient.addOrderSum(request);
}
return pjp.proceed();
}
}
例子1和例子2区别在于@After与@Around区别。其中环绕通知这样使用。