JavaRush /Java 博客 /Random-ZH /春天是属于懒人的。基础知识、基本概念和带有代码的示例。第1部分
Стас Пасинков
第 26 级
Киев

春天是属于懒人的。基础知识、基本概念和带有代码的示例。第1部分

已在 Random-ZH 群组中发布
许多人在阅读了我有关为 Web 项目创建模板以及使用 servlet 创建简单 Web 服务的文章后,想知道我什么时候会写有关 Spring 的文章。我不想,我建议看一本书(我仍然说一本书比网上10篇,甚至100篇文章要好)。但现在我决定向不同的人解释同样的事情,我花的时间比坐下来写一篇文章,然后只是发布一个链接要多。所以我写这篇文章是为了链接))。 春天是属于懒人的。 基础知识、基本概念和带有代码的示例。 第 1 - 1 部分在本文中,我不会按照我的示例,在 5 分钟内编写如何在 Spring 中创建一个工作项目。 我只会写一些基本的事情,如果不了解这些知识,当然可以启动一个项目,但那里发生的事情,更重要的是,为什么,将不清楚。

什么是 Spring 框架?

Spring Framework或简称Spring是用 Java 创建 Web 应用程序的最流行的框架之一。框架类似于库(也许这个术语你更熟悉),但有一点。粗略地说,使用库,您只需创建其中的类的对象,调用您需要的方法,从而获得您需要的结果。也就是说,有一种更命令式的方法:你在程序中明确指出在什么特定时刻需要创建哪个对象,在什么时刻需要调用特定方法等。对于框架,情况略有不同。您只需编写一些自己的类,在那里编写一些逻辑,框架本身就会创建您的类的对象并为您调用方法。大多数情况下,您的类实现框架中的一些接口或从中继承一些类,从而接收一些已经为您编写的功能。但事实并非一定如此。例如,在 Spring 中,他们尝试尽可能地摆脱这种严格的耦合(当您的类直接依赖于该框架中的某些类/接口时),并为此目的使用注释。我们稍后会回到这一点。但重要的是要了解Spring只是一组已经为您编写的类和接口:) 我还想立即指出 Spring 不仅可以用于 Web 应用程序,还可以用于最常见的控制台我们所有人都熟悉的应用程序 今天我们甚至会写类似的东西。

结构

但 Spring 并不是一种特定的框架。这是许多小型框架的通用名称,每个框架都执行某种不同的工作。
春天是属于懒人的。 基础知识、基本概念和带有代码的示例。 第 1 - 2 部分
正如您所看到的,弹簧具有模块化结构。这允许我们仅连接应用程序所需的模块,而不连接那些我们显然不会使用的模块。据我所知,正是这种做法帮助Spring超越了当时的竞争对手(EJB)并取得了领先地位。因为使用EJB 的应用程序有很多依赖关系,而且一般来说它们变得缓慢且笨拙。 从图中可以看出spring框架由几个模块组成:
  • 数据访问;
  • 网络;
  • 核;
  • 和别的。
今天我们来熟悉一下主模块的一些概念,比如:bean、context等。正如您可能猜到的那样,数据访问模块包含用于处理数据(主要是数据库)的工具,用于在网络上工作的Web (包括用于创建 Web 应用程序,这将在稍后讨论)。此外,还有所谓的整个 Spring 基础设施:许多其他项目并未正式包含在框架本身中,但无缝集成到您的 Spring 项目中(例如,用于在 Spring 上处理用户授权的相同spring security)网站,我希望有一天我们也会感受到这一点)。

为什么选择 Java 中的 Spring?

嗯,除了它时尚、时尚、年轻之外,我可以立即说,只要你稍微掌握它,你就会明白你现在不需要做多少不同的工作,还有多少春天承担。您可以编写几十行配置,编写几个类 - 然后您将得到一个工作项目。但是,一旦您开始考虑“幕后”有多少内容,正在完成多少工作,以及如果您要在裸 servlet 或套接字上执行相同的项目,则必须编写多少代码纯Java——你的头发都竖起来了:)甚至还有这样的表达:就像Spring的“魔力”。这是当你看到一切都在工作时,但你粗略地估计了那里必须发生多少事情才能让一切正常工作以及一切如何在那里工作 - 然后似乎所有这一切的发生都归功于某种魔法真的))更容易称其为魔法,而不是试图解释它们是如何相互关联的。:) 嗯,“支持”学习 Spring 的第二个论据是,在大三的大约 90% 的职位空缺中(根据我个人的观察),要么是知识,要么至少是对 Spring 的君子集有一个大概的了解dataweb-mvc以及security:) 只需要基础知识。

DI/IoC

