在本文中,我不会告诉您如何使用我的代码在 5 分钟内启动并运行一个有效的 Spring 项目。 我只会写一些基础知识——你可能不知道的东西,但仍然可以创建一个项目。但在本文中,您仍然不会理解发生了什么,更重要的是,为什么会这样。
如您所见,Spring 是模块化的。这让我们只连接我们的应用程序需要的模块,而不连接那些我们显然不会使用的模块。据我所知,正是这种方法让 Spring 超越了当时的竞争对手(EJB)并取得了领先。使用EJB 的应用程序在它们后面拖了很多依赖项,结果它们变得迟缓和缓慢。 如图所示,Spring Framework由几个模块组成:
什么是 Spring 框架?
Spring Framework,或简称为 Spring,是使用 Java 创建 Web 应用程序的最流行的框架之一。框架就像一个图书馆(也许您对这个术语更熟悉),但有一些事情需要考虑。粗略地说,当你使用一个库时,你只是创建它包含的类的实例,调用你需要的方法,从而得到你需要的结果。换句话说,这是一种更命令式的方法:在你的程序中,你明确指出你需要创建哪个对象的特定时刻,何时调用哪个特定方法等。对于框架,情况略有不同。您只需编写自己的一些类并在其中编写一些逻辑,然后框架本身会创建您的类的实例并调用它们的方法。您的类通常从框架实现一些接口或继承它的一些类,从而为您提供一些已经为您编写的功能。但情况并非总是如此。例如,Spring 尽可能地避免这种紧耦合(您的类直接依赖于框架中的类/接口)。它使用注释来实现这一点。我们稍后再谈这个。但重要的是要了解 Spring 只是可供您使用的类和接口的集合 :) 我还想立即说明 Spring 不仅可以用于 Web 应用程序,还可以用于最常见的控制台程序我们大家都很熟悉。我们甚至会在今天写其中的一篇。从而为您提供一些已经为您编写的功能。但情况并非总是如此。例如,Spring 尽可能地避免这种紧耦合(您的类直接依赖于框架中的类/接口)。它使用注释来实现这一点。我们稍后再谈这个。但重要的是要了解 Spring 只是可供您使用的类和接口的集合 :) 我还想立即说明 Spring 不仅可以用于 Web 应用程序,还可以用于最常见的控制台程序我们大家都很熟悉。我们甚至会在今天写其中的一篇。从而为您提供一些已经为您编写的功能。但情况并非总是如此。例如,Spring 尽可能地避免这种紧耦合(您的类直接依赖于框架中的类/接口)。它使用注释来实现这一点。我们稍后再谈这个。但重要的是要了解 Spring 只是可供您使用的类和接口的集合 :) 我还想立即说明 Spring 不仅可以用于 Web 应用程序,还可以用于最常见的控制台程序我们大家都很熟悉。我们甚至会在今天写其中的一篇。Spring 尽可能地避免这种紧耦合(你的类直接依赖于框架中的类/接口)。它使用注释来实现这一点。我们稍后再谈这个。但重要的是要了解 Spring 只是可供您使用的类和接口的集合 :) 我还想立即说明 Spring 不仅可以用于 Web 应用程序,还可以用于最常见的控制台程序我们大家都很熟悉。我们甚至会在今天写其中的一篇。Spring 尽可能地避免这种紧耦合(你的类直接依赖于框架中的类/接口)。它使用注释来实现这一点。我们稍后再谈这个。但重要的是要了解 Spring 只是可供您使用的类和接口的集合 :) 我还想立即说明 Spring 不仅可以用于 Web 应用程序,还可以用于最常见的控制台程序我们大家都很熟悉。我们甚至会在今天写其中的一篇。) 我还想立即指出,Spring 不仅可以用于 Web 应用程序,还可以用于我们所有人都非常熟悉的最常见的控制台程序。我们甚至会在今天写其中的一篇。) 我还想立即指出,Spring 不仅可以用于 Web 应用程序,还可以用于我们所有人都非常熟悉的最常见的控制台程序。我们甚至会在今天写其中的一篇。结构
但 Spring 不仅仅是一个特定的框架。相反,它是一个通用名称,用于指代几个小框架,每个小框架都有自己的工作。https://docs.spring.io/spring/docs/4.3.26.RELEASE/spring-framework-reference/htmlsingle/
图 2.1。Spring 框架概述
- 数据访问
- 网络
- 核
- 和更多
为什么 Java 有 Spring 框架?
好吧,除了它时尚、圆滑、新鲜之外,我现在可以说,只要你掌握了一点 Spring 的使用技巧,你就会明白有各种各样的工作是你不再有的要做,以及 Spring 自己承担了多少工作。您可以编写几十行配置设置并编写几个类,最终得到一个可以运行的项目。但是一旦你开始想知道有多少东西在幕后,有多少工作要做,如果你要基于普通的 servlets 或套接字和纯 Java 实现同一个项目,你需要编写多少代码,你的头发会竖起来:) 春天甚至被描述为一种魔法。当你看到一切正常时,你就会体验到这一点,但您也对幕后发生的工作方式和工作量有一个粗略的了解 — 因此似乎确实有某种魔法在起作用 :) 称其为魔法比试图解释它们如何相互关联要容易得多。:) 支持学习 Spring 的第二个论据是,大约 90% 的初级开发人员职位空缺(根据我的个人观察)需要了解或至少对 Spring 的内容有一个大概的了解Data
, Web MVC
, 和Security
模块提供老练的开发人员 :) 但今天只是关于基础知识。
直接投资/控制权
如果您曾经尝试阅读有关 Spring 的内容,那么您首先遇到的可能是这些缩写词:DI/IoC。现在我强烈建议您从这篇文章中休息一下,阅读这篇 DZone 文章! IoC代表控制反转。当我写到使用库需要您自己在代码中指示调用哪个对象的哪个方法时,我已经顺便提到了这一点,但是使用框架通常意味着框架将在正确的时间调用您的代码。换句话说,在后一种情况下,您不再管理执行代码/程序的过程——框架会为您做这件事。您将控制权传递给了框架(控制反转)。 DI代表依赖注入. 使用依赖注入,您不需要在 main 方法中创建 cat 对象,然后将它们传递给您的方法。相反,Spring Framework 会为您创建它们。您只需说“我想在这里养一只猫”之类的话,框架就会在您的方法中将一只猫传递给您。我们将在以后的文章中看到这个缩写。Bean 和上下文
Spring 中的一个关键概念是 bean。实际上,这只是某个类的一个对象。假设我们有一个程序需要 3 个对象:一只猫、一只狗和一只鹦鹉。我们有一堆带有一堆方法的类。有时我们需要一只猫来做一个方法,有时我们需要一只狗来做不同的方法,有时我们的方法既需要猫又需要鹦鹉(比如喂猫的方法,哈哈)。对于其他方法,需要所有三个对象。是的,我们可以先在main方法中创建这三个对象,然后将它们传递给我们的类,再在这些类内部传递给相关的方法……等等贯穿整个程序。但是如果我们还假设我们偶尔想要更改我们方法的输入参数列表(例如,我们决定重写一些东西或添加新功能),那么我们将不得不对代码进行相当多的更改。现在想象一下,我们有 300 个这样的对象,而不是 3 个。一种替代方法是将我们所有的对象收集在一个列表中(List<Object>
), 将它传递给每个方法,然后在方法内部获取必要的对象。但是随着程序的运行,如果某个对象被添加到这个列表中,或者更糟的是,如果一个对象被删除了怎么办?这有可能破坏我们使用索引从列表中获取对象的所有方法。为了避免这个问题,我们决定不将对象存储在列表中,而是存储在映射中,其中键是对象的名称,值是对象本身。这允许我们简单地通过使用它们的名称来检索我们需要的对象,例如 get("parrot"),作为响应,我们得到鹦鹉对象。或者键可以是对象的类,值可以是对象本身。在这种情况下,与其指定对象的名称,不如指定我们需要的对象的类。那也方便。或者我们甚至可以为映射编写某种包装器,其中一些方法通过名称获取对象,而其他方法通过类获取对象。我们到达这里的东西叫做Spring 框架中的应用上下文。上下文是 bean(对象)的集合。我们通过名称、类型或其他方式访问上下文以获取所需的 bean(对象)。此外,我们可以要求 Spring 本身在自己的上下文中查找我们需要的 bean,并将其传递给我们的方法。例如,假设我们有这样一个方法:
public void doSomething(Cat cat) {
...
}
当 Spring 调用这个方法时,它从它的上下文中取出我们的 cat 对象并将它传递给这个方法。但现在我们决定,除了猫,我们的方法还需要一只鹦鹉。有了 Spring,没有什么比这更容易了!我们简单地写:
public void doSomething(Cat cat, Parrot parrot) {
...
}
现在当 Spring 调用我们的方法时,它知道需要传递一只猫和一只鹦鹉,所以它会进入它的上下文,获取这两个对象,并将它们传递给我们的方法。通过将控制权转移给 Spring,我们也转移了创建对象并将它们传递给我们的方法的责任,Spring 将调用这些方法。这就引出了一个问题:Spring 如何知道要创建哪些对象(bean)?
配置应用程序的方法
配置应用程序主要有三种方式,即告诉Spring我们需要哪些对象的方式:- XML 配置文件
- 基于 Java 的配置
- 自动配置
- 优先级最高的方法,应该优先使用,是自动配置
- 如果不能使用自动配置来正确配置所有可能的 bean,请使用基于 Java 的配置(涉及使用 Java 代码创建对象)
- 最低优先级的方法是老式的方法——使用 XML 配置文件。
GO TO FULL VERSION