1.用声明一个切面类,注解用法没有什么特殊的,注意,advice一定要指定匹配类型(patternType=PatternType.method),只能拦截远程组件调用的方法。
package nc.bs.uap.aop;
import java.lang.reflect.Method;
import nc.bs.framework.aop.After;
import nc.bs.framework.aop.Around;
import nc.bs.framework.aop.Aspect;
import nc.bs.framework.aop.Before;
import nc.bs.framework.aop.Joinpoint;
import nc.bs.framework.aop.PatternType;
import nc.bs.framework.aop.Pointcut;
import nc.bs.framework.aop.ProceedingJoinpoint;
import nc.bs.logging.NCSysOutWrapper;
@Aspect
public class LogInterceptor {
@Pointcut
public boolean methodInterceptor(Method method){
NCSysOutWrapper out = (NCSysOutWrapper) System.out;
out.getSysStream().println("Log-methodInterceptor");
return true;
};
// Before类型的 Advice
@Before(pointcut = "methodInterceptor",patternType=PatternType.method)
public void beforeMethod(Joinpoint joinpoint) {
NCSysOutWrapper out = (NCSysOutWrapper) System.out;
out.getSysStream().println("Log-beforeMethod");
}
// After类型的 Advice
@After(pointcut = "methodInterceptor",patternType=PatternType.method)
public void afterMethod(Joinpoint joinpoint) {
NCSysOutWrapper out = (NCSysOutWrapper) System.out;
out.getSysStream().println("Log-afterMethod ");
}
// Around类型的 Advice
@Around(pointcut = "methodInterceptor",patternType=PatternType.method)
public Object aroundMethod(ProceedingJoinpoint pj) throws Throwable {
NCSysOutWrapper out = (NCSysOutWrapper) System.out;
out.getSysStream().println("Log-before aroundMethod ");
Object result = pj.proceed();
out.getSysStream().println("Log-after aroundMethod ");
return result;
}
}
2.手写一个aop文件,指定切面类和目标组件,注意要和组件的upm文件放在同一路径下
<?xml version="1.0" encoding="UTF-8"?>
<module priority="1025">
<aops>
<aspect class="nc.bs.uap.aop.LogInterceptor" component="nc.itf.hi.IPsndocService"/>
</aops>
</module>
3.具体应用,比如在单据保存前后增加校验和业务逻辑,不用去破坏源代码