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);
    }
}

结果

在这里插入图片描述

发布了72 篇原创文章 · 获赞 21 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_39513430/article/details/104142965
今日推荐