- 我们项目中会有一些公共的校验,像商户的合同和流水是否重复等等,之前是在每个业务类中都做一次验证,本次的项目重构中,我尝试把这些公共的校验提取出来作为一个切面来处理,但是在业务中会用到这些查询出来的结果,我尝试在请求参数的父类中增加一个私有对象来赋值,这样可以在AOP中校验完毕对参数进行赋值,在下文业务类处理直接get这个参数即可,减少了很多的代码量,下面是我的一个demo,可以做为参考项
- 首先是一个父类的请求类假设 date和time是公共的请求参数,每个请求类都需要继承这个父类,Db是业务中的一个数据库DTO
package com.sunyw.xyz.bean;
import lombok.Data;
import java.io.Serializable;
@Data
public class BaseReq implements Serializable {
private String date;
private String time;
private Db db;
}
- DB是要存到数据库中的值,需要在service中进行获取
package com.sunyw.xyz.bean;
import lombok.Data;
@Data
public class Db {
private String name;
private String age;
}
package com.sunyw.xyz.bean;
import lombok.Data;
@Data
public class TestReq extends BaseReq {
private String parm;
}
- 下面是AOP处理,切点是service的所有,在执行业务请求前进行处理
package com.sunyw.xyz.limiter;
import com.alibaba.fastjson.JSON;
import com.sunyw.xyz.bean.BaseReq;
import com.sunyw.xyz.bean.Db;
import com.sunyw.xyz.bean.TestReq;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Component
@Aspect
@Slf4j
public class TestAop {
@Before("execution(public * com.sunyw.xyz.service.*.*(..)))")
public void run(JoinPoint joinPoint) {
log.info("开始进入业务切面");
Object[] args = joinPoint.getArgs();
Object arg = args[0];
log.info("参数校验~~~~~~~~");
System.out.println(arg);
if (arg instanceof BaseReq){
log.info("参数为:[{}]", JSON.toJSON(arg));
BaseReq req =(BaseReq)arg;
Db db = new Db();
db.setAge("12");
db.setName("sunyw");
req.setDate("2365");
req.setTime("4567");
req.setDb(db);
}
}
}
package com.sunyw.xyz.service;
import com.sunyw.xyz.bean.Db;
import com.sunyw.xyz.bean.TestReq;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class TestService {
public String run(TestReq testReq){
log.info("开始执行业务逻辑");
log.info("业务参数为:{}",testReq.toString());
Db db = testReq.getDb();
log.info("db:{}",db.toString());
System.out.println(testReq.getDate());
System.out.println(testReq.getTime());
return "SUCCESS";
}
}
@PostMapping("/send")
public String send(@RequestBody TestReq testReq){
return testService.run(testReq);
}
- 执行的结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210114214657180.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1b2RvZA==,size_16,color_FFFFFF,t_70)