如果您尝试阅读有关 Spring 的内容,那么您首先遇到的可能是这些字母:DI/IoC。现在我强烈建议您暂时放下这篇文章并阅读这篇关于 Habré 的文章IoC(控制反转) ——控制反转。当我写到使用库时,你自己在代码中编写要调用哪个对象的哪个方法时,我已经顺便提到了这一点,而对于框架来说,大多数情况下框架会调用你在右侧编写的代码片刻。也就是说,在这里您不再控制执行代码/程序的过程,而是框架为您完成。您将控制权转移给了他(控制反转)。DI可以理解为Dependency Inversion (依赖倒置,尝试不在模块/类之间建立硬连接,其中一个类直接绑定到另一个类),或Dependency Injection(依赖注入,这是当 cat 对象不由你在 main 中创建,然后你将它们传递给你的方法,Spring 为你创建它们,你只需告诉他类似“我想在这里养一只猫”,他就会在你的方法中将其传递给你)。我们将在以后的文章中更经常地遇到第二个。

Bean 和上下文

Spring 的关键概念之一是bean。本质上,它只是某个类的对象。假设我们的程序需要使用 3 个对象:一只猫、一只狗和一只鹦鹉。我们有一堆带有一堆方法的类,有时我们需要一只猫作为一个方法,一只狗作为另一个方法,有时我们会有需要一只猫和一只鹦鹉的方法(例如,一个方法用于喂养猫,呵呵),并且在某些方法中,将需要所有三个对象。是的,我们可以先在main中创建这三个对象,然后将它们传递给我们的类,再从类内部传递给我们需要的方法……以此类推整个程序。如果我们还想象我们想要定期更改我们的方法接受的参数列表(好吧,我们决定重写一些东西或添加功能) - 那么如果我们需要的话,我们将不得不对代码进行大量编辑改变些什么。现在,如果我们想象我们拥有的不是 3 个而是 300 个这样的对象怎么办?另一种方法是将所有此类对象收集到一个公共对象列表 ( List<Object> ) 中,并将其传递给所有方法,然后从方法内部获取我们需要的这个或那个对象。但是,如果我们想象随着程序的进行,某些对象可能会被添加到这个列表中,或者(更糟糕的是)被删除呢?然后,在我们通过索引从列表中检索对象的所有方法中,一切都可能会中断。然后我们决定存储的不是一个列表,而是一个映射,其中键是我们需要的对象的名称,值是对象本身,然后我们可以通过名称从中获取我们需要的对象: get("parrot")作为响应,我们收到了一个对象 parrot 或者说,键是对象的类,值是对象本身,那么我们可以不再指示对象的名称,而只需指示我们需要的对象的类,这样也方便。或者甚至在映射上编写某种包装器,您可以在其中创建方法,以便在某些情况下可以按名称检索对象,而在其他情况下则可以按类检索对象。这是我们从 spring应用程序上下文中得到的。上下文是一组 bean(对象)。转向上下文,例如,我们可以通过名称、类型或其他内容来获取所需的 bean(对象)。此外,我们可以要求 Spring 在其上下文中查找我们需要的 bean 并将其传递给我们的方法。例如,如果我们有这样的方法:
public void doSomething(Cat cat) {
    ...
}
当 Spring 为我们调用这个方法时,它将我们的猫的对象从它的上下文传递给它。现在我们决定我们的方法除了猫之外还需要一只鹦鹉。使用弹簧 - 对我们来说没有什么比这更容易的了!我们简单地写:
public void doSomething(Cat cat, Parrot parrot) {
    ...
}
当Spring调用我们的这个方法时,它会明白我们需要在这里传递一只猫和一只鹦鹉,进入它的上下文,获取这两个对象并将它们传递给我们的方法。通过将程序的控制权移交给 Spring,我们还将创建对象并将其传递给他将调用的方法的责任转移给了他。问题出现了:Spring 如何知道要创建哪些对象(bin)?

应用程序配置方法

配置应用程序有三种主要方法(即告诉 Spring 我们需要工作哪些对象):
  1. 使用 xml 文件/配置;
  2. 使用java配置;
  3. 自动配置。
Spring 开发人员按以下优先级顺序排列它们:
  • 应优先考虑的最优先方法是自动配置;
  • 如果使用自动配置无法正确配置所有可能的 bean,请使用 Java 配置(使用 Java 代码创建对象);
  • 嗯,优先级最低的方法是老式方法,使用 xml 配置。
此外,Spring 允许您组合这些方法。例如,让 Spring 完成所有可以自动配置的事情;在需要指定一些特殊参数的地方,使用 Java 配置来完成,此外,您还可以以 xml 格式连接一些旧配置。一般来说,这一切都可以相当灵活地完成。但是,如果一切都可以使用自动设置完成,请使用它。我只会考虑自动配置和 Java 配置;xml 配置已经在 Internet 上的几乎每个 Spring 示例中使用,一旦您了解了 Java 配置的工作原理,“读取”执行相同操作的 xml 文件应该没有问题。当我们工作所需的对象是我们编写的类的对象时,使用自动配置。如果需要一些非常具体的逻辑来创建类的对象,或者如果我们没有机会使用我们需要的注释来标记类(自动配置会拾取这些注释),则可以在 Java 配置中完成。在下一部分中,我们将创建一个 Maven 项目,将几个中央 spring 模块连接到它并创建我们的第一个 bean。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION