针对初学者的Spring框架和Spring Boot

首先

Spring是一个旨在简化Java应用程序开发的项目生态系统。”Spring”一词指的是Spring Framework,并且也是使用Spring基础技术(如Spring Boot)的所有项目的统称。本文将介绍Spring Framework和Spring Boot。

Spring框架和Spring Boot

春季框架

    • 2004年に正式リリース。Javaアプリケーション用のフレームワーク。

 

    • Inversion of Cotnrolが中心的な機能。 (いわゆるDIコンテナ)

 

    • 2018年9月 Spring Framework 5.1から Kotlin 1.1サポート

 

    ソースコード

春季启动器

    • 2014年に1.0がリリース

 

    • スタンドアロンのSpringアプリケーションが作成できる。

 

    • AutoConfigurationにより自動的な設定をしてくれる。

 

    • Spring InitializerはSpring Bootを前提にしている。

 

    ソースコード

Spring Framework和Spring Boot的不同

    • Spring Frameworkは、Java言語のアプリケーション開発のために作られたフレームワークの集合体。

 

    Spring bootは、集合体となった機能を使いやすくするためのフレームワーク。

我们已经介绍了Spring Framework和Spring Boot的概要。现在我们将通过实际的代码示例进行解释。

使用SpringBoot创建应用程序。

直到REST API运行

本次我们将使用Spring Initializr创建项目。Spring Initializr是一个可以在GUI界面上轻松创建Spring Boot项目的工具。本次我们将使用以下设置创建项目。另外为了代码简化,我们将使用Kotlin进行说明。

    • Gradle(Groovy)

 

    • Kotlin

 

    • Spring Boot V3.1.2

 

    • JDK17

 

    • Dependencies

Spring Web

Untitled.png

让我们用编辑器或集成开发环境(IDE)打开早先创建的项目。

查看build.gradle文件后,可以发现项目的依赖关系如下所示,与通过Spring Initializr设置的依赖关系中包含了spring-boot-starter-web。

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'com.fasterxml.jackson.module:jackson-module-kotlin'
	implementation 'org.jetbrains.kotlin:kotlin-reflect'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

接下来是 application 类。这个类会自动创建。
这个类是一个包含 main 方法的类,在 SpringBoot 启动时会被执行。

package com.example.demo

@SpringBootApplication
class DemoApplication

fun main(args: Array<String>) {
	runApplication<DemoApplication>(*args)
}

接下来,我们将创建控制器类来执行web应用程序。
控制器类是用于处理来自客户端的请求和响应的类。在以下设置中,我们将访问/hello时返回”hello”。

package com.example.demo.controller

@RestController
class HelloController {

  @GetMapping("/hello")
  fun hello(): String {
    return "hello"
  }
}

现在准备工作已经完成了。现在就立刻启动应用程序并发送请求吧。

## 起動
./gradlew bootRun

## リクエストを送る
$ curl localhost:8080/hello
hello

就像在控制器中所写的那样,将返回“hello”。

为什么会动?

我实际上启动了应用并发送了请求,但是只是编写了控制器类,为什么会返回响应呢?
这是因为应用类中的@SpringBootApplication有一个秘密。

1. @SpringBootApplication是一个由多个注解组成的复合体,其中包含@EnableAutoConfiguration和@ComponentScan等注解。即使使用相同的注解也可以进行替代使用。详细信息可参考参考文献。

第二个类级别的注解是@SpringBootApplication。这个注解被称为元注解,它结合了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan。

我会简单介绍一下。

@ComponentScan是Spring Framework的一个注解,用于扫描组件并将其注册到依赖注入容器中。因此,在启动时,带有@RestController注解的HelloController实例将被注册到依赖注入容器中,然后AutoConfiguration将创建控制器类函数和路径的映射。当有请求时,将根据映射和路径进行匹配,并调用函数返回响应。接下来,我们将详细解释。

处理的详细信息

关于处理流程,如上所述,现在我们将详细解释每个处理的具体内容。

组件扫描

@Component、@Repository、@Service、@Controller、@Configuration

アノテーション説明@Controllerクライアントからのリクエスト/レスポンスに関わる処理をするコンポーネントであることを表すアノテーション。@Serviceビジネスロジックを実装するコンポーネントであることを表すアノテーション。@Repositoryデータの永続化に関わる処理を提供するコンポーネント@Component上記3つに当てはまらないコンポーネント。@ConfigurationBeanの設定を行うものであることを示す。Bean設定クラスには常にこれをつけます。@RestControllerJSONやXML等を返すWebAPI用のコントローラに付与する。@ControllerAdviceControllerを横断して例外をハンドリングする場合、例外ハンドリング用のクラスにこのアノテーションを付与する。ExceptionHandler系のクラスに使用する。

因此,在之前创建的项目中,将扫描带有@RestController的HelloController类。实际处理由SpringFramework的ConfigurationClassParser完成,它提取了带有@ComponentScan注释的类包下的组件。
然后,扫描和收集的类将通过DefaultListableBeanFactory创建实例,并注册到DI容器中。

自动配置

AutoConfiguration是Spring提供的一种机制,它能够自动为各种项目的设置以及第三方库的必要设置在Spring Framework中进行自动Bean定义,以便Spring Boot能够使用。
Bean指的是要注册到DI容器中的组件。(这里的Bean指的是Spring的Bean,与Java Beans无关。)

在处理上,首先看一下@EnableAutoConfiguration的实现,可以看到它带有@Import注解,导入了另一个Configuration类,在这里指定的是AutoConfigurationImportSelector。AutoConfigurationImportSelector会获取每个在META-INF/spring.factories中指定的库所需的配置。这些Configuration类上也会带有前述的@Configuration注解,并被定义为Bean。

映射

为什么只需在DI容器中注册HelloContoroller类,就能够在收到对/hello的请求时返回响应,下面我将进行解释。
在Spring框架中,不会自动进行映射,而是由Spring Boot自动为我们进行配置。查看web模块的自动配置时,可以看到WebMvcAutoConfiguration中有一个名为createRequestMappingHandlerMapping的方法。通过设置断点并跟踪代码执行,最终可以看到MethodIntrospector在创建路径和函数的映射关系。

Untitled 1.png

我实际调试并进行了确认。在 methodMap 中我发现了 com.example.demo.controller.HelloController.hello():{GET[]/hello},这意味着当有来自 hello 的 GET 请求时,我可以通过匹配该映射的路径来执行 hello() 方法。

总结

阅读到文章这里的人们

    • Spring Frameworkはコンポーネントスキャンでインスタンスを作成したり、DIコンテナへBeanの登録をしている。

 

    Spring BootはAutoConfigurationで各モジュールの初期設定などを行っている。

我想很多人知道了一件事,即Spring Framework和Spring Boot有很多神奇的部分,很多人不知道它们是如何运作的。我希望这篇文章能让人们稍微理解Spring Framework和Spring Boot分别做了什么,以及如何使应用程序能够运行。非常感谢。

广告
将在 10 秒后关闭
bannerAds