Java 使用@Inject进行依赖项注入

Java 使用@Inject进行依赖项注入,java,Java,我觉得奇怪的是,我找不到这个信息,所以请告诉我一个可信的来源,如果可能的话。这个问题只适用于Java 简而言之,我想知道依赖注入实际上是如何在语法上发生的 我对依赖注入的理解如下: 公车{ 私人发动机 @注入 公共汽车(发动机){ 这个发动机 } } 相当于 公车{ 私人发动机 公共汽车(发动机){ 这个发动机 } } 其中关键字@Inject是语法糖,用于让Java知道要注入依赖项引擎。这样汽车将不负责创建引擎,因此对引擎具有硬依赖性。但是,没有任何示例向我展示如何注入它。简言之: 公共M

我觉得奇怪的是,我找不到这个信息,所以请告诉我一个可信的来源,如果可能的话。这个问题只适用于Java

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

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

公车{
私人发动机
@注入
公共汽车(发动机){
这个发动机
}
}
相当于

公车{
私人发动机
公共汽车(发动机){
这个发动机
}
}
其中关键字
@Inject
是语法糖,用于让Java知道要注入依赖项
引擎。这样
汽车
将不负责创建
引擎
,因此对
引擎
具有硬依赖性。但是,没有任何示例向我展示如何注入它。简言之:

公共MyClass{
公共静态void main(字符串[]args){
丰田发动机丰田发动机=新的丰田发动机();
HondaEngine HondaEngine=新HondaEngine();
//??注射哪一种?
Car myCar=新车();//语法?
}
}
如何触发注射?只需调用
new Car()
,就能将
Engine
传递给我的构造函数?Java如何知道要注入哪个
引擎

我在谷歌上搜索的所有内容都与如何在类上使用
@Inject
注释有关,而与如何实际触发它无关。这篇文章描述了一个特定于Spring的配置,并没有做太多解释。我不确定Spring是什么。

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

构造函数(或setter)完全正常工作,您不能只使用
newcar()
。相反,框架在某处找到了一个
引擎
,为您调用
新车(引擎)
,并传入该对象。如果您只是简单地使用
new
,那么您必须提供自己的值;这对于测试非常有用,您可以在其中传递模拟或测试数据

(顺便说一句,这就是为什么使用构造函数注入几乎总是最好的选择;它会阻止您这样做。)

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

构造函数(或setter)完全正常工作,您不能只使用
newcar()
。相反,框架在某处找到了一个
引擎
,为您调用
新车(引擎)
,并传入该对象。如果您只是简单地使用
new
,那么您必须提供自己的值;这对于测试非常有用,您可以在其中传递模拟或测试数据

(顺便说一句,这就是为什么使用构造函数注入几乎总是最好的选择;它会阻止您这样做。)

也许本文()可以解释DI的一般工作原理

为了使用DI,您需要选择一个DI框架。然后,每个框架都提供了执行和触发DI的机制。Spring是一个使用DI的框架,但它也不仅仅是DI,它被设计用于处理基于服务器客户端的WebApps和Rest服务,这使得很难挑出唯一的DI方面。

也许本文()可以解释DI的概念是如何工作的


为了使用DI,您需要选择一个DI框架。然后,每个框架都提供了执行和触发DI的机制。Spring是一个使用DI的框架,但它也不仅仅是DI,它被设计用于处理基于服务器客户端的WebApps和Rest服务,这使得很难挑出唯一的DI方面。

那么我如何调用
Car
类呢?我习惯了
main
是启动代码的入口点的范例。根据这个逻辑,在进入
main
之后,需要调用
新车(引擎)
,这意味着我再次手动调用它。如果我没有这样做,那么我的程序如何知道我何时要调用
Car
?@bli00您使用的依赖关系框架将为您解析参数值,假设您使用依赖关系框架请求这样一个
Car
对象。如何做到这一点取决于您使用的依赖框架及其提供的API。@bli00作为Progman所说的例子,在Spring Boot中,您的
main
调用
SpringApplication.run(MyMainClass.class)
,然后Spring接管,查看您的配置设置以选择需要哪些bean(例如,Web控制器或消息侦听器)并根据需要实例化所有内容。其他设置需要您更明确地说明所包含的内容,但要注意实际的接线。@bli00显示了一个最小的示例