[Spring]基于AOP使用JDK动态代理[底层原理]

底层原理:
在这里插入图片描述
1.创建接口

package test;

//1.创建接口,定义方法
public interface UserDao {
    public int add(int a,int b);
    public String update(String id);
}

2.被代理类实现接口

package test;

//2.被代理类,实现接口
public class UserDaoImpl implements  UserDao{
    @Override
    public int add(int a, int b) {
        System.out.println("add方法执行l......");
        return a+b;
    }

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

3.代理类实现动态代理

package test;

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

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();
        //UserDaoProxy类中,需要接受一个被代理类对象
        Object obj=Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interfaces,new UserDaoProxy(userDao));
        //newProxyInstance方法返回Object类型
         UserDao dao=(UserDao) obj;
         int result=dao.add(1,2);
         System.out.println("result:"+result);
    }
}
//创建代理对象代码
class UserDaoProxy implements InvocationHandler{

    private Object obj;//实现了接口的被代理类的对象的声明
//1.给被代理的对象实例化2.返回一个代理类的对象
public UserDaoProxy(Object obj) {//一般使用有参构造
    this.obj = obj;
}
    //增强逻辑
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //方法之前
        System.out.println("方法之前执行...."+method.getName()+" :传递的参数..."+ Arrays.toString(args));
        //被增强的方法执行
        Object res=method.invoke(obj,args);
        //方法之后
        System.out.println("方法之后执行...."+obj);
        return res;
    }
}

运行结果如图:
在这里插入图片描述
具体可参照[Java]静态代理、动态代理、AOP编程代码实例:仅仅是形式上发生了变化
https://blog.csdn.net/mmmm0584/article/details/114667324

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值