Spring动态代理引发的问题
问题:
Spring在使用私有化构造器注入,程序无法启动
public class xxxx{
private final xxx xxx;
//私有化构造器
@Autowired
private xxx{
}
}
报错信息
Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class
可以看到Spring 创建bean 使用了CGLIB动态代理,在类里没有找到可见的构造器,
通过错误信息大概知道是因为构造函数的问题,将构造函数的修饰符private修改为public ,重启服务就好了。
tips:
因为cglib代理的实现原理是操作字节码生成代理对象子类,而设置一个类不能被继承,两种方法:一是final,二就是构造方法私有,所以只有私有构造器的类无法通过CGLIB动态代理