初探Spring之动态代理的使用

来源:互联网 发布:淘宝舒口健牙膏 编辑:程序博客网 时间:2024/06/05 10:55

1.介绍

AOP全称是Aspect Oriented Programming 可以理解为面向切面编程,通过预编译的形式和运行动态代理实现程序功能的统一维护的一种技术。

2.实现方式:

预编译:
AspectJ
动态代理:
JDK动态代理 ,Cglib 动态代理

3.主要的功能有:

日志记录,性能统计,安全控制,事务处理,异常处理等等;
这里写图片描述

4.动态代理

1)jdk动态代理

jdk是面向接口的,所以一定要写一个接口。
代码结构
这里写图片描述
接口的方法:

public void productBm();    public void productBc();    public void productAd();

实现类

public void productBm() {        System.out.println("生产了宝马");    }    public void productBc() {       System.out.println("生产了奔驰");         }    public void productAd() {     System.out.println("生产了奥迪");           }

代理类 实现InvocationHandler:

private Object obj;    public Object getObj() {        return obj;    }    public void setObj(Object obj) {        this.obj = obj;    }    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        System.out.println("销售前");        //代理的方法注入参数 args        Object result=method.invoke(obj, args);method.invoke(obj, args);        System.out.println("销售后");        return result;    }

测试类:

        //创建目标        IcarImpl a=new IcarImpl();        //创建代理        CarProxy cr=new CarProxy();        //设置代理关系        cr.setObj(a);        Icar car = (Icar)     Proxy.newProxyInstance(a.getClass().getClassLoader(), a.getClass().getInterfaces(), cr);        car.productBm();

执行结果:
销售前
生产了宝马
销售后

2)Cglib动态代理

Cglib不是面向接口的 ,所以不用写接口。这个类继承了 MethodInterceptor 。
这次的目标类和上边的一样
代理类:

public class CglibProxy implements MethodInterceptor {    @Override    public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {        System.out.println("销售前");        //方法注入参数        Object result=arg3.invokeSuper(arg0, arg2);        System.out.println("销售后");        return result;    }}

测试类:

        //创建目标        IcarImpl icarImpl = new IcarImpl();        //创建代理        CglibProxy cglibProxy = new CglibProxy();        //设置个中介 将两个联系在一起        Enhancer enhancer=new Enhancer();        enhancer.setSuperclass(icarImpl.getClass());        enhancer.setCallback(cglibProxy);        //生成了目标的对象        IcarImpl  ic= (IcarImpl) enhancer.create();        //调用方法        ic.productBc();

大家有问题还望多多提出,共同进步!