Spring第六篇【动态代理入门】

jdk动态代理

import com.example.demo.jdk.Advice;
import com.example.demo.jdk.Target;
import com.example.demo.jdk.TargetInterface;
import org.junit.Test;

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

public class MyTest {

    @Test
    public void test() {
        Target target = new Target();
        Advice advice = new Advice();
        TargetInterface t = (TargetInterface) Proxy.newProxyInstance(
                target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
                    //执行代理对象的任何方法,实质上执行的都是invoke方法
                    @Override
                    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                        advice.before();
                        Object invoke = method.invoke(target, objects);
                        advice.after();
                        return invoke;
                    }
                }
        );
        t.save();
    }
}


cglib动态代理

import com.example.demo.jdk.Advice;
import com.example.demo.jdk.Target;
import org.junit.Test;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class MyTest {

    @Test
    public  void test(){
        Target target = new Target();
        Advice advice = new Advice();
        //1. 创建增强器
        Enhancer enhancer = new Enhancer();
        //2. 将目标类设置为父类
        enhancer.setSuperclass(Target.class);
        //3. 设置回调
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                advice.before(); // 前置增强
                Object invoke = method.invoke(target, objects);
                advice.after(); // 后置增强
                return invoke;
            }
        });
        //4. 创建代理对象
        Target t = (Target) enhancer.create();
        //5. 执行代理对象的方法
        t.save();
    }
}
posted @ 2020-08-16 18:48  幻竹  阅读(76)  评论(0)    收藏  举报