本架构已经注册代理的业务处理对象在运行时都可以对其接口的方法处理过程进行拦截并增加额外的处理逻辑。
在进入方法之前可以针对方法传入的参数进行修饰或者替换。
在方法结束之后可以对其处理的返回值或者异常加以修改或者干扰方法的运行过程。
最终目的是为了在一个集中的地方处理存在大范围共性的业务逻辑或增加一些纯技术或纯规范性质的处理手段。
任何一个数据检查器都必须继承org.jtry.framework.beans.BeanDataChecker接口并实现inCheck和outCheck方法,实际例子如下
public class TestBeanDataChecker implements BeanDataChecker {
@Override
public boolean inCheck(ExecuteResult executeResult) {
if (executeResult.getParameter() != null) {// 如果传入的参数不为空就继续运行方法
Object[] parameter = executeResult.getParameter();// 得到传入方法的参数
if (parameter.length > 0 && parameter[0] instanceof String) {
if (parameter[0].equals("Test")) {
executeResult.setResult(true);// 如果方法的第一个参数为字符串并且为“Test”那么使方法直接返回true
return false;
} else {
parameter[0] = "Test";// 如果方法的第一个参数为字符串则替换为“Test”
}
}
return true;// 允许方法开始执行
} else {
return false;// 否则方法并不会执行
}
}
@Override
public boolean outCheck(ExecuteResult executeResult) {
Exception exception = executeResult.getException();
if (exception instanceof SQLException) {
return false;// 如果方法抛出的异常为SQLException那么方法再次执行
}
Object result = executeResult.getResult();
if (result instanceof Boolean && !(Boolean) result) {
return false;// 如果方法返回的结果是布尔值并且为false那么方法再次执行
}
return true;// 方法执行完毕
}
}
inCheck 与outCheck 方法返回值为布尔值,并且参数皆为org.jtry.framework.common.entity.ExecuteResult
org.jtry.framework.common.entity.ExecuteResult类为针对方法的执行过程封装的javaBean,包含以下3个属性
private Object[] parameter;
private Object result;
private Exception exception;
parameter 方法运行时传入的参数
result 方法运行完毕返回的结果
exception 方法运行时抛出的异常
inCheck方法在当前业务被执行方法之前得到执行
如果inCheck方法返回值为true那么当前业务被执行方法才可以进入逻辑体
如果inCheck方法返回值为false那么当前业务被执行方法不会被执行也不会进入方法逻辑体
如果inCheck方法返回值为false当前业务被执行方法直接返回org.jtry.framework.common.entity.ExecuteResult中的result属性
第一次进入inCheck方法时理论上参数org.jtry.framework.common.entity.ExecuteResult的属性只有parameter值或者全都没有值(业务被执行方法无参)
如果outCheck方法返回false再次进入inCheck方法时org.jtry.framework.common.entity.ExecuteResult参数不会重置并有可能包含之前一次执行的返回值或异常
outCheck方法在当前业务被执行方法之后得到执行
如果outCheck方法返回值为true那么当前业务被执行方法执行完毕
如果outCheck方法返回值为true那么当前业务被执行方法直接返回返回org.jtry.framework.common.entity.ExecuteResult中的result属性
如果outCheck方法返回值为false那么当前业务被执行方法再次被执行并且还会再次进入inCheck方法
如果inCheck方法返回值为false也会进入outCheck方法
如果outCheck的方法逻辑体如下则当前业务被执行方法会进入死循环,请避免。
@Override
public boolean outCheck(ExecuteResult executeResult) {
return false;
}
要把已经准备好的数据检查器注册到框架中并使其生效可以使用如下方法
BeanManager.registrationDataCheckerByClass(
new TestBeanDataChecker(), new Class[] { UserServiceImpl.class, UserDaoImpl.class });
UserServiceImpl类和UserDaoImpl类和的全部方法都注册TestBeanDataChecker数据检查器
BeanManager.registrationDataCheckerByClass(
new TestBeanDataChecker(), UserDaoImpl.class, "del.\\S{0,}","up.\\S{0,}");
UserDaoImpl类中方法名以“del”或者“up”字符串开头的都注册TestBeanDataChecker数据检查器
BeanManager.registrationDataCheckerByPackge(
new TestBeanDataChecker(), "com.test.dao.Impl");
com.test.dao.Impl包下面全部类的全部方法都注册TestBeanDataChecker数据检查器
BeanManager.registrationDataCheckerByPackge(
new TestBeanDataChecker(), "com.test.dao.Impl", "del.\\S{0,}", "up.\\S{0,}");
com.test.dao.Impl包下面全部类中方法名以“del”或者“up”字符串开头的都注册TestBeanDataChecker数据检查器
BeanManager.registrationDataCheckerToAll(
new TestBeanDataChecker(), "del.\\S{0,}", "up.\\S{0,}");
全部注册代理对象中方法名以“del”或者“up”字符串开头的都注册TestBeanDataChecker数据检查器(使用该方式会影响框架运行时效能)
一个业务被执行方法可以注册多个数据检查器,并在运行时先依次进入inCheck方法再依次进入outCheck方法。
同一个数据检查器对象可以被不同的业务被执行方法注册多次。
如果一个业务被执行方法注册两次不同对象同一类型的数据检查器,那么该数据检查器也会进入两次
其他特性请自行摸索,请谨慎使用。