AOP中JDK动态代理

        在aop中实现动态代理的方式有两种:一种是有接口的情况,使用JDK动态代理,另一种是没有接口的情况,使用CGLIB动态代理。

目录

1、调用newProxyInstance方法

2、编写JDK动态代理代码


        下面讲述AOP中JDK动态代理,使用JDK动态代理,即使用Proxy类里面的方法创建代理对象:

1、调用newProxyInstance方法

 方法有三个参数:

        第一个参数:类加载器

        第二个参数:增强方法所在的类,这个类实现的接口,支持多个接口

        第三个参数:实现这个接口InvocationHandler,创建代理对象,写增强的方法

2、编写JDK动态代理代码

        先给出目录结构:

①编写接口,创建方法

        UserDao.java

package com.atguigu.spring5;

/**
 * @Author 不要有情绪的  ljy
 * @Date 2022/9/19 10:46
 * @Description:
 */
public interface UserDao {
    public int add(int a, int b);

    public String update(String id);
}

②编写实现类,实现接口方法

        UserDaoImpl.java

package com.atguigu.spring5;

/**
 * @Author 不要有情绪的  ljy
 * @Date 2022/9/19 10:47
 * @Description:
 */
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;
    }
}

③使用Proxy类创建接口代理对象

        JDKProxy.java(下面代码中的 UserDaoProxy类实现了 InvocationHandler接口中的invoke方法,在该方法中可以对执行方法进行增强,并且可以根据参数 Method method 实现逻辑编写。)

package com.atguigu.spring5;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * @Author 不要有情绪的  ljy
 * @Date 2022/9/19 10:57
 * @Description:
 */
public class JDKProxy {
    public static void main(String[] args) {
        //创建接口实现类代理对象
        Class[] interfaces = {UserDao.class};
//        Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new InvocationHandler() {
//            @Override
//            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//                return null;
//            }
//        });
        UserDaoImpl userDao = new UserDaoImpl();
        UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
        int result = dao.add(1, 2);
        System.out.println("result: "+result);
    }
}

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

    //1.把创建的是谁的代理对象,把谁传递过来
    //有参数构造传递
    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("方法之后执行..." + object);

        return res;
    }
}

④得到运行结果

学习之所以会想睡觉,是因为那是梦开始的地方。
ଘ(੭ˊᵕˋ)੭ (开心) ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)
                                                                                                      ------不写代码不会凸的小刘

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值