前言
经过上面的学习,我们已经掌握的Spring的注解式编程,有此基础后我们再学习SpringBoot就易如反掌,因为SpringBoot就是基于Spring的注解式编程进行开发。接下来我们就正式开始SpringBoot部分内容的学习,先来做个入门程序。
三.SpringBoot入门程序
我们来玩一个入门案例,使用SpringBoot编写一个简单的WEB程序,使用浏览器访问后台能够返回一个“Hello Spring Boot”即可。那么我么思考一下,如果我么使用SpringMVC来做这个案例需要做哪些事情?
- 创建一个web工程(打包方式为 war)
- 导入Spirng相关,SpringMVC相关,Jackson相关,日志相关等等一大堆jar包。
- web.xml中配置:前端控制器DispatcherServlet;编码过滤器;配置上下文参数(指定Spring的xml配置文件地址)等
- 编写SpringMVC的xml配置文件,然后里面配置一堆东西
- 编写Controller,编写方法
总之,使用SpringMVC编写这个web程序是非常麻烦的,那么我们看一下使用SpirngBoot来实现又什么区别
1.搭建HelloWorld
你可以参照官方该文档去搭建 ,也可以按照我下面的步骤来搭建
1.1.创建工程
注意,创建工程的时候选择骨架选择 quickstart(普通的jar项目即可),当然也可以不选择骨架,默认就是普通java项目。总之不要创建一个webapp项目(这是为什么呢??)
1.2.导入相关依赖
<!-- 打包方式jar-->
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
spring-boot-starter-parent是SpringBoot提供的工程 ,spring-boot-starter-web是SpringBoot整合SpringMVC的依赖。此刻你可能会有些疑问,后面我再解释,稍安勿躁。
1.3.创建配置类
配置类也是启动类,贴上@SpringBootApplication最,提供一个main方法来启动应用
@SpringBootApplication
public class ApplicationConfig {
public static void main(String[] args) {
//启动程序
SpringApplication.run(ApplicationConfig.class);
}
}
1.4.编写Controller
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "Hello Spring Boot";
}
}
代码到这里编写完成,项目结构如下
1.5.启动Main方法测试
控制台启动效果
端口默认是8080 , 使用浏览器访问 http://localhost:8080/hello,效果如下
在一开始我们就有知道,SpringBoot是用来简化Spring应用的搭建和开发,使用了SpringBoot之后确实简单了很多,集成速度也快了很多。但是在简单的背后意味着复杂的封装。
2.HelloWorld分析
完成了上面案例相信你也看到了测试效果,此刻你或许有很多地方不理解,比如:pom.xml为什么只需要导入一个jar包,为什么web项目使用的是平通java项目的结构;为什么不在需要web.xml; 使用main方法就能启动程序等等。下面我们一一解答
2.1.pom.xml分析
pom中有3个点是需要给大家讲一下的
- 打包方式:jar
- 使用引入了一个 spring-boot-starter-parent 工程
- 导入了一个 spring-boot-starter-web 依赖包
【重要】对于SpringBoot而言即使是开发WEB项目也是采用普通java项目的结构,打包方式默认使用个jar
,也不再需要WEB-INF/web.xml等结构。当然SpringBoot也可以使用 war
的方式来打包项目,这个我们后面再说。
<parent>
可以看做是Java中的 extends
,用来继承一个父
项目后就可以使用该项目中的依赖,对于 spring-boot-starter-parent
而言该项目是SpringBoot的父项目,它提供了基础依赖和插件管理
。进入到spring-boot-starter-parent的pom.xml中我们可以看到它又使用<parent>
继承了一个 spring-boot-dependencies
工程,如下(ctrl + 左键):
<parent>
<groupId>org.springframework.boot</groupId>
<!--又继承了 spring-boot-dependencies-->
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
<artifactId>spring-boot-starter-parent</artifactId>
<packaging>pom</packaging>
<name>Spring Boot Starter Parent</name>
<description>Parent pom providing dependency and plugin management for applications
built with Maven</description>
<url>https://projects.spring.io/spring-boot/#/spring-boot-starter-parent</url>
<properties>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!--JDK版本-->
<java.version>1.8</java.version>
<resource.delimiter>@</resource.delimiter>
<maven.compiler.source>${java.version}</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
可以看到,spring-boot-starter-parent
继承了 spring-boot-dependencies
,它的打包方式是 <packaging>pom</packaging>
, 默认使用的是JDK版本是1.8,我们可以在自己项目的pom.xml中通过 <java.version>1.7</java.version>
来修改JDK版本。
真正管理依赖的是其实是 spring-boot-dependencies
,安装ctrl点击进去可以看到 ,该项目的<properties>
中管理了很多很多的version, 在其 dependencyManagement
中管理了很多很多的基础依赖,在其 pluginManagement
中管理了很多是插件。
总之:【重要】我们要使用SpringBoot就需要通过<parent>
继承spring-boot-starter-parent
,该父工程为我们管理了很多很多的依赖和插件,如果我们要使用某个依赖,只需要在我们自己的项目的pom引入,无需指定版本号,因为SpringBoot已经帮我们把版本号管理起来了。比如我们要导入一个测试包,就在自己的项目的pom.xml这样导入
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
无需导入版本号,因为父工程已经管理起来了,除非你要修改默认的版本。
在导入 spring-boot-starter-web 的时候我们也是么有指定版本号,可想而知该依赖是被spring-boot-starter-parent管理起来了的,那么该依赖的作用是什么呢?看名字能够猜到,它是SpringBoot和WEB环境整合的一个依赖。我们可以打开该依赖的结构查看一下
【重要】可以看到,一个spring-boot-starter-web导入了很多的其他依赖,如:Spring的基础依赖,SpringMVC的基础依赖,Jackson基础依赖,日志基础依赖,Tomcat的依赖,自动配置的依赖,所以这个spring-boot-starter-web把集成Web环境所需要的所有依赖都导入进来了。你似乎明白点什么了?
【重要】顺便解答一个问题:为什么不需要部署Tomcat? 因为 spring-boot-starter-web 已经导入了一个tomcat(SpringBoot内嵌Tomcat),当我们启动main方法时,底层就会启动内嵌的Tomcat,不在需要我们自己部署。
2.2.启动类分析
下面我们来分析启动类,也就是配置类。在之前我们学习Spring的Java Config有说过,就是使用一个Java类来取代Spring的xml配置作为配置文件,SpringBoot就是使用Spring的Java Config配置。所以我们刚才的 ApplicationConfig
就是一个配置类,同时它提供了一个main方法来启动项目,所以也是启动类。有两个东西需要分析
- 注解:@SpringBootApplication
- 启动:SpringApplication.run(ApplicationConfig.class)
@SpringBootApplication 是SpringBoot提供的一个复合注解,它由三个注解组成,源码如下
//配置注解,该注解上又贴了一个 @Configuration
@SpringBootConfiguration
//开启自动配置
@EnableAutoConfiguration
//Spring IOC自动扫描
@ComponentScan(
excludeFilters = {
@Filter(
type = FilterType.CUSTOM,
classes = {
TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {
AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@AliasFor(
annotation = EnableAutoConfiguration.class
)
Class<?>[] exclude() default {
};
@AliasFor(
annotation = EnableAutoConfiguration.class
)
String[] excludeName() default {
};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {
};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {
};
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
【重要】@SpringBootApplication 包含了三个注解
- @SpringBootConfiguration :该注解的本质其实就是一个 @Configuration 配置注解,标记某个类成为配置类
- @EnableAutoConfiguration :开启SpringBoot自动配置的注解,比如我们集成SpringMVC并没有配置DispatcherServlet前端控制器,但是这个东西一定是存在的,就是SpringBoot帮我们自动配置好了。
- @ComponentScan :这个在讲Spring的Java Config就有介绍,它是Spring IOC的自动扫描的注解,默认扫描当前包及其子包中的打了 @Component;@Repository;@Service;@Controller 注解的类。也就是说我们的HelloController其实已经被启动类默认扫描到了。
- 该注解中还提供了 exclude 可以让我们去排除某些类不需要被Spring注册。
- 也可以通过 scanBasePackages 来修改扫描的包路径
【重要】也就是说标记了 @SpringBootApplication 注解的类,即是一个Spring的配置类,也拥有IOC自动扫描的能力,同时开启了SpringBoot的自动配置的能力。
对于main方法中的 SpringApplication.run 我们知道它的作用是用来启动程序的,该方法会初始化好SpringBoot的环境,并创建AnnotationConfigApplicationContext作为Spring的IOC容器类,然后会执行容器类的 refresh 方法进行刷新。加载Bean,注册Bean,实例化Bean,自动配置,内嵌的Tomcat启动都在该方法中。具体细节后面会专门说到,这里就做讨论了。
2.3.小扩展
dependencyManagement 和 dependencies
我们在SpringBoot的父项目中有看到 dependencyManagement
元素,那么在该元素中的依赖和 放在 dependencies
中的依赖有什么区别呢?放在dependencies中的依赖是可以直接使用的,放在 dependencyManagement 中的依赖只是起到了声明或管理的作用,其中的依赖还不能直接使用,需要在dependencies引入才能使用。
那dependencyManagement有什么意义?它的意义就是管理版本,通常在父项目中使用 dependencyManagement 管理依赖,在子项目中dependencies导入依赖,然后无需版本号引入,因为版本号交给父项目管理了。SpringBoot就是这样干的。
packaging为jar和war的区别
我们需要在pom中指定 <packaging>jar</packaging>
来标记项目的打包类型,有四种类型可以指定
- jar : 打jar包,执行maven的 package命令 就可以把项目打成一个 xx.jar ,这种打包用在普通java项目,SpringBoot默认打jar包。
- war :打 war 包,执行maven的 package命令 就可以把项目打成一个 xx.war ,如果是传统的SpringMVC开发的项目就是一个war的项目。
- pom :这种打包方式代表该项目是用来管理依赖的项目,不需要写任何java代码,通常是一个父项目,被子工厂来继承,比如SpringBoot的父项目 spring-boot-starter-parent 就是打 pom 包。
- maven-plugin :这个比较少用,它是用来开发maven插件的。
3.项目结构认识
SpringBoot项目标准结构如下
代码存放于java 目录 , resources目录中包括
- static : 静态资源目录,比如css,js,html都放在该目录,类似于以前的webapp目录。默认情况下,Spring Boot从classpath下 的 /static ( /public , /resources 或 /META-INF/resources )文件夹, 或从 ServletContext 根目录提供静态内容
- templates :模板文件目录 ,比如xxx.jsp文件就放到该目录,类似于 WEB-INF 目录
- application.properties : 该文件是SpringBoot默认的配置文件名,如果要对项目做一些自定义的配置就修改该文件的内容即可,比如要修改端口,我们加入如下内容
server.port=8181
。还有一个默认配置是application.yml ,这个我们后面再说。
4.创建项目的三种方式
下面介绍SpringBoot项目的几种创建方式第一种是手动创建,刚才我们已经演示过了 ,第二种是使用Spring官方提供的快捷创建网站 https://start.spring.io/
通过网站可以直接配置项目属性,添加依赖,然后点击 generate 生成项目,网站会下载一个基础的SpringBoot项目。
第三种是通过IDEA的Spring Initializr 创建,如下
对项目做相关配置
选择需要的jar包
点击下一步,项目创建成功
5.SpringBoot的特点总结
根据上面Hello分析我们可以总结出SpringBoot的一些特点
- SpringBoot基于Spring高度封装,使用简单高效,很容易就能继承三方框架,比如继承SpringMVC就需要导入一个spring-boot-starter-web即可。
- SpringBoot基于Spring的注解式配置,无需xml,简化了大量的配置
- SpringBoot的父项目帮我们管理了很多的基础依赖和不能,大大简化了maven
- SpringBoot内嵌了Tomcat,使用main方法即可启动,部署简单
- SpringBoot自动配置功能让配置更加简单
一个字,爽 , 但是缺点就是封装的太深,你需要花费很大的精力去了解它的封装过程。
文章就到这里把,喜欢的话请一定给个好评哦,喜欢的话请一定给个好评哦,喜欢的话请一定给个好评哦。