• 动态代理两种实现方法


    1.概述

    在spring 开源框架中,很多情况下使用了动态代理技术,比如 FEIGN, MYBATIS 的Mapper接口,还有比如spring 的事务管理。

    2. 动态代理实现

    动态代理实现技术有两种方式。

    1.使用jdk的动态代理
    只适用在有接口的情况下
    2.使用CGLIB

    • 支持接口代理
    • 只是无接口代理

    2.1 使用接口代理的方式

    使用代码实现:

    • 接口定义
    public interface IUserService {
    
        String addUser(String name);
    }
    
    • 实现类定义
    public class UserService  implements IUserService{
        @Override
        public String addUser(String name) {
            System.err.println("添加用户:" +name);
            return "user:" + name ;
        }
    }
    
    • 动态代理实现
    public class DynamicProxy  {
        public static <T> T  createProxy(T servie){
            T proxy = (T) Proxy.newProxyInstance(DynamicProxy.class.getClassLoader(),
                    servie.getClass().getInterfaces(), new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    System.err.println("前置执行。。。");
                    method.invoke(servie,args);
                    System.err.println("后置执行。。。");
    
                    return null;
                }
            });
            return proxy;
        }
    }
    
    • 代理执行
    public class JdkProxyDemo {
        public static void main(String[] args) {
            IUserService iUserService=new UserService();
            IUserService proxy= DynamicProxy.createProxy(iUserService);
            proxy.addUser("老王");
        }
    }
    

    2.2 使用GCLIB的方式

    • 引入cglib 包
    <dependency>
                 <groupId>cglib</groupId>
                 <artifactId>cglib</artifactId>
                 <version>2.2.2</version>
    </dependency>
    
    • 被代理类
    public class UserService {
        String addUser(String name) {
            System.err.println(name);
            return name;
        }
    }
    
    • 代理增强类
    public class ServiceInterceptor implements MethodInterceptor {
        @Override
        public Object intercept(Object obj, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            System.err.println("前置执行...");
            Object result = methodProxy.invokeSuper(obj, objects);
            System.err.println("后置执行...");
            return result;
        }
    }
    
    • 实现代理
    public class ProxyDemo {
        public static void main(String[] args) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(UserService.class);
            enhancer.setCallback(new ServiceInterceptor());
            UserService userService = (UserService) enhancer.create();
            userService.addUser("老王");
        }
    }
    
  • 相关阅读:
    java 多线程小记
    Java通过反射实现实例化
    selenium webdriver 屏幕滚动
    selenium webdriver 实现百度贴吧自动签到
    selenium webdriver 小计
    JaveWeb 公司项目(7)----- 通过JS动态生成DIV
    两个DIV并排显示
    Intellij idea注册码失效
    JaveWeb 公司项目(6)----- 通过ToolTip给控件添加动态注释
    Intellij idea 添加浏览器
  • 原文地址:https://www.cnblogs.com/yg_zhang/p/16777829.html
Copyright © 2020-2023  润新知