SpringBoot的底层原理仍然是Spring,使用SpringBoot框架带来如下优势
(1) 快速开发
能快速创建一个生产级别的Spring应用
(2) 简化整合
SpringBoot提供了可选的场景启动器(starter),整合项目只需要引入对应的场景启动器(例: web-starter、mybatis-starter等)即可
(3) 简化配置
遵循"约定大于配置"的规则,只要引入了对应的"场景启动器(starter)",则该启动器的所有配置都按默认配置(但也可以自定义配置,只需要修改配置文件即可)
集中化管理配置:所有配置都写在同一个文件中
(4) 简化部署
SpringBoot直接嵌入了Tomcat、Jetty、Undertow,因此不需要再将项目打war包后放在Tomcat中部署,只需要将项目打jar包后放在java环境中用java -jar命令即可
(5) 简化监控
SpringBoot自带一些指标监控、健康检查(k8s检查应用是否存活)
(6) 简化运维
SpringBoot可以采用外部化配置(将配置文件放在jar包外面),可以直接在外部修改配置文件后重启jar包(java -jar命令)即可,规避了war包方式需要重新打war包重新部署的弊端
1 入门案例
1.1 环境准备
(1) SpringBoot 3+
(2) JAVA 17+
(3) maven 3.6+
(4) Tomcat 10+
1.2 编写pom.xml
继承SpringBoot的starter
添加web的starter依赖
<!--所有SpringBoot项目都必须继承自spring-boot-starter-parent-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.4</version>
</parent>
<!--依赖不用写版本号,因为版本号已经在此项目的父项目spring-boot-starter-parent的父项目spring-boot-dependencies中用"<dependencyManagement>依赖管理"定义好了-->
<!--也可以利用maven的"就近原则",使用自定义的依赖版本-->
<dependencies>
<!--web开发的场景启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--redis场景启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
<!--mysql驱动(见文章"Spring (1) IOC")-->
<!--MybatisPlus(包含了mybatis的starter)-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.4</version>
</dependency>
<!--application.yaml文件提示(输入关键字会给与提示)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<!--SpringBoot打包插件,让应用支持直接jar包部署-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
1.3 编写入口程序
入口程序只有一个,只有这个类的所在的包及其子包才会被Spring扫描到,即默认的@ComponentScan
也可以用@SpringBootApplication(scanBasePackages = "xyz.aboluo")或@ComponentScan("xyz.aboluo")来明确要扫描的包
/**
* 启动SpringBoot项目的主入口程序
*/
@SpringBootApplication(scanBasePackages = "xyz.aboluo") //标记这是一个SpringBoot应用
public class MainApplication {
public static void main(String[] args) {
ConfigurableApplicationContext iocContext = SpringApplication.run(MainApplication.class, args);
}
}
1.4 编写接口
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "{'code':200,'msg':'hello,world!'}";
}
}
1.5 编写配置
在application.properties配置文件中自定义相关配置
配置文件的所有配置项是和某个类的对象的属性一一绑定的,这种类叫做配置属性类
例:ServerProperties.class类绑定了Tomcat服务器有关的配置(比如server.port)
MultipartProperties.class类绑定了文件上传相关的配置
#自定义端口
server.port=8083
#项目地址
server.servlet.context-path=/sb
#最大文件大小
spring.servlet.multipart.max-file-size=20MB
1.6 快速部署
1.6.1 打jar包
1.6.2 "windows控制器"部署
在jar包所在目录,用cmd进入Window控制器,直接用java -jar demo.jar命令执行jar包
1.6.3 "linux"部署
nohup java -jar demo.jar &
&表示后台运行,不用一直停留在jar包运行的控制台
nohup(no hang up)表示不挂断运行命令,即使帐号断开连接,或关闭连接窗口,demo.jar依然会一直运行
1.6.4 终止jar包运行
(1) 用ps -ef | grep 'java -jar'命令查找进程
(2) 用kill -9 pid结束进程
1.7 访问接口
2 全注解开发
SpringBoot摒弃了xml的配置方式,改为全注解驱动
2.1 常用注解
@Configuration、@SpringBootConfiguration(与@Configuration功能一样)、@Bean、@Scope、@Component、@Controller、@Service、@Repository、@Import
上述注解介绍可以看这篇文章
2.2 属性绑定注解
将Spring容器中已经注册的组件(Bean)的属性值和配置文件的配置项的值进行绑定
2.2.1 注册组件
可以用@Component等注解注册,也可以在Spring配置类中用@Bean注解注册
2.2.2 @ConfigurationProperties(prefix="teacher")
将配置文件中所有teacher前缀的配置项的值与有此注解的组件的属性进行绑定(需要2者同名才可以绑定)
注解可以用在Bean类上,也可以用在Spring配置类@Bean方法上
此时通过@Component注册的组件生效,通过@Bean注册的组件也生效
2.2.3 @EnableConfigurationProperties
用在Spirng配置类(@Configuration或@SpringBootConfiguration)上的注解,并且还是需要配合@ConfigurationProperties一起使用
作用1: 将对应的类引入Spring配置类(无需再写@Component或@Bean)
作用2: 并且用配置文件中的特定前缀的配置项的值与有此注解的组件的属性进行绑定
使用原因:因为SpringBoot只扫描自己主程序所在的包,根据SPI机制,还会(也只会)扫描引入的starter的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中指定的类(一般是自动配置类),不会扫描配置属性类,所以有2种方法解决:
(1) 在引入的starter的自动配置类中用@Import引入配置属性类
(2) 在引入的starter的自动配置类中用@EnableConfigurationProperties(配置属性类.class)同样可以引入配置属性类
@SpringBootConfiguration
@EnableConfigurationProperties({Dog.class, Cat.class})
public class SpringConfig {
}
#application.properties配置文件
dog.name=旺财
dog.age=3
dog.like=骨头
cat.name=小猫咪
cat.age=2
cat.like=猫粮
@ConfigurationProperties(prefix = "dog")
public class Dog {
private String name;
private Integer age;
private String like;
}
@ConfigurationProperties(prefix = "cat")
public class Cat {
private String name;
private Integer age;
private String like;
}
@SpringBootApplication(scanBasePackages = "org.example")
public class MainApplication {
public static void main(String[] args) {
ConfigurableApplicationContext iocContext = SpringApplication.run(MainApplication.class, args);
Dog dog = iocContext.getBean(Dog.class);
Cat cat = iocContext.getBean(Cat.class);
System.out.println(dog); //Dog{name='旺财', age=3, like='骨头'}
System.out.println(cat); //Cat{name='小猫咪', age=2, like='猫粮'}
}
}
3 整合项目流程
3.1 导依赖
3.2 找自动配置类
在starter的autoconfigure依赖包下的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,找到对应的自动配置类(自动配置类一般是xxxxxAutoConfiguration)
3.3 找配置属性类
自动配置类的@EnableConfigurationProperties注解可知它的配置属性类,某个项目的配置属性类一般是xxxxxProperties
配置属性类的@ConfigurationProperties注解可知在自己项目的配置文件中要写的前缀是"aaa.bbb.ccc",其中一些配置属性已经被配置了默认配置