正常 class 和注射 class 之间的区别

Difference between normal class and class with injection

考虑 2 类,学生和学科。

案例一:

class Student
{
   private final Subject subject;

   Student (final Subject subject)
   {
     this.subject = subject;
   }
   //do something
}

案例二:

import javax.inject.Inject;

class Student
{
   private final Subject subject;

   @Inject
   Student (final Subject subject)
   {
     this.subject = subject;
   }
   //do something
}

谁能解释一下这两种情况的区别,以及每种情况在什么时候使用?

基本上class的行为(方法相同,包含相同的代码)和这个class维护的信息(数据字段相同)没有区别。

但是这个 class 并不是“活”在真空中,它可能是包含许多其他 class 的应用程序的一部分,并且您必须以某种方式管理 classes,它们之间的依赖关系,等等。所以区别来了:

不同之处在于您如何组织应用程序,更准确地说,谁“管理”这个 class、阅读、谁创建它(调用 new Student)以及谁负责“弄清楚”在哪里“获取”class Subject 的实例,显然必须提供 Student 类型的对象才能正确实例化。

所以从这个意义上讲,有很多方法可以管理您的代码:

你什么都可以自己做:

main() {
Subject subject = new Subject()
Student student = new Student(subject)

}

现在如果有 1000 个 classes,您将必须维护 1000 行代码来创建所有这些对象。虽然在这种情况下,它可能看起来仍然可行,因为对象是一起创建的,但有时实际应用程序可能比这复杂得多,依赖关系解析也可能变得复杂得多。

因此创建了 DI 容器,如 Guice、Spring 等等:

他们可以自己弄清楚如何实例化 classes,分析 class 的结构以找出依赖关系和底线为您创建 classes . 要向这些容器提供“提示”,您可以使用 @Inject 之类的注释,但 all-in-all,您可以以不同的方式管理应用程序:

  • 你的 classes 是由依赖注入容器创建的
  • 您可以向容器提供提示以“帮助”它创建 class,通过使用这些提示,DI 容器能够解决实例化的实际方式(如何通过反射调用 new ,调用哪个构造函数,传递哪些参数,以何种顺序等)。
  • 因此,您无需维护 new Student, new Subject() 等代码。依赖注入容器会为您代劳。

基本上这是一个非常广泛的主题,因此出于教育目的,我建议您甚至在深入研究特定的实施技术之前就找到有关此 DI 主题的综合教程(例如 Google 中的 @Inject吉斯).