zoukankan      html  css  js  c++  java
  • 理解原生JAVA AOP思想

        一路走来,遇到好些后生来问我:AOP该如何理解?我一开始是丢个度娘给他们的。但是现在回头想想,培养新人不能这么草率,丢个度娘给他们,让他们花了大量的时间去阅读无用的文章外,一不小心还走火入魔了。所以现在我正儿八经的写了个手稿,以便做以后的相关问题回答。文章有些瑕疵,请咬文嚼字的大牛们忽略,本文目的在于解释AOP到底有个锤子用。

    上安利。。。说错,是案例:在一个夜黑风高的晚上,张三胖突然接到张大胖的电话,说咱们的视频网站响应延时太长了。你想办法监测一下是哪里的代码导致延时巨大~~~。

    张三胖打开代码,关键代码主要在张五胖写的Video类里面:

    public interface IVideo {
        List get();
        Object getInfo();
    }
    public class JapanVideo implements IVideo {
        @Override
        public List get() {
            try {
                Thread.sleep(1024);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("一大堆正规的小视频列表~~~~~");
            return null;
        }
    
        @Override
        public Object getInfo() {
            try {
                Thread.sleep(3221);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("导演:XXX;主演:苍老师~~~~~");
            return null;
        }
    }

    调用方:

    IVideo video = new JapanVideo();
    video.get();
    video.getInfo();

    张三胖不想去修改张五胖的代码。所以张三胖就考虑在每个方法执行前后增加时间计算。如果类里面的方法不多,这样是可以的。但是如果Video有上百个方法,那怎么搞?这时候AOP就来搞事情了。

    public class AOPHandle implements InvocationHandler {
    
        private Object obj;
        public AOPHandle(Object obj){
            this.obj = obj;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //方法返回值
            System.out.println("开始执行:"+System.currentTimeMillis());
            //反射调用方法
            Object ret=method.invoke(obj, args);
            //声明结束
            System.out.println("开始完毕:"+System.currentTimeMillis());
            //返回反射调用方法的返回值
            return ret;
        }
    }

    原调用方修改为:

            AOPHandle aopHandle = new AOPHandle(new JapanVideo());
            IVideo video = (IVideo) Proxy.newProxyInstance(
                    JapanVideo.class.getClassLoader(),
                    new Class[] { IVideo.class },
                    aopHandle);
    
            video.get();
            System.out.println("
    ");
            video.getInfo();

    这样就能检测到每个方法的消耗的时间了。

    这只是一个小例子,其实AOP能做的不仅仅是这些。如:

    日志记录,跟踪,优化和监控
    事务的处理
    系统统一的认证、权限管理等
    应用系统的异常捕捉及处理
    针对具体行业应用的横切行为
  • 相关阅读:
    POJ 3417 Network
    指针动态开空间的板子
    fread()的板子
    luguo P1970 花匠
    Uva
    Uva
    Uva
    Uva
    Uva
    什么才算是真正的编程能力?
  • 原文地址:https://www.cnblogs.com/liu-q/p/11106247.html
Copyright © 2011-2022 走看看