当前位置: 首页 > 面试题库 >

为什么我必须在Spring配置类中使用@Constructor批注进行批注的默认构造函数?

龚凯泽
2023-03-14
问题内容

我正在为Spring Core认证而学习,在提供的学习材料上,我有这个问题,但我无法给出答案。

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

我没有在配置类中声明任何构造函数,这些构造类由 @Configuration
注释注释。默认构造函数是超类继承的构造函数吗?或者是什么?为什么我必须有一个默认构造函数,但不能覆盖它?

特纳克斯


问题答案:

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

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

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

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



 类似资料:
  • 问题内容: 在Jackson中,当您使用注释构造函数时,必须使用注释其参数。所以这个构造函数 变成这个: 我不明白为什么有必要。你能解释一下吗? 问题答案: Jackson必须知道以什么顺序将字段从JSON对象传递给构造函数。使用反射无法在Java中访问参数名称-这就是为什么您必须在注释中重复此信息的原因。

  • 问题内容: 例如,我的CRUD界面中有一个方法可以从数据库中删除用户: 此方法仅适用于注释@Modifying。但是这里需要注释吗?为什么Spring无法分析查询并理解它是一个修改查询? 问题答案: 这将触发注释为方法的查询,作为更新查询而不是选择查询。由于执行修改查询后EntityManager可能包含过时的实体,因此我们会自动清除它(有关详细信息,请参阅EntityManager.clear(

  • 问题内容: 在Jackson中,当用注释构造函数时,必须用注释其参数。所以这个构造函数 变成这个: 我不明白为什么有必要。你能解释一下吗? 问题答案: Jackson必须知道以什么顺序将字段从JSON对象传递给构造函数。使用反射无法在Java中访问参数名称-这就是为什么您必须在注释中重复此信息的原因。

  • 注入是将依赖注入对象的过程。 构造函数注入很常见。 在此过程中,依赖项作为参数注入构造函数。 请参阅下面的示例。 创建一个名为GuiceTester的java类。 GuiceTester.java import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Inj

  • 问题内容: 我想问问为什么Java注释使用了这么多…我知道它们在例如jpa中替换了xml配置,但是为什么要使用这种配置呢?考虑这段代码: 现在,当我尝试使用的persist方法将其置于持久性上下文中时,尝试持久化实例会遇到运行时错误(最好是出现编译错误)。对我来说,有一个明显的解决方案,强制实体实现某种无方法接口,而不是使用@Annotations。但这在框架设计人员中并不流行,此解决方案的缺点是

  • 问题内容: 我有下面的构造函数的文本编辑器类 在春豆中,我有 我观察到的是带有两个参数的构造函数,称为一致。它是随机的吗?是否应该不抛出弹簧异常,因为它不知道需要调用哪个构造函数? 问题答案: 这是Spring自动装配构造函数的结果。 它要做的第一件事是获取所有bean类的构造函数并对它们进行排序,首先将公共构造函数的参数数量减少,然后再将所有非公共构造函数的参数数量减少。这些是候选构造函数。 然