spring 动态代理 原理

25 篇文章 0 订阅
16 篇文章 0 订阅

动态代理可以在不修改被代理对象源码的情况下,为代理对象添加其他的逻辑功能,可以使用继承和组合两种方式实现,但是那样如果被代理对象很多的情况下实现是不太可能的。

首先,新建一个类,实现InvocationHandler,在里面加上自己的逻辑

public class LogInterceptor implements InvocationHandler {

private Object target;//被代理对象

public Object getTarget() {

   return target;

}

public void setTarget(Object target) {

   this.target = target;

}

private void beforeMethod(Method method){

   //自己添加的业务逻辑

   System.out.println(method.getName()+" start");

}

@Override

public Object invoke(Object proxy, Method method, Object[] args)

       throws Throwable {

   beforeMethod(method);//先调用自己的逻辑

   method.invoke(target, args);//然后调用被代理对象的方法

   return null;

}

}

测试类:

@Test

public void testProxy(){

   //首先新建一个被代理对象

   UserDAO userDAO = new UserDAOImpl();

   LogInterceptor interceptor = new LogInterceptor();

   //将被代理对象设置进去

   interceptor.setTarget(userDAO);

   //新建代理

   UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), interceptor);

   userDAOProxy.save(new User());

   userDAOProxy.delete();

}

控制台输出:

save start
user saved!
delete start
user deleted

通过实验可以知道,这个userDAOProxy的类是$Proxy4,它实现了接口UserDAO,当它调用save(user)方法的时候,由于InvocationHandler的实现类interceptor已经传给它,在这个时候,它首先通过接口UserDAO取得其中的方法Method method = userDAO.getClass().getMethod(),然后调用自身的invoke()方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值