使用@Inject进行依赖注入

我觉得奇怪的是我找不到这些信息,所以如果可能的话,请把我指向一个可靠的来源。此问题仅与 Java 相关。

简而言之,我想知道依赖注入实际上是如何在语法上发生的

我对依赖注入的理解如下:

public class Car {
    private Engine engine
    
    @Inject
    public Car(Engine engine) {
        this.engine = engine
    }
}

是否相当于

public class Car {
    private Engine engine
    
    public Car(Engine engine) {
        this.engine = engine
    }
}

其中关键字@Inject是语法糖,让 Java 知道engine要注入依赖项。这样,Car将不负责创建engine,因此具有的依赖Engine。但是,没有示例向我展示如何注入它。简而言之:

public MyClass {
    public static void main(String[] args) {
        ToyotaEngine toyotaEngine = new ToyotaEngine();
        HondaEngine hondaEngine = new HondaEngine();
        // ??? which one to inject?
        Car myCar = new Car(); // syntax?
    }
}

我如何真正触发注射?只需调用new Car()Engine会为我传递给构造函数?Java 如何知道Engine要注入哪个?

我在 google 上搜索的所有内容都与如何@Inject在类上使用注释有关,但与如何实际触发它无关。该文章介绍,看起来特定于春没有太大解释的配置。我不确定春天是什么。

回答

没有关于它的“语法”,@Inject也不是语法糖。注释是记录在元素(类、方法、字段等)上的元数据,然后其他软件有机会检查它。就 而言@Inject,您正在使用的某些框架(Spring、CDI、Guice)会查找注释,如果存在,则会执行一些查找代码并为您提供依赖项。(这通常称为容器,因为它包含一堆可以为您查找和注入的对象。除此之外,Spring 提供了一个 DI 容器。)

构造函数(或 setter)完全正常工作,您不能只使用new Car(). 相反,已经找到某个Engine地方的框架会new Car(engine)为您调用,并传入该对象。如果您只是使用new,那么您必须提供自己的值;这对于测试非常有用,您可以在其中传递模拟或测试数据。

(顺便说一下,这就是使用构造函数注入几乎总是最佳选择的原因;当存在隐藏的依赖项时,它会阻止您使用new Car(),这些依赖项不会被正确初始化。)


以上是使用@Inject进行依赖注入的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>