背景
aspectj是Springboot很简洁明了的声明式aop实现方式。项目中需要对数据进行权限划分处理,需要给每个数据打上权限相关参数标签。所以使用spring的aop进行处理。
坑x01
aspectj 在通过 @Pointcut("execution()")
进行定义切面的时候。其实是不支持匹配目标类的父类方法的。具体来说,是无法拦截到目标类中没有实现的方法,如果方法是定义在父类或者实现的接口上,则无法拦截。解决方式就是,子类声明改方法,并且在声明中调用。
代码
@Pointcut("execution(* com.hikvision.fj.core.overview.service..*.saveOrUpdate(..)))")
public void saveOrUpdateSubOpreation() {
}
@Service
public class GovOpennessArticleServiceImpl extends ServiceImpl<GovOpennessArticleMapper, GovOpennessArticlePo> implements IGovOpennessArticleService {
public boolean saveOrUpdate(GovOpennessArticlePo entity) {
return super.saveOrUpdate(entity);
}
}
比如如上代码,需要在GovOpennessArticleServiceImpl
当中声明saveOrUpdate
方法,在其中调用super方法,才可拦截。
坑x02
aspectj 无法拦截依赖中的包接口,例如mybatis plus的service的impl包下的内容
我认为也许和mybatis plus的实现方式有关,具体信息目前没有时间详细深入的研究,后续会研究一下需要如何做到实现。