首页 > 代码库 > 详解 spring AOP 动态代理

详解 spring AOP 动态代理

通过例子查看,首先建立一个实现动态代理的接口Interface1.java,代码如下:

package my.spring.fuck.aoptest;public interface Interface1 {    public void say_hello();}

很简单的一个接口,然后定义一个这个接口的实现类MyImple.java,代码:

package my.spring.fuck.aoptest;public class MyImple implements Interface1{    @Override    public void say_hello() {        System.out.println("hello world");    }}

下面就是我们要创建的代理类了,创建代理类后就完成了动态代理,是最重要的一步了(ps:虽然这里说代理类,但它并不是Proxy类,看代码后可以看出这个类实现了java.lang.reflect.InvocationHandler接口,InvocationHandler的意思是:“调用处理程序”,意思就是我们实现了动态代理后,是由这个类来处理的,而真正的代理类是java.lang.reflect.Proxy类,好吧,有点绕嘴,代理里有详细注释),代码如下:

package my.spring.fuck.aoptest;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;//此类实现了InvocationHandler接口,通过API查看,此接口只有一个方法,即下面重写的invoke方法,下面有详细注释public class MyProxy implements InvocationHandler{        Object object1;//用来存放被代理的类,本例子中指MyImple.java        //bind=绑定,是我们自定义的方法,这个方法的形参是Object类型,用来接收被代理类,本例子中是MyImple.java,然后返回一个Proxy类,方法里有详细注释    public Object bind(Object someObject){        this.object1=someObject;        return Proxy.newProxyInstance(object1.getClass().getClassLoader(),object1.getClass().getInterfaces(), this);        //Proxy=代理,本方法返回一个Proxy类的实例,通过对这个实例操作,即可实现动态代理,看一下上面的三个参数,参数1是类加载器,参数2是被代理的对象,参数3        //是代理的处理程序,通过此方法来获取对象的代理(Proxy),代理中存储了执行方法时候的处理程序(本例中就是本Class,即MyProxy,是一个实现了InvocationHandler接口的类)    }        //下面的方法(invoke)是接口InvocationHandler中的方法,在代理调用此类时,此类调用invoke方法;    //invoke也是java.lang.reflect.Method中的一个方法,每个类的每个方法都属于Method类,这里不再赘述        @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        //此方法的3个参数分别代表代理类,方法,方法的参数列表,由系统自动赋值        System.out.println("AOP 动态代理,在方法执行前的处理");        Object return_obj=method.invoke(object1, args);//执行被代理类的本来的方法        System.out.println("AOP 动态代理,在方法执行后的处理");        return return_obj;    }        public static void main(String[] args){        MyProxy myProxy=new MyProxy();        Interface1 proxy=(Interface1)myProxy.bind(new MyImple());        proxy.say_hello();    }}

 运行Myproxy类,控制台输出如下图:

技术分享

详解 spring AOP 动态代理