spring动态代理

动态代理

public interface UserManager {
    void addUser(String username);
    void delUser(String username);
}
public class UserManagerImpl implements UserManager {

    @Override
    public void addUser(String username) {
        System.out.println("add user " + username);
    }

    @Override
    public void delUser(String username) {
        System.out.println("delete user " + username);
    }
}

JDK动态代理

package wang.proxy.jdkproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JDKProxy implements InvocationHandler {
    // 用于指向被代理对象
    private Object targetObject;

    public Object newProxy(Object targetObject) {
        // 将被代理对象传入进行代理
        this.targetObject = targetObject;
        // 返回代理对象
        return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), this);
    }

    /**
     * 被代理对象的任何方法执行时,都会被invoke方法替换,即:代理对象执行被代理对象中的任何方法时,实际上执行的时当前的invoke方法
     *
     * @param proxy(代理对象的引用)
     * @param method(当前执行的方法)
     * @param args(当前执行方法所需的参数)
     * @throws Throwable
     * @return(和被代理对象方法有相同的返回值)
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 在原来的方法上增加了日志打印功能,增强代码
        printLog(method.getName());

        return method.invoke(targetObject, args);
    }

    /**
     * 模拟日志打印
     */
    private void printLog(String methodName) {
        System.out.println("日志打印: " + methodName);
    }
}

测试:

public class JDKMain {
    public static void main(String[] args) {
        UserManager userManager = new UserManagerImpl();
        System.out.println("--------------------没有使用增强过的方法--------------------");
        userManager.addUser("root");
        userManager.delUser("root");

        System.out.println("--------------------使用代理对象增强过的方法--------------------");
        JDKProxy jdkProxy = new JDKProxy();
        UserManager userManagerProxy = (UserManager)jdkProxy.newProxy(userManager);
        userManagerProxy.addUser("scott");
        userManagerProxy.delUser("scott");
    }
}

--------------------没有使用增强过的方法--------------------
add user root
delete user root
--------------------使用代理对象增强过的方法--------------------
日志打印: addUser
add user scott
日志打印: delUser
delete user scott

CGLIB动态代理

public class CGLibProxy implements MethodInterceptor {
    // 用于指向被代理对象
    private Object targetObject;

    // 用于创建代理对象
    public Object createProxy(Object targetObject) {
        this.targetObject = targetObject;
        return new Enhancer().create(this.targetObject.getClass(), this);
    }

    /**
     * @param proxy(代理对象的引用)
     * @param method(当前执行的方法)
     * @param args(当前执行方法所需的参数)
     * @param methodProxy(当前执行方法的代理对象)
     * @throws Throwable
     * @return(和被代理对象方法有相同的返回值)
     */
    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        String methodName = method.getName();
        if ("addUser".equals(methodName)) {
            printLog(methodName);
        }
        System.out.println("xx:" + methodProxy.getSuperName());
        return methodProxy.invokeSuper(proxy, args);
    }

    /**
     * 模拟日志打印
     */
    /**
     * 模拟日志打印
     */
    private void printLog(String methodName) {
        System.out.println("日志打印: " + methodName);
    }
}

测试

public class CGLIBMain {
    public static void main(String[] args) {
        UserManager userManager = new UserManagerImpl();
        System.out.println("--------------------没有使用增强过的方法--------------------");
        userManager.addUser("root");
        userManager.delUser("root");

        System.out.println("--------------------使用代理对象增强过的方法--------------------");
        CGLibProxy cgLibProxy = new CGLibProxy();
        UserManager cgLibProxyProxy = (UserManager)cgLibProxy.createProxy(userManager);
        cgLibProxyProxy.addUser("scott");
        cgLibProxyProxy.delUser("scott");
    }
}
--------------------没有使用增强过的方法--------------------
add user root
delete user root
--------------------使用代理对象增强过的方法--------------------
日志打印: addUser
xx:CGLIB$addUser$0
add user scott
xx:CGLIB$delUser$1
delete user scott
posted @   shmilyt  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示