spring AOP 动态代理模式整理

Posted Keep Moving

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring AOP 动态代理模式整理相关的知识,希望对你有一定的参考价值。

package util;

public interface 被代理类接口 {
    public  void queryDataById(String Id);
    
    public void insertData();
    
}
package util;

public class 被代理的类 implements 被代理类接口{


    @Override
    public void insertData() {
        // TODO Auto-generated method stub
        System.out.println("不管参数.反正插入数据了");
    }

    @Override
    public void queryDataById(String Id) {
        System.out.println("通过"+Id+"查出了数据");
    }
    
}
package util;

public class 被代理的类2 implements 被代理类接口{


    @Override
    public void insertData() {
        // TODO Auto-generated method stub
        System.out.println("第二个
类 ,不管参数.反正插入数据了");
    }

    @Override
    public void queryDataById(String Id) {
        System.out.println("这是第二个,,通过"+Id+"查出了数据");
    }
    
}
package util;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * 
 * 这个不是动态代理类!!!!!
 * 主要返回代理类对象!!!!
 * 通过代理类对象调用被代理的对象
 * 
 * @author Steve
 *
 */
//该类并不是代理类,只是将被代理类的对象传进这个类中,经过处理    返回代理类的对象
public class 动态代理类 {
     private 被代理类接口 inter = null;
     //建个构造器,将被代理的对象传进来

    public 动态代理类(被代理类接口 inter) {
        super();
        this.inter = inter;
    }
    
    public Object getProxyObject () {
        //得到classLoader
        ClassLoader loader = inter.getClass().getClassLoader();
        //接口数组
        Class[] interfaces = {被代理类接口.class};
        //去创建一个能处理该接口的AOP处理器
        InvocationHandler h =  new 调用处理器(inter);
        //返回动态代理对象,在运行中,才知道代理哪个接口,调用哪个处理器
        return Proxy.newProxyInstance(loader, interfaces, h);
    }
}     
package util;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//特定的处理器
public class 调用处理器     implements InvocationHandler{

    //将被代理的对象传进来, 可以调用
    private Object target;
    
    public 调用处理器(Object target) {
        this.target = target;
    }
    
    
    //这个处理器的方法,传进来的几个参数,可以想象成已知的
    
    //proxy 是com.sun.proxy代理对象的引用.调用proxy 中的方法    不管什么方法传进来,通过动态都能使用前置和后置通知了
    
    //代理对象会根据传进来的类,动态的代理这个类
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("我在此处使用前置通知开始执行"+method.getName()+"了..........");
            Object result = method.invoke(target, args);
            System.out.println("我在此处织入后置通知"+method.getName()+"执行完了........");
            return result;
    }
}
package util;
/**
 * 采用动态代理的方式实现AOP
 * @author 胡其阳
 *
 */
public class Aop {
    public static void main(String[] args) {
        被代理类接口 b = new 被代理的类();
        被代理类接口 proxy = (被代理类接口) new 动态代理类(b).getProxyObject();
        
        proxy.queryDataById("1331");
        
        proxy.insertData();
        
        //System.out.println(proxy);
    }
}

以上是关于spring AOP 动态代理模式整理的主要内容,如果未能解决你的问题,请参考以下文章

设计模式-AOP动态代理-jdkcglib

Spring学习记录

spring5:AOP操作

Spring AOP JDK动态代理与CGLib动态代理区别

Spring之静态/动态代理模式

Spring之AOP(核心思想:代理模式)