spring3.2注释自动装配多个构造函数(代码片段)

author author     2022-12-28     256

关键词:

Spring文档:

每个类只能标记一个带注释的构造函数,但可以注释多个非必需的构造函数。

如果我有一个自动装配的构造函数,一切都很好。如果我有两个或更多autowired,但required = false注释构造函数,一切都很好。但是如果我以某种方式混合它们,使得有一个或多个required = false构造函数自动装配注释,并且只有一个带有required = true,则会抛出异常。

org.springframework.beans.factory.BeanCreationException:无效的自动标记构造函数:public annotationconfig.SomeBean(annotationconfig.AnotherBean)。找到另一个带有'required'自动注释的构造函数:public annotationconfig.SomeBean(annotationconfig.AnotherBean,annotationconfig.AnotherBean [])

这是预期的行为吗?我错过了一些关于Spring依赖注入如何工作的东西?如果这是正常的,为什么这是Spring的问题,为什么它不能处理这样的设置?

答案

我认为这种行为的原因是,如果其中一个构造函数具有@Autowired(required=true),则必须调用它(因为它是必需的)并且因为每个对象实例化只能调用一个构造函数,那么使用@Autowired(required=false)的其他构造函数有什么意义呢?

它们无论如何都不会被自动装配,因为其中一个构造函数已经被要求并且必须被调用。它们仍然可以在不使用Autowired机制的情况下调用,但在这种情况下,@Autowired(required=false)注释是不必要的。

另一答案

Spring 5文档:

每个类只能标记一个带注释的构造函数,但可以注释多个非必需的构造函数。在这种情况下,每个都被认为是候选者之一,Spring使用最贪婪的构造函数,其依赖性可以得到满足,即具有最多参数的构造函数。

虽然需要一个构造函数,但如果解析了依赖关系,spring可能会使用其他构造函数;

autofac之自动装配(代码片段)

...可用服务中选择一个构造函数来创造对象,这个过程叫做自动装配。这个过程是通过反射实现的默认思考这么一个问题,如果注册类型中存在多个构造函数,那么Autofac会选择哪一个来创建类型的实例答案是"尽可能最多参数"classConst... 查看详情

spring(代码片段)

文章目录SpringBeans自动装配Spring自动装配的局限性Spring自动装配byNameSpring自动装配byName样例Spring自动装配byTypeSpring自动装配byType样例Spring由构造函数自动装配Spring由构造函数自动装配SpringBeans自动装配可以使用·bean元素来声明bean... 查看详情

spring入门(代码片段)

文章目录SpringBeans自动装配Spring自动装配的局限性Spring自动装配byNameSpring自动装配byName样例Spring自动装配byTypeSpring自动装配byType样例Spring由构造函数自动装配Spring由构造函数自动装配SpringBeans自动装配可以使用·bean元素来声明bean... 查看详情

如何自动装配在 SpringBoot 应用程序中具有带参数的构造函数的组件

】如何自动装配在SpringBoot应用程序中具有带参数的构造函数的组件【英文标题】:HowtoAutowireaComponentwhichishavingconstructorwithargumentsinSpringBootApplication【发布时间】:2018-11-0902:27:47【问题描述】:我有一个具有Autowired构造函数的类。... 查看详情

Spring Boot 构造函数自动装配异常

】SpringBoot构造函数自动装配异常【英文标题】:SpringbootConstructorAutowiredException【发布时间】:2016-09-0403:49:51【问题描述】:我的springboot应用程序中有这些类(springhibernate/data/jpa/web):pkg实体:publicinterfaceBase//getter/settermethods@Map... 查看详情

初始化list的最佳做法?自动装配列表或构造函数初始化?(代码片段)

...注问题。谢谢答案我更喜欢第一种选择。如果userList无法自动装配,则无论如何都会失败。 查看详情

类不包含用于自动装配的匹配构造函数

】类不包含用于自动装配的匹配构造函数【英文标题】:Classdoesn\'tcontainmatchingconstructorforautowiring【发布时间】:2014-03-1519:40:32【问题描述】:我有两节课publicabstractclassAbstractDAO<T>privatefinalMyExecutor<T>myExecutor;privatefinalClass... 查看详情

