1. 程式人生 > 實用技巧 >Spring第六篇【動態代理入門】

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() {
                    @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 test01(){
        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();
        t.save();
    }
}