假设,我们有一个UserServiceImpl和UserService类, 此时需要在UserContoller中使用UserService。在 Spring 中通常都习惯这样写代码:
@Autowired UserService userService;
在这种情况下,无论是使用 JDK 动态代理,还是 CGLIB 都不会出现问题。
但是,如果你的代码是这样的呢:
@Autowired UserServiceImpl userService;
启动报错 因为 JDK 动态代理是基于接口的,代理生成的对象只能赋值给接口变量。
public final class $Proxy0 extends Proxy implements UserService{ //这是代理生成的类,因为类已经继承了Proxy类,由于Java类不能多继承,所以只能实现UserService接口实现动态代理 //上文中报错是因为直接 UserServiceImpl = new $Proxy0() //当然是不行的 }
而 CGLIB 就不存在这个问题。因为 CGLIB 是通过生成子类来实现的,代理对象无论是赋值给接口还是实现类这两者都是代理对象的父类。
SpringBoot 正是出于这种考虑,于是在 2.x 版本中,将 AOP 默认实现改为了 CGLIB。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)