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