正常 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
吉斯).
考虑 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
吉斯).