使用@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(),这些依赖项不会被正确初始化。)