一、 引言
二、 方案
方案二
方案三
对外权限分配接口
存在的问题
三、 代码
最初是打算在Spring Aop的前置通知中通过修改目标方法参数来实现,但是通过源码发现封装目标方法参数的类是用final修饰的,所以后面换了种思路。
使用Spring的ator自动代理实现,思路是通过条件判断决定是否要使用自动代理,要使用代理的话,就需要自己实现接口并重写其中invoke方法。
下面我贴出核心代码,文章最后会给出整个demo的链接
继承ator类,重写()方法
public class BeanTypeAutoProxyCreator extends AbstractAutoProxyCreator {
@Override
protected Object[] getAdvicesAndAdvisorsForBean(Class> beanClass,
String beanName, TargetSource customTargetSource) throws BeansException {
return isMatch(beanClass) ? PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS : DO_NOT_PROXY;
}
/**
* 判断是否是需要被代理的对象
* @param clazz 代理对象的类型
* @return
*/
private boolean isMatch(Class> clazz) {
//有两个Class类型的类象,一个是调用isAssignableFrom方法的类对象(后称对象a),
// 以及方法中作为参数的这个类对象(称之为对象b),这两个对象如果满足以下条件则返回true,否则返回false:
//a对象所对应类信息是b对象所对应的类信息的父类或者是父接口,简单理解即a是b的父类或接口

//a对象所对应类信息与b对象所对应的类信息相同,简单理解即a和b为同一个类或同一个接口
if (BaseMapper.class.isAssignableFrom(clazz)) {
return true;
}
return false;
}
}
实现接口,重写invoke()方法
public class MyMethodInterceptor implements MethodInterceptor {
@Autowired
private SysAccess sysAccess;
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
// 权限封装类
SysAccessCriteria result = null;
int flag = -1;
// 目标方法的参数
Object[] args = invocation.getArguments();
for (int i=0; i
if(flag >= 0 && result != null){
args[flag] = result;
}
// 执行目标方法
Object object = invocation.proceed();
return object;
}
}
配置到Spring配置文件中
myMethodInterceptor
Demo完整代码(数据库文件在目录下):
单纯个人设计,应该有很多不足,有不好的地方可以指出,或者有更好的想法可以评论,一起交流。
参考:
*请认真填写需求信息,我们会在24小时内与您取得联系。