美文网首页
Java Spring中的动态代理cglib

Java Spring中的动态代理cglib

作者: 编程_书恨少 | 来源:发表于2018-06-05 13:42 被阅读0次

总结

JDK的动态代理和 Spring中的动态代理cglib区别
  • JDK 的动态代理 :针对实现了接口的类产生代理.
  • Cglib 的动态代理 :针对没有实现接口的类产生代理. 通过生成实现类类的子类对象来产生代理.

1.什么是动态代理技术

1.1 动态代理技术是面向切面编程的一种思想(aop)。
1.2 思想模型 Snip20180605_22.png

2.动态代理技术的好处

可以动态的在B实现类的doSomething()方法前后,添加一些其他的操作方法,对方法进行增强。

3.案例讲解

3.1 场景模拟

在操作数据库之前,我们都需要开启事物,当操作完毕之后还要提交事物,但是如果在每一个操作数据库的方法中都要调用一次的话就会显得很繁琐了,所以我们在动态代理中统一进行处理。

3.2 代码演示

3.2.1 准备一个接口

public interface UserService {
    void save();
    void delete();
    void update();
    void find();
}

3.2.2 准备一个实现类

package cn.jianghai.service;

public class UserServiceImpl implements UserService{

    @Override
    public void save() {
        System.out.println("保存用户!");
    }
    @Override
    public void delete() {
        System.out.println("删除用户!");
    }
    @Override
    public void update() {
        System.out.println("更新用户!");
    }
    @Override
    public void find() {
        System.out.println("查找用户!");
    }
}

3.2.3 准备一个动态代理类

public class UserServiceProxyFactory implements MethodInterceptor {

    public UserService getUserServiceProxy() {
        Enhancer enhancer = new Enhancer(); //帮我们生成代理对象
        enhancer.setSuperclass(UserServiceImpl.class); // //设置对谁进行代理
        enhancer.setCallback(this); // 设置代理回调方法
        UserService userService = (UserService) enhancer.create(); //创建代理对象
        return userService;
    }


    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        //打开事务
        System.out.println("打开事务!");
        //调用原有方法
        Object returnValue = methodProxy.invokeSuper(o, objects);
        //提交事务
        System.out.println("提交事务!");

        return returnValue;
    }
}

3.2.4 测试


public class Demo {
    @Test
    public void func(){

        UserServiceProxyFactory userServiceProxyFactory = new UserServiceProxyFactory();
        UserService userServiceProxy = userServiceProxyFactory.getUserServiceProxy();
        userServiceProxy.save();

        //判断代理对象是否属于被代理对象类型
        //代理对象继承了被代理对象=>true
        System.out.println(userServiceProxy instanceof UserServiceImpl);//true
    }
}


查看测试结果


Snip20180605_25.png

相关文章

  • Spring AOP

    本文主要是解析Spring AOP的运作流程。上次讲到Java中的两种动态代理技术:JDK动态代理和CGLIB动态...

  • java动态代理

    目录: 简介 jdk动态代理 cglib动态代理 jdk动态代理与cglib的区别 应用spring的aop 简介...

  • 保存java 动态代理生成的字节码文件

    保存java 动态代理生成的字节码文件 在Java中,常用的动态代理技术有JDK的动态代理和cglib动态代理,不...

  • 瓴岳科技

    Spring中的HandlerInterceptor 是否有了解 cglib动态代理与JDK动态代理的区别 联合索...

  • java-cglib

    简介 cglib是一套java动态代理实现框架,cglib被应用到spring app,hibernate等高级业...

  • Spring AOP中的动态代理

    Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理: (3)静态代理与动态代理区别...

  • Java Spring中的动态代理cglib

    总结 JDK的动态代理和 Spring中的动态代理cglib区别 JDK 的动态代理 :针对实现了接口的类产生代理...

  • Spring AOP的实现原理--CGLIB动态代理

    Spring AOP的实现原理--CGLIB动态代理 CGLIB(Code Generation Library)...

  • 动态代理的两种方式

    静态代理就不说了,基本用到的都是动态代理。 Java中动态代理有JDK动态代理和CGLIB动态代理。 JDK代理的...

  • Spring Boot 2.5.x能支持Java 17了 - c

    在 Spring Framework 中,AOP 代理是 JDK 动态代理或 CGLIB 代理。 ASM 是 Ja...

网友评论

      本文标题:Java Spring中的动态代理cglib

      本文链接:https://www.haomeiwen.com/subject/inepsftx.html