码迷,mamicode.com
首页 > 编程语言 > 详细

理解原生JAVA AOP思想

时间:2019-06-29 14:44:34      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:stack   返回值   阅读   tcl   行业应用   system   检测   time   etc   

    一路走来,遇到好些后生来问我: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("\n");
        video.getInfo();

 

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

 

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

日志记录,跟踪,优化和监控
事务的处理
系统统一的认证、权限管理等
应用系统的异常捕捉及处理
针对具体行业应用的横切行为

理解原生JAVA AOP思想

标签:stack   返回值   阅读   tcl   行业应用   system   检测   time   etc   

原文地址:https://www.cnblogs.com/liu-q/p/11106247.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!