Spring5框架学习:AOP底层原理(十四)

AOP底层使用动态代理

(1)有两种情况动态代理

第一种:有接口情况,使用JDK动态代理

*创建接口实现类代理对象,增强类的方法

第二种:没有接口情况,使用CGLIB动态代理

*创建子类的代理对象,增强类的方法

file

JDK动态代理代码实现

1.使用Proxy类里面方法创建代理对象

Class Proxy
java.lang.Object
java.lang.reflect.Proxy

2.调用newProxyInstance方法

static Object   newProxyInstance(ClassLoader loader, 类<?>[] interfaces, InvocationHandler h)
返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。

方法有三个参数:
1).类加载器
2).增强方法所在的类
3).实现InvocationHandler接口,创建代理对象,写增强部分代码

3.JDK动态代理代码

1)创建接口,定义方法

public interface UserDao {

    public int add(int a,int b);

    public String update(String id);
}

2)创建接口实现类,实现方法

public class UserDaoImpl implements UserDao{

    @Override
    public int add(int a, int b) {
        System.out.println("add方法执行了。。。。");
        return a+b;
    }

    @Override
    public String update(String id) {
        System.out.println("update方法执行了。。。。");
        return id;
    }
}

3)使用Proxy类,创建接口代理对象

//创建代理对象代码
class UserDaoProxy implements InvocationHandler{

    //通过构造方法,将需要代理的对象传递进来
    //    有参构造传递
    //可以直接 传递 UserDaoImpl对象,但为了通用,使用Object
    private Object object;
    public UserDaoProxy(Object object){
        this.object = object;
    }

    //增强的代理逻辑
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //可以根据获取的对象,代码名称判断 是否增强

        //方法之前
        System.out.println("方法之前执行。。。。。"    + method.getName() + "  传递的参数:"+ Arrays.toString(args));

        //执行方法-被增强的方法
        Object res = method.invoke(object, args);

        //方法之后
        System.out.println("方法之后执行1。。。。。"    + method.getName() + "  传递的参数:"+ Arrays.toString(args));
        System.out.println("方法之后执行2。。。。。"    + method.getName() + "  返回值:"+ res);
        System.out.println("方法之后执行3。。。。。"    + method.getName() + "  增强的对象:"+ object);
        return res;
    }
}
public class JDKProxy {

    public static void main(String[] args) {

        //创建接口实现类代理对象
        Class[] interfases = {UserDao.class};

        //1.InvocationHandler内部类的实现方式
//        Object o = Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfases, new InvocationHandler() {
//            @Override
//            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//                return null;
//            }
//        });

//        2.InvocationHandler外部实现
        UserDao userDao = new UserDaoImpl();
        UserDao dao =
                (UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interfases,new UserDaoProxy(userDao));

        int add = dao.add(2, 3);
        System.out.println("相加的结果:"+add);
        System.out.println("=============================================");
        String update = dao.update("30");
        System.out.println("更新的结果:"+update);
    }
}

4)代码执行结果:

方法之前执行。。。。。add  传递的参数:[2, 3]
add方法执行了。。。。
方法之后执行1。。。。。add  传递的参数:[2, 3]
方法之后执行2。。。。。add  返回值:5
方法之后执行3。。。。。add  增强的对象:com.spring5.UserDaoImpl@355da254
相加的结果:5
=============================================
方法之前执行。。。。。update  传递的参数:[30]
update方法执行了。。。。
方法之后执行1。。。。。update  传递的参数:[30]
方法之后执行2。。。。。update  返回值:30
方法之后执行3。。。。。update  增强的对象:com.spring5.UserDaoImpl@355da254
更新的结果:30
暂无评论

发送评论 编辑评论


				
上一篇
下一篇