Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当您可以导入java类时,为什么要使用依赖项注入?_Java_Spring_Dependency Injection - Fatal编程技术网

当您可以导入java类时,为什么要使用依赖项注入?

当您可以导入java类时,为什么要使用依赖项注入?,java,spring,dependency-injection,Java,Spring,Dependency Injection,有人能给我解释一下,为什么我们需要使用spring的依赖注入,而您只需要导入一个java类,比如: import com.package.somejavaclass 我只是想知道为什么?DI和IoC (和)与导入无关。依赖项注入允许您做出运行时决策,而不是编译时决策。例如,您的类如何获得数据库连接。这是硬编码上的配置 导入 import语句允许您不指定类的完全限定名。也就是说,没有import java.util.Date您仍然可以(例如) 依赖项注入用于消除对代码更改的需求,并使仅使用配置成

有人能给我解释一下,为什么我们需要使用spring的依赖注入,而您只需要导入一个java类,比如:

import com.package.somejavaclass
我只是想知道为什么?

DI和IoC (和)与导入无关。依赖项注入允许您做出运行时决策,而不是编译时决策。例如,您的类如何获得数据库
连接
。这是硬编码上的配置

导入
import
语句允许您不指定类的完全限定名。也就是说,没有
import java.util.Date您仍然可以(例如)


依赖项注入用于消除对代码更改的需求,并使仅使用配置成为可能

也就是说,你有

Interface B {
//some methods
}
class X implements B{

// implement some methods of B

}

class Y implements B{

// implement some methods of B

}
// code without using Dependency Injection
 class A1{
private B objB = New X();
//remaining code
}

class A2{
private B objB = New X();
//remaining code
}
注意:如果出于某种原因需要更改具有类Y的objB实例,则需要在类A1和A2中进行代码更改

// code using Dependency Injection
 class A1{

@Autowired
private B objB;
//remaining code
}

class A2{
@Autowired
private B objB;
//remaining code
}
在这里,您只需要更改为接口B创建实例的配置,并将所需的类从X更改为Y,仅此而已。
java类(这里是A1和A2)中没有任何更改。

导入-是静态导入

依赖项注入-动态导入

除了@Nirav Patel answer,我还想添加一个场景。如果我们希望在不同的环境(Dev/QA/UAT/Prod)中有不同的实现,您不需要更改代码,您可以使用DI实现它,还可以更改该环境中的配置

如果需要详细解释,请观看此视频

(顺便说一下,这是我的免费课程)


讲师只需更改配置,即可在dev中发送模拟电子邮件,并使用smtp发送真实电子邮件。

我认为,这是一个基于意见的问题,因此我们不接受此类问题,无论如何,您应该了解一些设计模式。您仍然可以通过配置在没有DI的情况下做出运行时决策。
// code using Dependency Injection
 class A1{

@Autowired
private B objB;
//remaining code
}

class A2{
@Autowired
private B objB;
//remaining code
}