Spring AOP的两种动态代理

1, 基于接口的JDK代理

public static UserSerivce getUserSerivce() {
        UserSerivce userSerivce = new UserServiceImpl();//我们首先需要手动new一个对象,原因是因jdk默认生成的代理对象 内部是没有任何实现的,我们需要定义好具体的实现
        UserDao userDao = new UserDaoImpl();
        ((UserServiceImpl) userSerivce).setUserDao(userDao);
        /**
         * 第一个参数 类加载器,用于加载类
         * 第二个参数, 我们要创建一个什么类型的代理对象,我们这里写了一个具体类的接口,jdk原声的动态代理只支持接口类型
         * 第三个参数,拦截器,当你调用代理对象上面的方法的时候,jvm就会知道,然后它会将代理对象正在执行的方法进行封装,然后调用拦截器里面的方法,传递进去
         * 反射,动态代理
         */
        UserSerivce proxyInstance = (UserSerivce) Proxy.newProxyInstance(MyFactory.class.getClassLoader(), userSerivce.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println(method.getName()+ Arrays.toString(args));
                System.out.println("切面增强...........");
                Object invoke = method.invoke(userSerivce, args);
                System.out.println("切面增强...........");
                return invoke;
            }
        });
//中介  //房东
//抽成  //租出去

        return proxyInstance;
    }

2,基于Cglib的动态代理

public static UserSerImpl getUserSer() {
        UserSerImpl userSer = new UserSerImpl();
        Enhancer enhancer = new Enhancer();//类似于jdk中的proxy
        enhancer.setSuperclass(UserSerImpl.class);//设置父类,相当于我们在jdk的proxy中的接口
        enhancer.setCallback(new MethodInterceptor() {//相当于peoxy中的InvocationHandler
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("切面增强...........");
                Object invoke = method.invoke(userSer, objects);//执行真正操作
                System.out.println("切面增强...........");
                return invoke;
            }
        });
        UserSerImpl o = (UserSerImpl) enhancer.create();//创建代理对象
        return o;
    }

测试类

public class TestMain {

    @Test
    public void test1(){

        UserService userService = MyFactory.getTestService();
        userService.tran("小明","老王",100000);
    }

    @Test
    public void test2(){
        UserServiceImpl userServiceImpl = MyFactory.getUserServiceImpl();
        userServiceImpl.tran("老王","小明",10);
    }
}

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值