思维导图部分
1.1 创建项目
项目构建的工具有很多种,个人采用的是eclipse的插件STS(spring Tool Suite),相比maven构建项目,会自动装在spring-boot-starter-parent等相关依赖,免去部分开发上的麻烦,建立一个spring boot项目首先得了解个人当前的JDK版本是否兼容,2.1.3版本的springboot要求的JDK版本也必须要在JDK8以上版本。
1.1 新建项目
1.2 建立项目中有关的字段
在建立项目过程中,会有很多关于项目的一些字段,通过书本了解到项目中部分重要的字段,我挑出来自己学习+解析,建完表之后会有很多其他不理解的点,在下面会写。
GroupID:该字段声明,该项目所在的公司或组织,表明这个项目的归属地
Artifact:该字段声明,该项目的项目名称,通常代表项目代号
Version:该升段声明,该项目的版本号,通常是系统默认生成的
1.2 重要字段
1.3 pom.xml相关依赖
由于个人是用插件STS建立的项目,所以部分步骤不需要个人去手动导入,但为了加深印象,利用maven项目去建立springboot项目时,不可避免的就是去pom.xml的配置文件中注入相关的依赖,而这里面核心的依赖有2个,增加完这两个依赖之后,便可以进行一些简单的项目开发了。
1.3.1 spring-boot-starter-parent
用于增加在springboot框架项目的统一父类管理依赖,增加依赖可以使用springboot的相关特性,例如:<dependencies/><version/>等
1.3.2 spring-boot-starter-web
用于在springboot框架下对于web开发场景集成支持的依赖启动器,增加该依赖可以支持spring mvc框架下相关依赖,用以进行web开发,根据我的理解层面的话,它就相当于项目的一个通道,给不支持web开发的项目提供一个项目和web开发的一个渠道
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
1.3.1 spring-boot-starter-parent
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
1.3.2 spring-boot-starter-web
1.4 项目开发相关注解
注入以上的依赖之后,便可以进行一些简单的项目开发,但开发过程中会有部分不理解的点。
1.4.1 主程序类注解-@SpringBootApplication
@SpringBootApplication
//用于声明整个项目的主程序类为 Itchapter01Application
public class Itchapter01Application {
public static void main(String[] args) {
SpringApplication.run(Itchapter01Application.class, args);
}
}
1.4.1 主程序类注解
利用STS插件建立项目之后,会发现他会自动帮我建一个类,且该类有一个注解@SpringBootApplication,通过书本了解,这一个注解是用于告诉项目,他的主方法类为Itchapter01Application,理解上的话就是整个项目的main()方法在这个类。
1.4.2 主程序类注解运行原理
这是他的作用,但是他真正的运行原理,需要查看他的底层代码。
1.4.2 底层代码
根据书本的解释,注解@SpringBootApplication,核心注解有三个@SpringBootConfiguration/@EnableAutoConfiguration/@ComponentScan
学过一些spring基础的朋友便很快了解@ComponentScan是个组件包扫描器,将指定包中的注解类自动装配到spring的容器中,但其中的问题在于,他如何获取到指定包的路径?而@SpringBootConfiguration/@EnableAutoConfiguration的注解仍需要再去看他们的底层代码才能了解他们本质的作用
1.4.3 SpringBootConfiguration
通过查看@SpringBootConfiguration的底层代码发现,内部带有一个@Configuration的注解,便大致可以明白了主程序类的运行机制,在Spring框架中的注解@Configuration,作用是声明当前类是一个配置类,支持被扫描器扫描到的配置类,通过百度以及查阅书籍明白了,配置注解@Configuration可以将一个或多个@Bean进行统一注册进Spring容器中对其管理,通过运行机制理解就是,一个工厂将项目中需要的组件集中在这个地方,对其进行相关的调配保证工厂的正常运行,那么现在需要的就是获得每一个需要的组件的具体位置,通过@ComponentScan扫描器将每一个组件带来集中管理,而@EnableAutoConfiguration的作用可以大致猜出来了,获取组件的路径,并且将路径指定到扫描器上。
1.4.4 EnableAutoConfiguration
通过分析@EnableAutoConfiguration底层代码,其重要的注解有@Import和@AutoConfigurationPackage,从书籍中翻阅了解注解@Import的作用是向容器中导入注册的所有组件,而需要导入的组件是交给AutoConfigurationImportSelector(自动配置类扫描)所指定的路径决定的,@AutoConfigurationPackage的底层代码拆分来看,也是存在一个@Import注解在里面的,且由Registrar决定导入组件
1.4.5 AutoConfigurationImportSelector
AutoConfigurationImportSelector类所导入的组件,主要作用是用于筛选过滤掉当前项目环境不需要的自动配置类,通过以上代码的截图分析,他先获取了所有Spring boot提供的自动配置类,通过父类自带的checkExcludedClasses()方法将现阶段获取的自动配置类进行筛选,通过removeAll()方法进行过滤,从而将项目相关的自动配置类返回给扫描器。
1.4.6 AutoConfigurationImportPackage
1.4.7 Registrar
通过查看这两者底层代码的方法比对,Registrar中registerBeanDefinitions方法通过DeBug模式启动项目,会发现上述代码获取的数据是项目主程序启动类的目录,也就是说@AutoConfigurationPackage的作用是获取主程序启动类所在根目录,从而指定扫描器扫描包的位置。
通过以上的所有原理分析,大致可以明白SpringBoot项目启动的步骤:
创建项目——注入相关依赖启用对应的服务——声明配置类,获取组件扫描器的服务并为其指定包,将指定包扫描到的组件导入容器-导入容器之前,将筛选过滤后,再进行导入
1.5 创建Web访问的Controller类
创建好项目后,在主程序启动类所在的包下创建一个名称为Controller的包,并且创建类HelloController,编写一个请求处理的方法,代码如下:
import java.util.Date;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
//用于将类作为组件注入到spring容器中,同时将该类方法以json字符串的形式返回
public class helloController {
@GetMapping("/hello")
//web集成开发中,设置该类的方法路径,并且以GET方式对此方法进行访问
public String hello() {
Date date=new Date();
String welcomeString=date.toLocaleString();
return "您的访问时间为:"+welcomeString;
}
}
Controller类中的注解@RestController,以及其hello()方法的注解@GetMapping()
1.5.1 @RestController类 运行原理
1.5.1 RestController
该注解作为一个组合注解,通过分析底层代码可以了解@Controller和@ResponseBody是他主要的运行原理,@Controller的作用是声明当前类是作为一个Controller对象(控制层)的组件增加到Spring容器中,而@ComponentScan会扫描到该类并且判断该类使用使用了@RequestMapping处理,而@ResponseBody则是将该类以json字符串的类型返回,而@GetMapping的作用,则是触发@Controller类的@RequestMapping,设置访问路径并且限定访问方式为Get,从而实现对于web服务的开发,而通过运行程序,最终得到的结果截图如下:
1.5.2 运行结果