【问题标题】:How are IoC and DI used in Spring MVCSpring MVC 中如何使用 IoC 和 DI
【发布时间】:2019-12-31 23:00:33
【问题描述】:

我正在学习这门关于 Spring Hibernate 等的 udemy 课程。该课程首先解释了控制注入和依赖注入如何在 Web 视角下工作,就像拥有简单的类或 bean、在配置中定义 bean 及其依赖项一样xml 文件或在实际类中使用 java 注释,然后在其中创建 bean 的主类。我明白,尽管除了分离角色(如创建和维护对象以及添加对象所需的依赖项)之外,并没有真正看到使用 IoC 和 DI 的巨大好处,我猜当项目更大时,这会使它更清晰、更容易遵循,对吧?

但是,我不明白 IOC 和 DI 在一个完整的 Spring MVC 项目中是如何联系在一起的。就像我理解的那样,使用 @Controller 注释意味着它就像一个 @Component 并且您可以让它在创建 bean 时自动扫描组件,但与以前不同的是,没有创建和配置 bean 的主类,而是我有一个控制器类我手动创建对象和模型并将其传递回可以使用模型中的值的视图。我没有看到我在这里如何使用 IoC 或 DI?或者是因为它是一个简单的项目,也许我们创建的对象没有很多依赖关系?还是很多使用和实现是内部完成的还是自动完成的?

我只是在努力 a) 了解为什么 IoC 和 DI 如此重要,以及 b) 在没有创建 bean 的主类的 Spring MVC 项目中,它们是如何实际使用的。

【问题讨论】:

  • 您似乎对 DI 的概念有基本的了解,但对 MVC 作为一种设计模式却没有;我建议查一下。请注意,设计良好的应用程序中的大多数控制器都需要注入 1-3 个依赖项(实际实现业务逻辑的服务;控制器本身只是 HTTP 和 Java API 之间的转换层)。
  • 我认为我的主要困惑来源是我首先将 IoC 和 DI 作为与 Spring MVC 无关的概念来学习,其中我在一个简单的 java 应用程序的 main 方法中手动创建 bean,而在 Spring MVC例如,spring框架将自动创建控制器类的bean并注入其依赖项,即正如您提到的业务逻辑所需的服务。所以我很困惑为什么我没有像最初在main中那样手动初始化或创建bean ,这是因为在 Spring MVC 中会为我初始化它们,我使用组件扫描对吗?
  • 是的,或者 @Bean 类中的 @Configuration 方法。容器的全部工作就是找到依赖图并为你创建 bean。

标签: java spring spring-mvc dependency-injection inversion-of-control


【解决方案1】:

A) 创建一个项目,但不要添加任何依赖项(或 web-mvc)。然后自己做,然后看看手动创建配置需要多少时间。如果它只是一个简单的 mvc 项目,你可以手动完成,但如果你的项目每天增加,那么一个巨大的配置文件来正确维护你的项目。但是当您是专业开发人员时,您没有太多时间手动配置所有这些。所以这里是解决方案 IoC 和 DI。控制器或其他注释在内置 jar 中配置。您不必担心创建控制器或创建 bean,只需在需要时使用它们。它可以节省您的时间,也可以为它是否工作而头疼。在您处理大型项目时,它可以提高您的工作效率。

B) 是的,web 项目中没有主类。要运行 Web 项目,您需要一台服务器。服务器首先寻找一个配置(在 spring 中,它是 web.xmldispatcher-servlet)。如果可用则展开配置文件,如果不可用则抛出错误。在该配置文件中,解释有关 Web 项目的所有内容。应该做什么,什么不是强制性的,什么是入口点等等。

因此,IoC 和 DI 非常重要,因为要了解 Web 项目如何在幕后工作或所有组件如何协同工作。

【讨论】:

    【解决方案2】:

    IoC 是一个过程,其中对象定义它们的依赖关系,即与它们一起工作的其他对象,仅通过构造函数参数、工厂方法的参数或在对象实例被构造或返回后设置的属性工厂方法。然后容器在创建 bean 时注入这些依赖项。这个过程与 bean 本身通过使用类的直接构造或诸如服务定位器模式之类的机制来控制其依赖项的实例化或位置基本上是相反的,因此称为控制反转 (IoC)。

    在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。 bean 是由 Spring IoC 容器实例化、组装和管理的对象。否则,bean 只是应用程序中的众多对象之一。

    这种架构的优点是:

    • 将任务的执行与其实现分离
    • 更容易在不同的实现之间切换
    • 程序的模块化程度更高
    • 通过隔离组件或模拟其依赖项并允许组件通过合约进行通信,更轻松地测试程序

    控制反转可以通过多种机制实现,例如:策略设计模式、服务定位器模式、工厂模式和依赖注入 (DI)。

    您可以使用基于注释的配置,您可以在其中定义@Configuration 类并使用@Bean 注释返回所需的bean。 您也可以在 POJO 类中使用 @Component 将其视为 Spring bean。

    【讨论】:

      猜你喜欢
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多