引入AOP--代理的比较

来源:互联网 发布:北京网络挂号平台 编辑:程序博客网 时间:2024/06/17 01:10

AOP(面向切面编程):

    切面:从业务逻辑分离出去的横切逻辑。典型:性能监控,日志管理,权限控制,可以从核心的业务逻辑中分离出去。

    通过AOP可以解决代码耦合问题,使职责更加单一。

对于需要增强的代码,我们通常有三种解决方案:

(1)静态代理

(2)JDK动态代理

(3)CGLib动态代理

静态代理:

   由程序员创建生成源代码,再对其进行编译,再程序运行时,class文件就已经存在了。(创建代理类去进行代理,但每有一个需要代理的类,都要创建相应的代理类。随着后期的发展,这种代理类会越来越多。这种方式过于繁琐,需要优化的是只生成一个代理类,让需要被代理的类都依赖这个代理类,这就需要动态代理)。

JDK动态代理:

在程序运行时,通过反射机制动态生成代理。避免编写各个繁琐的静态代理类,

动态代理三个步骤:

(1)编写自定义的InvocationHandler来实现InvocationHandler接口

(2)创建动态代理对象。

(3)代理对象调用

public class MyinvocationHandler implements InvocationHandler {    private Object target;    public MyinvocationHandler(Object target) {        this.target = target;    }    /**     *获取代理对象     */    public Object getProxy(){        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);    }    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        before();        Object rs = method.invoke(target,args);        after();        return rs;    }    public void before(){        System.out.println("开始前");    }    public void after(){        System.out.println("开始后");    }}
JDK动态代理只能代理具有接口的类,不能代理没有接口的类,开源的CGLIb类库具有代理没有接口的类的能力,弥补了JDK的不足。

CGLIB动态代理:采用了底层的字节码技术,通过字节码技术为一个类创建子类,并在子类中对所有方法进行拦截来实现对父类方法的拦截,从而织入横切逻辑,是实现AOP的基础。

public class cglibProxy implements MethodInterceptor {    private Enhancer enhancer = new Enhancer();    public Object getProxy(Class clazz){        //传入父类字节码        enhancer.setSuperclass(clazz);        enhancer.setCallback(this);        //字节码技术创建子类        return enhancer.create();    }    //intercept用于拦截方法的调用(这里可以进行增强的处理)    public Object intercept(Object obj, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {        System.out.println("增强前");        //调用父类的目标方法        Object result = methodProxy.invokeSuper(obj,objects);        System.out.println("增强后");        return result;    }}
getProxy()方法通过传入父类的字节码,创建其子类,intercept()通过对子类方法的拦截来拦截对父类目标方法的调用,顺势织入横切逻辑,达到增强的效果。
对于JDK,CGLib两种动态代理:
 JDK动态代理CGLIB动态代理接口必须不需要性能比cglib低比JDK高耗时耗时相对短耗时长对于单例的对象,因为无需频繁创建对象,用CGLib合适,CGLIB对于final修饰的类无法进行代理。










原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 dell电脑密码忘了怎么办 dell电脑密码忘记了怎么办 手机锁屏为什么打不开怎么办 手机图形解锁忘记了怎么办 华硕电脑锁屏了怎么办 5s忘记解锁密码怎么办 苹果手机密码忘记了怎么办 苹果手机iphone已停用怎么办 手机被停用怎么办不用电脑 激活锁是别人的怎么办 6s开机密码忘了怎么办 苹果手机忘记解锁密码怎么办 忘记苹果触控id怎么办 苹果6app被锁了怎么办 捡的苹果id锁了怎么办 苹果手机id密码锁了怎么办 美版5s刷机后激活怎么办 vivo手机图案解锁忘记了怎么办 苹果5sid锁死了怎么办 苹果id账号被锁怎么办 苹果6s忘了ld怎么办 小米忘记图形解锁怎么办呢 索尼手机忘记解锁图案怎么办 oppoa37忘记锁屏密码怎么办 oppoa37锁屏密码忘了怎么办 oppor9图案密码忘了怎么办 oppor忘记锁屏图案怎么办 oppor手机忘记解锁图案怎么办 oppor手机忘记图案了怎么办 oppo手机屏幕锁忘了怎么办 三星手机屏幕锁忘了怎么办 手机主菜单坏了怎么办 索尼手机密码忘了怎么办 索尼笔记本密码忘了怎么办 索尼手机解锁密码忘了怎么办 索尼记录仪密码忘了怎么办 索尼z3手机忘记开机密码怎么办 索尼忘记锁屏密码怎么办 索尼手机忘记锁屏密码怎么办 忘了手机解锁图案怎么办 索尼手机忘记开机密码怎么办