Java中的DI没有注释?

Jos*_* M. 5 java spring dependency-injection

有没有办法(现有框架)在 Java 中配置 DI 而不必向它们“不属于”的类添加注释?

在我的研究中,看起来要完成构造函数注入,我们需要在构造函数中添加一些注释,如下所示:

@Inject // or @Autowired for Spring Boot
public MyInjectedClass(IThing1 thing1, IThing2 thing2) { ... }
Run Code Online (Sandbox Code Playgroud)

Spring Boot 还建议添加@Service到实现中,以便将它们注册到 DI 以进行注入。

添加这些注释会将 DI 带入注入的类(MyInjectedClass以及任何控制器、服务实现等)。这些类不应该有 DI 的概念,它们应该只得到它们在构造函数中要求的东西,而不用关心它们是如何到达那里的。

我知道你可以@Configuration在 Spring Boot 中使用该属性,但这仍然感觉不是很可配置或强大。有没有办法在没有注释的情况下使用 Java 来实现这一点?例如,像 SimpleInjector、AutoFac 等在 C# 中是如何工作的?(通过代码配置,不是 XML 或配置文件,也不是通过注释。)

如果没有,我很好奇为什么在 Java 和 C# 之间就 DI 采取了如此不同的方法。

更新我在评论中冒犯了某人,但这根本不是我的意图。我在问一个合理的问题。让我以另一种方式强调我的关注/问题。

假设我有以下包/类。我已经标记了每种类型的 DI 将出现的每种情况。“出现”是指这些标记的类/包与正在使用的 DI 框架有某种关系。

[A] : 基于注解的 DI(第 3 方包依赖)

[C] : 基于配置的 DI

  • 数据访问[A]

    • 储存库
      • 人库[A]
  • 逻辑[A]

    • 人们
      • CreatePersonCommandHandler [A]
      • UpdatePersonCommandHandler [A]
  • 服务[A] [C]

    • 控制器
      • PersonController [A] [C]

我希望这有助于说明我的真实问题。基于注释的 DI 的足迹扩展到堆栈的远端,而基于配置的 DI 仅用于最外层(入口)应用程序,组合根所在的位置。