Spring-boot,无法自动装配类。未找到默认构造函数引发异常

】Spring-boot,无法自动装配类。未找到默认构造函数引发异常【英文标题】:Spring-boot,unabletoautowireaclass.NodefaultconstructorfoundExceptionisraised【发布时间】:2013-12-2422:41:46【问题描述】:我是弹簧靴的新手。在我将一个类移动到不同... 查看详情

Junit Mockito NullPointerException for Mock 用于基于构造函数的自动装配

】JunitMockitoNullPointerExceptionforMock用于基于构造函数的自动装配【英文标题】:JunitMockitoNullPointerExceptionforMockforconstructorbasedautowiring【发布时间】:2019-04-2213:22:42【问题描述】:我正在尝试测试实现类,其中我正在为接口创建基于... 查看详情

Lombok 生成的构造函数不能在 SpringBootTest 中隐式自动装配

】Lombok生成的构造函数不能在SpringBootTest中隐式自动装配【英文标题】:LombokgeneratedconstructorcannotimplicitautowireinSpringBootTest【发布时间】:2021-11-2913:24:04【问题描述】:我想通过构造函数将A类注入B类。@ComponentpublicclassAimportlombok.Re... 查看详情

22自动装配-方法构造器位置的自动装配(代码片段)

22、自动装配-方法、构造器位置的自动装配22.1@Autowired标注在方法上标注在方法上,Spring容器创建当前对象,就会调用方法,完成赋值方法使用的参数,自定义类型的值从IOC容器中获取@AutowiredpublicvoidsetCar(Carcar)this.car=car;22.2@Autowi... 查看详情

使用构造函数自动装配泛型类型 [Spring 4.2.5]

】使用构造函数自动装配泛型类型[Spring4.2.5]【英文标题】:Autowiringgenerictypeswithconstructor[Spring4.2.5]【发布时间】:2016-08-1703:11:57【问题描述】:我是Spring新手,正在尝试像本文http://www.ibm.com/developerworks/library/j-genericdao/中那样实... 查看详情

在spring中通过构造自动装配--constructor

在Spring中,可以使用“通过构造自动装配”,实际上是按构造函数的参数类型自动装配。 这意味着,如果一个bean的数据类型与其他bean的构造器参数的数据类型是相同的,那么将自动装配。 packageauto_constructor;/***Createdbyluo... 查看详情

spring4-自动装配beans-通过构造函数参数的数据类型按属性自动装配bean

1.创建Maven项目,项目名称springdemo17,如图所示650)this.width=650;"src="https://s1.51cto.com/wyfs02/M01/8F/15/wKiom1jTN5mwr-2zAAAVZbvPl7I842.png-wh_500x0-wm_3-wmp_4-s_3468380499.png"title="QQ截图20170323104810.png"al 查看详情

autofac-装配

...可用服务中,选取一个构造函数来创造对象,这个过程就是自动装配.一、选择构造函数默认情况下,autofac会使用无参构造函数,去创建对象.我将Person类稍微修改了下.publicinterfaceIPerson{voidSelf();}publicclassPerson:IPerson{IAnimaladopt;publicstringNa... 查看详情

autofac组件服务自动装配《第二篇》(代码片段)

Autofac组件、服务、自动装配《第二篇》转自:https://www.cnblogs.com/kissdodog/p/3611799.html一、组件  创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式:  1、类型创建Regist... 查看详情

如何使用注释自动装配 RestTemplate

】如何使用注释自动装配RestTemplate【英文标题】:HowtoautowireRestTemplateusingannotations【发布时间】:2015-03-1711:26:52【问题描述】:当我尝试自动装配SpringRestTemplate时,出现以下错误:nestedexceptionisorg.springframework.beans.factory.NoSuchBeanDef... 查看详情

基于 Java 与基于注释的配置/自动装配

】基于Java与基于注释的配置/自动装配【英文标题】:Java-basedvsannotation-basedconfiguration/autowiring【发布时间】:2017-05-2716:05:17【问题描述】:当我使用Spring框架时,我经常看到2个术语基于java和基于注释的配置/自动装配。基于Java... 查看详情