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("陈粒");
}
}
