针对初学者的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
让我们用编辑器或集成开发环境(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
因此,在之前创建的项目中,将扫描带有@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在创建路径和函数的映射关系。
我实际调试并进行了确认。在 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分别做了什么,以及如何使应用程序能够运行。非常感谢。