1.JDK代理:基于接口的动态代理技术
在这里插入图片描述
目标对象必须有接口,目标对象有什么方法,目标接口就有什么方法,
运行期间基于接口动态生成代理对象,所以代理对象也就有目标对象同样的方法。

注意:以下代码只是底层jdk动态代理实现的方式,我们在开发过程中只需要在配置文件中进行配置即可,这些代码spring会帮你自动生成(这是模拟底层)

(1)创建接口及其实现类

public interface TargetInterface {

    public void save();
}

public class Target implements TargetInterface{
    @Override
    public void save() {
        System.out.println("save running....");
    }
}

(2)创建增强的方法

public class Advice {

    public void before(){
        System.out.println("前置增强");
    }
    public void after(){
        System.out.println("后置增强");
    }
}

(3)测试实现

public class ProxyTest {
    public static void main(String[] args) {
        //目标对象
        final Target target=new Target();

        //增强对象
        final Advice advice=new Advice();

        TargetInterface proxy= (TargetInterface) Proxy.newProxyInstance(
                //目标对象类加载器
                target.getClass().getClassLoader(),
                //目标对象相同的接口字节码对象数组
                target.getClass().getInterfaces(),
                //调用代理对象的任何方法,实质执行的都是invoke方法
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        advice.before();//前置增强
                        //执行目标方法
                        Object invoke = method.invoke(target, args);
                        advice.after(); //后置增强
                        return invoke;
                    }
                }
        );
        //调用代理方法
        proxy.save();
    }
}







2.cglib代理:基于父类的动态代理技术
在这里插入图片描述
基于目标对象动态生成一个代理对象,类似于继承(但不是继承),代理对象内部调用目标对象,在调用目标对象之前或者之后介入一些其他代码,从而完成的增强。
(1)创建目标对象类

public class Target {
    public void save() {
        System.out.println("save running....");
    }
}

(2)创建增强类

public class Advice {

    public void before(){
        System.out.println("前置增强");
    }
    public void after(){
        System.out.println("后置增强");
    }
}

3.底层实现

public class ProxyTest {
    public static void main(String[] args) {
        //目标对象
        final Target target=new Target();

        //增强对象
        final Advice advice=new Advice();

        //返回值 就是动态生成的代理对象,基于cglib
        //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 proxy= (Target) enhancer.create();
        proxy.save();
    }
}

结果:
前置增强
save running…
后置增强

posted on 2020-11-15 17:22  凸凸大军的一员  阅读(108)  评论(0编辑  收藏  举报