详解 spring AOP 动态代理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解 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 动态代理的主要内容,如果未能解决你的问题,请参考以下文章

Spring AOP详解

转载Spring AOP详解 JDK动态代理CGLib动态代理

细说Spring——AOP详解(动态代理实现AOP)

Java开发Spring之AOP详解(xml--注解->方法增强事务管理(声明事务的实现))

Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现

java的动态代理机制详解