Kotlin 中的 @Inject 是什么?

What is @Inject for in Kotlin?

我已经阅读了注释中的内容,但我有点笨,所以无法正确理解

标识可注入的构造函数、方法和字段。可能适用于静态成员和实例成员。可注入成员可以有任何访问修饰符(private、package-private、protected、public)。首先注入构造函数,然后是字段,然后是方法。 superclasses 中的字段和方法在 subclasses 中的字段和方法之前注入。未指定同一 class 中字段之间和方法之间的注入顺序。

你能解释一下@Inject 是做什么用的吗?如果可以用不那么抽象的事物来类比现实生活

@Inject 是一个 Java 注释,用于描述 class 的依赖关系,它是 Java EE(现在称为 Jakarta EE)的一部分。它是 CDI(上下文和依赖注入)的一部分,后者是 Java EE 6 及更高版本中包含的标准依赖注入框架。

CDI 最臭名昭著的功能是它允许您在客户端 classes 中注入依赖项。依赖性是什么意思?这基本上就是您的 class 需要做的任何事情。

我举个例子,这样更容易理解。想象一下,您有一个 class NotificationService 应该以不同的格式(在本例中为电子邮件和短信)向人们发送通知。为此,您很可能希望将发送通知的实际行为委托给能够处理每种格式的专门 classes(假设 EmailSenderSmsSender)。 @Inject 允许您做的是在 NotificationService class 中定义注入点。在下面的示例中,@Inject 指示 CDI 通过构造函数注入 EmailSenderSmsSender 实现对象。

public class NotificationService {
    
    private EmailSender emailSender;
    private SmsSender smsSender;
    
    @Inject
    public NotificationService(EmailSender emailSender, SmsSender smsSender) {
        this.emailSender = emailSender;
        this.smsSender = smsSender;
    }
}

也可以在字段(字段注入)和setters(setter注入)中注入一个class的实例,而不仅仅是在构造函数中描述的那样。

利用这种依赖注入概念的最著名的 JVM 框架之一是 Spring。