SpringBoot源码解读
SpringBoot已经成为众多企业开发Java项目的必备框架,即使是微服务框架SpirngCloud也基于SpringBoot。对SpringBoot的研究可以进一步提高我们的专业技能。本人利用业余时间研究下SpringBoot底层实现。代码这东西看的时候能懂,但看完容易忘。因此,做个笔记,也分享给有需要的同学
文章目录
准备
版本信息
- JDK 1.8
- SpringBoot 2.6.7 (不同版本底层有些差异)
- 开发工具 IDEA
一、项目构建
构建方式
方法一:生成maven项目、添加springboot依赖
方法二:IDEA插件 Spring Assistant,通过Spring助手生成SpringBoot项目
代码
项目信息
- groupId(组织标识):com.walker
- artifactId(项目标识):spring-boot-study
- version(版本):0.0.1-SNAPSHOT
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.7</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.walker</groupId>
<artifactId>spring-boot-study</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-study</name>
<description>spring-boot-study</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
SpringBootStudyApplication
package com.walker.springboot.study;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootStudyApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootStudyApplication.class, args);
}
}
编写Controller:HelloController
package com.walker.springboot.study;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class HelloController {
@GetMapping("/")
String index() {
return "Hello Spring boot!";
}
}
运行
执行SpringBootStudyApplication的main函数即可
访问地址:127.0.0.1:8080/
二、分析
1. spring-boot-starter-web不需要指定版本
我们可以看到引入的时候没有写version标签
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
点开spring-boot-starter-parent 的poml文件,内容如下
- 有一个父项目spring-boot-dependencies
- resources标签下定义了一些资源文件
- pluginManagement 定义了一些插件信息 包括spring-boot-maven-plugin
在这里面没有发现版本的定义信息,打开dependencies的pom文件,发现里面定义了很多包的版本信息,且依赖放在dependencyManagement标签里面,内容太多就不贴了
打开maven官网
依赖介绍
对dependency management的定义如下:
The dependency management section is a mechanism for centralizing dependency information. When you have a set of projects that inherit from a common parent, it’s possible to put all information about the dependency in the common POM and have simpler references to the artifacts in the child POMs.
简单来讲就是:集中管理依赖信息,抽取公共依赖,简化子项目的依赖配置。
dependencyManagement应用场景
当我们项目中不同模块依赖相同jar包时,把共同依赖定义在父项目的dependencyManagement标签中,这样在进行依赖包的版本管理时,只需要修改一个地方。 简化了依赖包的版本管理
2.如果当前项目已经有父项目,如何引入SpringBoot
引入spring-boot-dependencies
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- type 是必须要有的。默认是:jar,可以不填写
- scope:import 可以导入托管的依赖。简单来讲,就是把dependencies管理的依赖合并到当前项目中
总结
本文主要描述了SpringBoot框架的使用,下一篇将正式进入源码的讲解。