• JDK动态代理小栗子


    现有功能:

    public interface SomeService {
        void some();
    
        void other();
    }
    

      

    public class ServiceImpl1 implements SomeService {
        @Override
        public void some() {
            System.out.println("some 方法执行");
        }
    
        @Override
        public void other() {
            System.out.println("other 方法执行");
        }
    }
    

      

    假设接口有N多实现类,需要增加功能,需要在每一个类上增加需要功能的代码,十分繁琐

    public class MyUtil {
        public static void log(){
            System.out.println("增加日志功能");
        }
    
        public static void trans(){
            System.out.println("增加事务处理");
        }
    }
    

      

    动态代理实现:

    通过目标类对象获取代理类对象

    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 {
            Object obj = null;
      //使用工具类增加日志功能 MyUtil.log(); obj = method.invoke(target,args);
      //模拟使用工具类处理完成后提交事务 MyUtil.trans(); return obj; } public Object getTarget(){ return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this); } }

      

    测试实现:

    public class MyTest {
        public static void main(String[] args) {
      //目标类对象 SomeService service = new ServiceImpl1();
      //通过目标类对象获取代理类对象 SomeService proxy = (SomeService) new MyInvocationHandler(service).getTarget(); proxy.some(); System.out.println("======================="); proxy.other(); } }

      

     实现指定方法使用代理,增加功能

    @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object obj = null;
            String name = method.getName();
            if ("some".equals(name)){
                MyUtil.log();
                obj  = method.invoke(target,args);
                MyUtil.trans();
            }else {
                obj  = method.invoke(target,args);
            }
            return obj;
        }
    

      

    cglib动态代理:

    第三方的工具库,创建代理对象,原理是继承通过继承目标类创建子类,子类就是代理对象

    动态代理作用

      在目标类代码不改变的情况下,增加功能

      减少代码的重复

      专注业务代码逻辑

      解耦合,业务功能和事务,日志等功能分离

  • 相关阅读:
    静态类、抽象类的笔记
    第一篇
    流复制操作
    速记服务器状态码
    访问修饰符
    jquery对象、js全局变量等tips
    Caching and Indexing
    Using X++ copy the favorites from one user to another
    SID
    Using X++ get Language List from Dynamics AX 2009
  • 原文地址:https://www.cnblogs.com/ethnic/p/14581176.html
Copyright © 2020-2023  润新知