Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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 Spring依赖注入用法_Java_Spring_Dependency Injection - Fatal编程技术网

Java Spring依赖注入用法

Java Spring依赖注入用法,java,spring,dependency-injection,Java,Spring,Dependency Injection,我仍在学习Spring框架,我正试图真正理解何时以及如何使用依赖注入 是否应通过接口管理所有依赖关系 如果编写代码时没有使用spring IOC容器,则必须编写一些工厂类来创建对象并将其连接起来。对于一个示例实例,考虑一个服务类,该类具有对DAO实例的引用。您必须为服务类编写一些初始化工厂,以保证对服务类的单例访问,并确保使用DAO实例实例化服务类。在代码中的任何地方创建新实例都不是一个好做法,因此使用工厂模式。但是如果您使用SpringIoC容器,它将处理所有这些事情。通常它会创建单例实例,这

我仍在学习Spring框架,我正试图真正理解何时以及如何使用依赖注入


是否应通过接口管理所有依赖关系

如果编写代码时没有使用spring IOC容器,则必须编写一些工厂类来创建对象并将其连接起来。对于一个示例实例,考虑一个服务类,该类具有对DAO实例的引用。您必须为服务类编写一些初始化工厂,以保证对服务类的单例访问,并确保使用DAO实例实例化服务类。在代码中的任何地方创建新实例都不是一个好做法,因此使用工厂模式。但是如果您使用SpringIoC容器,它将处理所有这些事情。通常它会创建单例实例,这样您就不需要在代码中使用new关键字来编写更清晰的代码。使用这种方法,您的代码是松散耦合的,并且更易于维护。如果您只有一个公共构造函数,那么您现在可以自由地进行构造函数注入,而无需在新的spring版本中使用@Autowire入侵注释

如前所述,弹簧中使用了三种DI机构。三分之一的构造函数注入是推荐的,因为它更易于测试,并且不会导致任何不变量。使用@Autowire进行现场注入是有害的,不推荐使用,因为它不是可测试的解决方案


希望这有帮助。愉快的编码。

对依赖项使用接口,这些依赖项公开某种API,并且具有可能需要替换的实现,例如在单元测试中使用模拟。一种常见的情况是DAO数据访问对象,在Spring数据中称之为存储库,它将数据模型绑定到持久层。另一种常见的情况是,服务公开了域模型上的操作。通常,服务将依赖于数据访问层,因此要对服务进行单元测试,您将模拟DAO/存储库。另一个例子是第三方服务;这些通常仅由生产系统使用,但必须在开发和测试环境中进行模拟。在这种情况下,接口远远优于(比如)在代码中嵌入布尔标志并希望没有任何逻辑错误

关于管理依赖项,需要记住的关键是实际管理您对新关键字的使用。无论何时使用new,您都在创建对实现的依赖关系。依赖注入的目标是将如何使用依赖的东西与如何获取它们分开。您可以依赖接口或类,原因很简单,很明显:Java支持子类化。因此,即使您依赖于一个类而不是一个接口,也可能最终得到一个子类。在许多情况下,Spring框架实际上会自动完成这项工作

如果您发现自己需要创建对象,并且不确定是否应该依赖它们,请让依赖项注入框架为您提供这些对象的工厂。这显然取决于框架,但我所知道的所有框架都支持工厂。如果您不使用框架,您仍然可以编写工厂并使用它们,而不是一直使用新的