2021-10-12

spring aop动态代理

aop的底层是动态代理,如果实现了接口就是采用jdk的动态代理技术,如果没有实现接口就是采用cglib动态代理技术

jdk动态代理是基于接口实现的
在这里插入图片描述

cglib动态代理是基于继承实现的
被代理对象类:

public class Person {


    public String sing(String name) {
        System.out.println("被代理对象 小明唱"+name+"歌");
        return "被代理对象 飞吻";
    }

    public String dance(String name) {
        System.out.println("被代理对象 小明跳"+name+"舞");
        return "被代理对象 嗨起来了";
    }

}

cglib代理代码实现块

public class ProxyFactory implements MethodInterceptor {


    //准备被代理对象
    private Person person = new Person();


    /**
     * 创建被代理对象
     *
     * @return
     */
    public Person creatProxy() {

        //1.准备cglib类库
        Enhancer enhancer = new Enhancer();

        //2.设置代理对象的父类
        enhancer.setSuperclass(person.getClass());

        //3.设置回调函数
        enhancer.setCallback(this);

        //4.创建代理对象
        return (Person) enhancer.create();
    }


    /**
     * 代理对象每个方法调用的时候都会触发
     * 拦截的方法
     *
     * @param o           代理对象
     * @param method      调用的方法
     * @param objects     调用方法传递的参数
     * @param methodProxy
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o , Method method , Object[] objects , MethodProxy methodProxy) throws Throwable {


        if (method.getName().equals("sing")) {

            System.out.println("代理对象 接收预约金10W");

            //让被代理对象执行自己的操作
            Object result = method.invoke(person , objects);

            System.out.println("代理对象 收尾款50W");

            return result;

        }else {

            System.out.println("代理对象 接收预约金20W");

            //让被代理对象执行自己的操作
            Object result = method.invoke(person , objects);

            System.out.println("代理对象 收尾款100W");

            return result;

        }

    }

}

测试

public class ProxyTest {

    public static void main(String[] args) {

        ProxyFactory proxyFactory = new ProxyFactory();

        Person person = proxyFactory.creatProxy();

        person.sing("山歌");

    }

}

理解
在这里插入图片描述
个人理解,仅供参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值