spring中的jdk动态代理和cglib动态代理

1.jdk动态代理和cglib动态代理的区别是什么呢?

首先jdk动态代理是jdk默认实现的代理模式,而cglib是在之上进行的补充,两者的区别是:使用jdk动态代理那么被代理的类必须要实现一个接口,这样使用jdk动态代理会实现跟被代理类相同的接口然后进行代理,但如果一个类没有实现接口那么他就不能被jdk进行动态代理!

所以cglib模式代理变产生了, 动态代理是针对代理的类, 动态生成一个子类, 然后子类覆盖代理类中的方法, 如果是private或是final类修饰的方法,则不会被重写。CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。

所以这就是两者代理模式的区别。

2.代码展示静态代理

1.2.1业务接口
public interface IUserService {
 
 void add(String name);
 
}
1.2.2被代理类实现业务接口
public class UserServiceImpl implements IUserService { 
 
 @Override 
 public void add(String name) { 
   System.out.println("向数据库中插入名为: "+name+" 的用户"); 
 } 
 
}

1.2.3定义代理类并实现业务接口
因为代理对象和被代理对象需要实现相同的接口。所以代理类源文件UserServiceProxy.java这么写
ublic class UserServiceProxy implements IUserService { 
 
 // 被代理对象
 private IUserService target; 
 
 // 通过构造方法传入被代理对象 
 public UserServiceProxy(IUserService target) {
   this.target = target; 
 } 
 
 @Override 
 public void add(String name) {
   
   System.out.println("准备向数据库中插入数据"); 
   target.add(name); 
   System.out.println("插入数据库成功"); 
 }
 
}

1.2.4客户端调用
package com.zhb.jdk.proxy;


public class StaticProxyTest {
 
 public static void main(String[] args) {
   
   IUserService target = new UserServiceImpl();
   UserServiceProxy proxy = new UserServiceProxy(target);
   proxy.add("陈粒");
 }
}
经验分享 程序员 微信小程序 职场和发展