Java Spring—需要使用注释进行依赖项注入

Java Spring—需要使用注释进行依赖项注入,java,spring,dependency-injection,annotations,Java,Spring,Dependency Injection,Annotations,我试图理解Spring依赖注入和自动布线的基础知识。所有的教科书都说,依赖注入的主要优点是,只需修改XML,就可以修改应用程序,而不必涉及java代码 但是,当您使用注释时,这一目的就失败了!那有什么大不了的?为什么不直接实例化它,而不是拥有额外的注入代码?通过控制服务实例和松耦合,您可以在注释中注入实现所请求接口的任何类。在Spring的早期版本中,所有注入都必须使用XML完成。对于大型项目,XML本身变得非常庞大,维护起来非常困难/麻烦。对代码中依赖项的更改需要对XML进行相应的更改。添加自

我试图理解Spring依赖注入和自动布线的基础知识。所有的教科书都说,依赖注入的主要优点是,只需修改XML,就可以修改应用程序,而不必涉及java代码


但是,当您使用注释时,这一目的就失败了!那有什么大不了的?为什么不直接实例化它,而不是拥有额外的注入代码?

通过控制服务实例和松耦合,您可以在注释中注入实现所请求接口的任何类。

在Spring的早期版本中,所有注入都必须使用XML完成。对于大型项目,XML本身变得非常庞大,维护起来非常困难/麻烦。对代码中依赖项的更改需要对XML进行相应的更改。添加自动连接是为了方便减少XML的大小

但是,自动连接不会降低依赖项注入的性能,因为可以使用XML覆盖它。这为XML配置提供了原始的灵活性,并允许Spring将实现接口的上下文中只有一个bean的常见情况设置为默认情况


您的问题似乎是问我们为什么需要依赖项注入:“为什么不只是实例化它,而不是拥有额外的注入代码?”。依赖项注入最常见的用途之一是单元测试:测试程序将依赖项的测试版本注入到被测试对象中,以打破进一步的依赖项。例如,如果服务类A调用服务类B,而B依赖于DB对象、其他服务、文件系统等,那么如果A直接实例化B,测试A将变得非常困难,因为您需要确保满足B的所有依赖关系。如果将A编码到接口iB而不是类B,那么单元测试代码可以注入实现iB的测试类的实例,并响应方法调用,而无需任何其他依赖项

我相信有很多开发人员相信,如果您想要构建持久的可维护代码,您应该遵守

实线中的D代表依赖项反转原理,基本上意味着依赖项注入。因此,如果您希望保持代码干净,并将对象创建与实际业务代码分开,那么依赖项注入是一件好事。此外,我认为DI使您的代码更易于测试

您是对的,诸如
@Autowired
之类的注释会侵入您的代码,但您不必更改逻辑或任何内容,只需对方法进行注释即可

处理依赖注入的另一种方法是通过
@Configuration
@Bean
注释使用Java配置(请参阅)。如果您真正关心的是向代码中添加
@Autowired
,那么Java配置就不会那么麻烦

这很好地概括了DI的重要性和优点。这篇文章的一句话是:

依赖项注入基本上是提供对象所需的对象(其依赖项),而不是让对象自己构造它们。这是一种非常有用的测试技术,因为它允许模拟或删除依赖项


请提供所有教科书的引用或链接,比如说,依赖项注入的主要优点是您可以修改应用程序而不必接触java代码。我在这里没有太多经验,但我读到的所有内容都是XML配置产生XML地狱。XML配置思想并没有像一些人希望的那样有效。所以很多架构都重新开始使用代码,因为这更简单。我理解依赖注入的必要性和价值。但是,我看不出使用@AutoWire的注入和使用接口实例化的精心设计的代码之间有什么区别。@vikas-使用AutoWire,Spring正在实例化依赖项。如果您正在编写实例化它们的代码,那么您必须关注满足它们的依赖关系,或者它们必须自己完成。当这些依赖关系变得复杂时,您需要对工厂、单例等进行编码,以确保资源共享,等等。是的,这是可能的,但是Spring消除了所有这些代码——您所需要的只是一个简单的注释,或者一些直接的XML来处理复杂的情况。它还迫使您认为这些依赖关系是您的外部依赖关系。感谢Wassgren提供的信息链接。我想@Autowired相对于实例化的优势在于它在代码中强制了一些规则。