有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpring需要使用注释进行依赖注入

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

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


共 (3) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

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

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

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

    这个SO-question很好地概述了为什么DI是重要和好的。这篇文章的一句话是:

    Dependency injection is basically providing the objects that an object needs (its dependencies) instead of having it construct them itself. It's a very useful technique for testing, since it allows dependencies to be mocked or stubbed out.

  3. # 3 楼答案

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

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

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