我对AOP的理解
?
1、问题?
问题:想要添加日志记录、性能监控、安全监测?
?
2、最初解决方案?
2.1、最初解决方案
public class MyInvocationHandler implements InvocationHandler { private Object target; public MyInvocationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //1.记录日志 2.时间统计开始 3.安全检查 Object retVal = method.invoke(target, args); //4.时间统计结束 return retVal; } public static Object proxy(Object target) { return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new MyInvocationHandler(target)); }}
?编程模型?
//proxy 在其上调用方法的代理实例 //method 拦截的方法 //args 拦截的参数 Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object retVal=null; //预处理 //前置条件判断 boolean ok = true; if(!ok) {//不满足条件 throw new RuntimeException("你没有权限"); } else {//反射调用目标对象的某个方法 retVal = method.invoke(target, args); } //后处理 return retVal; } ?
缺点:使用麻烦,不能代理类,只能代理接口??
?
public class MyInterceptor implements MethodInterceptor { private Object target; public MyInterceptor(Object target) { this.target = target; } @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy invocation) throws Throwable { //1.记录日志 2.时间统计开始 3.安全检查 Object retVal = invocation.invoke(target, args); //4.时间统计结束 return retVal; } public static Object proxy(Object target) { return Enhancer.create(target.getClass(), new MyInterceptor(target)); }}?编程模型
//proxy 在其上调用方法的代理实例 method拦截的方法 args 拦截的参数 //invocation 用来去调用被代理对象方法的@Overridepublic Object intercept(Object proxy, Method method, Object[] args, MethodProxy invocation) throws Throwable { //预处理 //前置条件判断 boolean ok = true; if(!ok) {//不满足条件 throw new RuntimeException("出错了"); } else {//调用目标对象的某个方法 Object retVal = invocation.invoke(target, args); } //后处理 return retVal;}
@Aspectpublic class PayEbiAspect { @Pointcut(value="execution(* pay(..))") public void pointcut() {} @Around(value="pointcut()") public Object around(ProceedingJoinPoint pjp) throws Throwable { //1.记录日志 //2.时间统计开始 //3.安全检查 Object retVal = pjp.proceed();//调用目标对象的真正方法 //4.时间统计结束 return retVal; }}//2 切入点 @Pointcut(value="execution(* *(..))") public void pointcut() {} //3 拦截器的interceptor @Around(value="pointcut()") public Object around(ProceedingJoinPoint pjp) throws Throwable { Object retVal=null; //预处理 //前置条件判断 boolean ok = true; if(!ok) {//不满足条件 throw new RuntimeException("你没有权限"); } else {//调用目标对象的某个方法 retVal = pjp.proceed(); } //后处理 return retVal; }?
AOSD中文版--基于用例的面向方面软件开发
?