【问题标题】:Why I must have a default constructor in a Spring configuration class annoted by the @Configuration annotation?为什么我必须在 @Configuration 注释注释的 Spring 配置类中有一个默认构造函数?
【发布时间】:2026-02-03 05:40:01
【问题描述】:

我正在学习 Spring Core 认证,关于提供的学习资料,我有这个问题,但我无法给出答案。

为什么必须在 @Configuration 中有一个默认构造函数 带注释的类?

我没有在 @Configuration 注释注释的配置类中声明任何构造函数。默认构造函数是超类继承的那个?要不然是啥?为什么我必须有一个默认构造函数而我不能覆盖它?

Tnx

【问题讨论】:

  • 猜猜这意味着你需要一个没有参数的构造函数。所以你可以重写构造函数,但它需要一个没有参数的构造函数来创建配置。

标签: java spring spring-mvc annotations applicationcontext


【解决方案1】:

根据official spring javadoc,spring @Configuration 注解的类需要有默认的无参数构造函数

@Configuration 类必须有一个默认/无参数构造函数,并且不能使用@Autowired 构造函数参数。任何嵌套的配置类都必须是静态的

原因是spring使用CGLIB to proxy @Configuration类,而Spring有限制that classes proxied with CGLIB prior to version 4 are required to have default no-args constructor

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

【讨论】:

  • 我已经阅读了文档,但它只说用 @Configuration 注释的类需要默认的无参数构造函数,但没有解释原因
  • 默认构造函数 imo 是糟糕设计的一个原因,因为它通过要求属性的设置器强制对象可变。我避开 Spring 魔术注释,并尝试将所有 Spring 依赖项保存在一个包含我所有配置文件的包中,并以显式方式控制我的所有依赖项和 IoC。
  • 这是一个非常古老的答案,但也许您仍然可以提供帮助。在尝试创建代理时,我仍然看到“超类没有空构造函数,但没有给出参数”,即使我在 Spring 4.x 上。我认为默认构造函数不再是强制性的。
  • Spring 5.* 不需要无参数默认构造函数。