Java Spring Boot 构造方法依赖注入究竟是如何工作的

Java Spring Boot how does constructor method dependency injection actually work

如果我什至没有在任何地方初始化 class 或传入参数,构造方法依赖注入如何工作。 Spring 会在某个地方为我处理这件事吗?如果有人不介意 sharing/teaching 我真的很想知道更多。这在堆上是如何工作的?是否会引用正在构造的 class 和依赖项,所以我会有两个不同对象的实例或只有一个?我找到了这个答案 ,但它并没有真正详细地回答我的问题。

示例:


@Controller
@RequestMapping
public class SampleController{

    private final SomeRepository someRepository;

    pulbic SampleController(SomeRepository someRepository) throws Exception{

        // will someRepository ever be null? 
        if(someRepository == null)
            throw new Exception("I told you it wouldn't work!");
        this.someRepository = someRepository;
    }

回答您的问题:是的。 Spring 代表您管理所有 Bean。您可以通过多种方式声明 Bean:

  1. XML(旧方法);
  2. 使用 @Bean(但在这种情况下,您实际上会实例化 Bean);
  3. 使用@Component@Service@Repository@Controller(后面的3个基本上是第一个的特化)。

在你的例子中,你已经用 @Controller 注释了 SampleController,所以现在 Spring 知道它需要通过在 [=50] 中管理它来为你提供这个 Bean =] IoC 容器。但是,为了 Spring 可以创建 Bean,它也会理解它需要另一个可用的 Bean,在您的例子中是 SomeRepository。如果 Spring IoC Container 中已经存在这样的 Bean,则 Spring 将其提供给您的 SampleController 构造函数。为此,SomeRepository 也必须是一个 Spring-managed Bean,因此由前三种方式之一定义。

值得一提的是,例如,如果您的应用程序中有多个 SomeRepository Bean(想象一个接口有多个实现,每个实现都是不同的 Bean),您需要“告诉”Spring你想在SampleController中使用哪一个,否则你会得到一个错误。有多种方法可以做到这一点:

  1. 使用 @Qualifier 注释;
  2. 在其中一个实现上使用 @Primary 将其标记为“默认”,以防您没有明确“说出”您想要哪个实现。

您可以查看 https://www.baeldung.com/spring-qualifier-annotation 中的示例。

这是一个非常高级的描述,但您可以找到一些好的 articles online about this or even check the reference documentation