为什么我必须在@Constructor注释注释的Spring配置类中有一个默认构造函数?

Jav*_*fer 11 java spring annotations spring-mvc applicationcontext

我正在攻读Spring Core认证,并且根据提供的学习内容,我有这个问题,但我无法给出答案.

为什么必须在@Configuration注释类中使用默认构造函数?

我没有将任何构造函数声明为@Configuration批注注释的配置类.默认构造函数是超类继承的构造函数?或者是什么?为什么我必须有一个默认的构造函数,我不能覆盖它?

TNX

Voj*_*cka 23

根据官方的spring javadoc,spring @Configuration注释类需要有默认的no-arg构造函数

@Configuration类必须具有default/no-arg构造函数,并且不能使用@Autowired构造函数参数.任何嵌套配置类都必须是静态的

原因是spring使用CGLIB来代理@Configuration类,并且Spring中存在限制,在版本4之前用CGLIB代理的类需要具有默认的no-args构造函数.

在Spring 4之前,基于CGLIB的代理类需要一个默认构造函数.这不是CGLIB库的限制,而是Spring本身.幸运的是,从春季开始,这不再是一个问题.基于CGLIB的代理类不再需要默认构造函数.

  • 默认构造函数imo是设计错误的原因,因为它强制对象是可变的 - 通过要求属性的setter.我避开Spring魔术注释,并尝试将所有Spring依赖项保存在包含所有配置文件的包中,并以明确的方式控制所有依赖项和IoC. (3认同)
  • Spring 5.* 不需要无参数默认构造函数。 (2认同)