Spring GOF代理模式

文章介绍了Java中的动态代理机制,包括静态代理和动态代理的概念。动态代理主要通过Java的Proxy类和InvocationHandler接口实现,允许在运行时创建代理对象以增强目标对象的功能。在示例中展示了如何创建自定义的InvocationHandler,处理目标对象的方法调用,并在调用前后添加额外的操作,如计算执行时间,实现性能监控。动态代理的应用在于保护目标对象,增加功能,且能实现代码复用。
摘要由CSDN通过智能技术生成

1.静态代理

2.动态代理

三个角色:目标对象,代理对象,公共接口。

目标对象和代理对象都要实现公共接口

主要是通过jdk的内置代理对象实现Proxy

1.俩关键:InvocationHandler接口 和 Proxy类

IncocationHandler是处理器接口,自己写的代理类要实现该接口并实现invoke方法

public class MyInvocationHandler implements InvocationHandler {
    
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return null;
    }
}

该方法传入三个参数:需要代理的对象proxy,该对象中的莫个方法,以及该方法的参数

方法的四要素:1.调用方法的对象。 

                          2.该方法

                          3.方法参数

                          4.返回结果

在自己写的类中实现公共接口,比如:

public interface OrderService {
  

  void update(int id);
}

目标类

public class OrderServiceImpl implements OrderService{
    @Override
    public void update(int id) throws InterruptedException {
        
        Thread.sleep(1234);
        System.out.println("订单"+id+"修改成功!");
    }
}

自定义处理器

public class MyInvocationHandler implements InvocationHandler {

    private Object target;

    //通过构造方法进行注入要代理的目标对象
    public MyInvocationHandler(Object target) {
        this.target=target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        //可以进行功能增强
        long begin = System.currentTimeMillis();

        method.invoke(target, 1);

        long end = System.currentTimeMillis();

        System.out.println("耗费"+(end - begin)+"毫秒");

        return null;
    }
}

编写测试程序并且把要代理的对象(OrderServiceImpl) 传入

public class PublicTest {

  //目标对象
    OrderService target=new OrderServiceImpl();
    
    @Test
    public void OrderServiceTest() throws InterruptedException {
     OrderService proxyObj = (OrderService)Proxy.newProxyInstance(target.getClass().getClassLoader(),
                                              target.getClass().getInterfaces(),
                                               new MyInvocationHandler(target));

                   proxyObj.update(1);
  }
}

其中Proxy.newProxyInstance()方法传入三个参数:1.要代理对象的类加载器 

                                                                                  2.代理和目标实现的公共接口

                                                                                  3.自定义的代理处理器(主要是实现功能增强)

最后测试程序,

订单1修改成功。
耗费1241毫秒

进程已结束,退出代码0

总结:使用动态代理好处就是可以保护目标对象,实现功能增强,还可以实现代码复用

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值