java/spring/代理

本文介绍了静态代理和动态代理的概念及其实现方式。静态代理通过创建接口的实现类来实现在调用方法前后的额外操作;动态代理则利用Java反射机制中的Proxy和InvocationHandler实现业务逻辑与横切关注点的分离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、静态代理

目的是调用接口实现类的某个方法之前或者之后调用另外的操作。

总结下开发步骤:

 1、创建一个接口

 2、创建一个接口的实现类

 3、创建一个代理类,这个代理类也实现了上边的接口,但是将 要被代理的实现类传入到代理类中,在代理类的接口实现方法中调用,并在调用前后加上一些操作(日志等)

二、动态代理

AOP的原理就是动态代理。

JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例。

    import java.lang.reflect.InvocationHandler;  
    import java.lang.reflect.Method;  
      
    public class MyHandler implements InvocationHandler {  
        private Object target;  
     public MyHandler(Object target){//①target为目标的业务类  
      this.target = target;  
     }  
     public Object invoke(Object proxy, Method method, Object[] args)  
       throws Throwable {  
      //横向逻辑代码
      Object bj = method.invoke(target, args);//②通过反射方法调用目标业务类的业务方法  
     //横向逻辑代码
      return obj;  
     }  
    }  
</pre><p></p><h2>Proxy联系Handler与业务逻辑</h2><pre name="code" class="java"><pre name="code" class="java">    import java.lang.reflect.Proxy;  
    public class Service {  
     public static void main(String[] args) {  
      ForumService target = new ForumServiceImpl();//①目标业务类  
    //② 将目标业务类和横切代码编织到一起  
      PerformaceHandler handler = new PerformaceHandler(target);  
             //③为编织了目标业务类逻辑和性能监视横切逻辑的handler创建代理类  
      ForumService proxy = (ForumService) Proxy.newProxyInstance(  
    target.getClass().getClassLoader(),  
        target.getClass().getInterfaces(),  
     handler);  
             //④ 操作代理实例  
      proxy.removeForum(10);  
      proxy.removeTopic(1012);  
     }  
    }  



代理实例就实现了目标业务类的所有接口。我们就可以按照调用业务逻辑接口的实例相同的方式调用代理实例。

动态代理实现了业务逻辑代码和横向服务逻辑代码的分离。当其他的业务类需要调用相同的横向服务时,分别为它们创建代理对象就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值