zoukankan      html  css  js  c++  java
  • 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动态代理:

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

    动态代理作用

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

      减少代码的重复

      专注业务代码逻辑

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

  • 相关阅读:
    自动装配Bean
    django的models模型 关联关系和关系查询
    django的models模块查询方法
    django的models模型类的常用数据类型和选项
    linux下查看mysql日志文件的方法
    Error loading MySQLdb module: No module named 'MySQLdb'----------- django成功连接mysql数据库的方法
    Django admin 中抛出 'WSGIRequest' object has no attribute 'user'的错误
    linux搭建django项目基本步骤
    找出字符串的最长不重复字串
    判断一个字符串是不是一个合法的IP地址
  • 原文地址:https://www.cnblogs.com/ethnic/p/14581176.html
Copyright © 2011-2022 走看看