前言
在之前的学习中,我们已经学完了基础的SSM框架,包括spring,springmvc,mybatis。此框架作为使用最多的Java EE 企业应用开源框架,已经极大的简化了开发流程。而今天要介绍的springboot框架更进一步简化了spring开发流程,是一个快速开发脚手架,例如著名的自动配置机制;另外springboot还是整合spring技术栈的一站式框架。综上,springboot不仅快还全。
一、入门案例
创建项目目录如下:
注意带开关小图标的类要放在主程序所在包的同一级目录,原因在自动配置原理那里讲
导入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.1</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
编写启动类Main.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication //表示当前类是一个启动类,核心注解
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class,args);
}
}
编写控制器方法
@RestController //@Controller + @ResponseBody的组合注解
public class HelloController {
@RequestMapping("hello")
public String hello(){
return "hello spring boot!";
}
}
在main.java页面右击运行就可以启动springboot啦,在浏览器中输入http://localhost:8080/hello
(8080为springboot默认端口,如果想改的话后文有提到),可以看到打印信息hello spring boot
(控制器方法中的返回值),具体信息见下图(图左边为springboot启动成功后,idea的打印信息。右边为浏览器打印信息)
定义配置文件application.properties在resources文件夹下
server.port=8888 #修改访问端口
对于更多详细配置,可参考官方文档
二、自动配置原理
1.依赖管理
我们在pom.xml中配置了一个父依赖,在maven的学习中,我们知道父依赖就是进行依赖管理的,父工程中定义了大量依赖,并且对这些依赖进行了版本控制。我们可以按住ctrl点击spring-boot-starter-parent
,进入父依赖内部查看。
可以看到spring-boot-starter-parent也有一个父项目,我们继续点击进去查看。
我们发现这个工程对大量依赖做了管理,并进行了版本控制
所以我们可以得出这样一个结论:spring-boot-starter-parent的作用就是声明了所有开发中常用的依赖的版本号,自动版本仲裁机制。
举个例子
我们可以在pom.xml中引入mysql数据库驱动依赖,并验证版本控制
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
注意添加此依赖时,我们并没有规定版本号,在idea右侧查看项目依赖管理。
可以发现此时mysql驱动依赖带了版本号,证明了刚才得出的结论。但是有的时候springboot官方给我们仲裁的依赖版本并不一定合理。
就比如这个驱动依赖,,官方定义的是8的版本,要求我们本地数据库也必须是mysql8的版本。如果我们自己的数据库是mysql5.x的版本,此时springboot官方给我仲裁的mysql驱动版本明显就不合适了。此时我们需要修改springboot给我们mysql仲裁的版本。
修改依赖版本
我们只需要在pom.xml里面自定义mysql驱动的版本号即可。
<properties>
<mysql.version>5.1.6</mysql.version>
</properties>
更新依赖后再次查看依赖版本号,发现我们修改的版本生效了
2.自动配置
接下来我们查看在pom.xml引入的spring-boot-starter-web
这个依赖。我们称之为web启动器。对于启动器的详细定义可以查看官方文档,简单来说,启动器为一组可用依赖的集合
。
所以我们pom.xml里面导入spring-boot-starter-web启动器的作用就是引入了一系列web场景的依赖。没有springboot之前,这些依赖都需要我们自己手动导入。但是有了springboot之后,通过这个web启动器,我们就可以把这个场景需要的一系列的依赖全部导入进来。
小知识:启动器命名规则
- 官方启动器:以spring-boot-starter-* 开头,如spring-boot-starter-web这个依赖
- 第三方启动器:以组件名开头,如mybatis启动器,mybatis-spring-boot-starter
按住ctrl点击spring-boot-starter-web,进入内部,我们发现它包含很多其他的启动器。
在springboot项目加载的时候,就会对springmvc 、json 、tomcat等进行自动配置。我们可以验证一下
在启动类main.java中验证
@SpringBootApplication
public class Main {
public static void main(String[] args) {
//获得ioc容器
ConfigurableApplicationContext context =
SpringApplication.run(App.class, args);
//获取所有bean的名称的集合
String[] beanDefinitionNames =
context.getBeanDefinitionNames();
//循环获取bean的名称
for(String name : beanDefinitionNames){
System.out.println(name);
}
}
}
点击运行后,可以看到idea控制台打印了很多bean,可以使用ctrl+f进行查找验证。
我们大致发现,之前我们配置的比如:前端控制器、视图解析器、编码过滤器、文件上传解析器等都装配进了ioc容器,换句话也就是说进行了自动配置。而这些在我们之前ssm整合的时候,都是需要我们自己去手动配置的。
此时大家应该还有疑问,就是我们之前在进行SSM整合的时候,我们都会配置包扫描的规则(如下面代码),或者使用@ComponentScan注解。
<context:component-scan base-package="com.xq.controller">
但是在springboot中,已经默认给我们规定好了包扫描规则,那就是主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来。
验证扫描规则
首先修改项目目录结构,把控制器包移到启动类的上级目录
把启动类改回最开始的内容,点击启动,在浏览器进行访问
报错404,说明没找到相应控制器方法。
当然,我们也可以自定义包扫描规则:
@SpringBootApplication(scanBasePackages =
"com.controller") //自定义包扫描规则
public class Main{}
虽然可以自定义包的扫描规则。但是我们一般不这么去做,还是尽量遵循springboot官方给我们定义的默认包扫描规则。
最后,springboot虽然会自动配置,但是不会将所有场景的资源都进行自动配置。它采用的是按需加载的的方式来进行自动配置的。我们引入什么启动器,就会针对这个启动器的场景进行自动配置。SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面。导入启动器才会加载对应的配置。