gpt4 book ai didi

java - Spring - 依赖注入(inject) - 哪个优先?

转载 作者:行者123 更新时间:2023-12-04 08:56:09 24 4
gpt4 key购买 nike

我知道有 3 种方法可以使用 Spring 进行依赖注入(inject):字段、setter 和构造函数注入(inject)。
但是假设我们在同一个组件中有更多的 3 个,如下所示:

import base.service.FortuneService;

@Component
public class FootballCoach implements Coach {

//Field Injection
@Autowired
private FortuneService fortuneService;

//setter Injection
@Autowired
public void setFortuneService(FortuneService fortuneService) {
this.fortuneService = fortuneService;
}
//constructor Injection
@Autowired
public FootballCoach(FortuneService fortuneService) {
this.fortuneService = fortuneService;
}
}
哪个优先 - 可以这么说? Spring 会不会只做所有 3 并覆盖 fortuneService场两次?如果是这样,最后一个站着的是哪一个?还是只会选择一个依赖注入(inject)?
我运行上面的代码没有问题,我得到了以下日志,但我真的不知道如何阅读它们。
注: FortuneService是一个接口(interface),我有一个 HappyFortuneService实现它的类。
Sep 10, 2020 11:40:44 AM org.springframework.beans.factory.support.DefaultSingletonBeanRegistry getSingleton
FINE: Creating shared instance of singleton bean 'footballCoach'
Sep 10, 2020 11:40:44 AM org.springframework.beans.factory.support.DefaultSingletonBeanRegistry getSingleton
FINE: Creating shared instance of singleton bean 'happyFortuneService'
Sep 10, 2020 11:40:44 AM org.springframework.beans.factory.support.ConstructorResolver createArgumentArray
FINE: Autowiring by type from bean name 'footballCoach' via constructor to bean named 'happyFortuneService'
Sep 10, 2020 11:40:44 AM org.springframework.beans.factory.support.DefaultSingletonBeanRegistry getSingleton
FINE: Creating shared instance of singleton bean 'tennisCoach'
Sep 10, 2020 11:40:44 AM org.springframework.beans.factory.support.ConstructorResolver createArgumentArray
FINE: Autowiring by type from bean name 'tennisCoach' via constructor to bean named 'happyFortuneService'

最佳答案

首先,不要做那样的事情。
话虽如此,以下将按顺序发生:

  • 它将使用 FortuneService 的实例调用构造函数,因为需要先构造对象,然后才能发生其他任何事情。
  • 它将注入(inject)带有 @Autowired 注释的字段实例为 FortuneService
  • 它将调用带有 @Autowired 注释的方法实例为 FortuneService

  • 现在取决于 FortuneService 的范围,它将注入(inject)一个单例(默认)或创建一个新实例(当 bean 是原型(prototype)作用域时)。
    注意:可以从 source 中推断出排序。的 AutowiredAnnotationBeanPostProcessor .调用构造函数是合乎逻辑的,但字段与方法的顺序来自 buildAutowiringMetadata方法。它首先检测字段,然后检测方法。

    关于java - Spring - 依赖注入(inject) - 哪个优先?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63826101/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com