概述
Spring官网:https://spring.io/projects
Spring Boot 是在Spring框架基础上创建的一个全新框架,是Spring项目中的一个子工程,与Spring-framework 同属于Spring的产品。
Spring Boot 称为搭建程序的脚手架 。其最主要作用是快速的构建庞大的Spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让开发者关注于业务而非配置。
Spring Boot 简化了基于Spring的应用开发,为Spring平台及第三方库提供开箱即用的设置(提供默认设置,存放默认配置的包就是启动器starter),多数Spring Boot应用只需要很少的Spring配置。 Spring Boot 内置了tomcat,无需再单独配置tomcat。
Spring Boot 设计的目的是简化 Spring 应用的搭建和开发过程,它不但具有Spring的所有优秀特性,而且具有如下显著的特点:
- 为 Spring 开发提供更加简单的使用和快速开发的技巧
- 具有开箱即用的默认配置功能,能根据项目依赖自动配置
- 具有功能更加强大的服务体系,包括嵌入式服务、安全、性能指标,健康检查等
- 绝对没有代码生成,可以不再需要 XML 配置,即可让应用更加轻巧和灵活
- Spring Boot 对于一些第三方技术的使用,提供了非常完美的整合,使用简单。
SpringBoot 项目搭建
基础依赖引入
Spring Boot 官网版本列表:https://spring.io/projects/spring-boot#learn
- RELEASE GA:General Availability,正式发布的版本,官方推荐使用此版本。
- SNAPSHOT:快照版,可以稳定使用,且仍在继续改进版本。
- PRE:预览版,内部测试版,主要是给开发人员和测试人员测试和找BUG用的,不建议使用。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>spring-boot-ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 使用SpringBoot框架必须引入 spring-boot-starter-parent 作为父项目 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
</parent>
<properties>
<!-- 设置JDK版本 -->
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- web启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 单元测试启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!---- 数据库相关 ---->
<!-- jdbc启动器,spring-boot-starter-jdbc默认集成了HikariCP连接池 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- druid连接池启动器 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 持久层框架启动器 -->
<!---- 工具类 ---->
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
启动类
App.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
}
Spring Boot 配置
Spring 加载配置的注解
- @Configuration :声明一个类作为配置类,代替 xml 文件
- @Bean : 声明在方法上,将方法的返回值加入 Bean 容器,代替
<bean>
标签 - @Value :属性注入,替代 xml 中的属性注入
格式: @Value("${属性}")
@PropertySource :加载指定的属性文件(*.properties)到 Spring 的 Environment 中
可以配合 @Value 和 @ConfigurationProperties 使用
- @PropertySource 和 @Value 组合使用:
可以将自定义属性文件中的属性变量值注入到当前类的使用@Value注解的成员变量中。
- @PropertySource 和 @ConfigurationProperties 组合使用:
可以将属性文件与一个Java类绑定,将属性文件中的变量值注入到该Java类的成员变量中。
- @PropertySource 和 @Value 组合使用:
@ConfigurationProperties:自动配置绑定
@ConfigurationProperties:用于自动配置绑定 yml 配置文件的属性和 java 对象的属性
支持属性:
- value / prefix 属性:配置文件配置项前缀
- ignoreInvalidFields 属性:默认为false,值类型不匹配将会爆出异常
- ignoreUnknownFields 属性:默认为true,忽略掉对象中未知的字段
用法1:标注在类上,转换配置文件配置项为bean对象
注意:
需要将标注了 @ConfigurationProperties 注解的类注册到spring容器中,方式有两种:
- 方式1:在标注了@ConfigurationProperties 注解的类上使用 @componet 等 IOC 注解
- 方式2:在标注了@componet 等 IOC 注解的类上或配置类上标注 @EnableConfigurationProperties(bean类名.class)
- 需要有无参构造方法、getter和setter方法
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "app.mycar")
public class Car {
private int price;
private String brand;
}
@Configuration
@EnableConfigurationProperties(Car.class)
public class Config {
}
用法2:标注在配置类的方法上,搭配 @bean 使用,绑定第三方属性
@Configuration
public class DbConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.druid")
public DataSource datasource(){
return new DruidDataSource();
}
}
Environment:获取运行环境变量
Spring中的Environment用来表示整个应用运行时的环境,可以使用Environment类获取整个运行环境中的配置信息。
方法:
public String getProperty(String key)
public <T> T getProperty(String key, Class<T> targetType)
// 注:key为配置文件中的key
示例:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
@Configuration // 声明这个类是一个配置类
@PropertySource(value = "classpath:user.properties") //加载配置文件
public class UserConfig {
@Autowired
private Environment environment;
@Bean //创建User对象,交给spring容器 User对象中的值从配置文件中获取
public User getUser() {
User user = new User();
user.setUsername(environment.getProperty("user.username"));
user.setPassword(environment.getProperty("user.password"));
return user;
}
}
支持的配置文件类型及优先级
支持的配置文件类型:
- application.properties
- application.yml
- application.yaml
配置文件被加载的优先级是:
- properties > yml > yaml
- 若相同的配置在多种配置文件类型中都配置了,则优先级高的配置生效
默认配置和常用基础配置
Spring Boot 封装了大量的默认配置:
- Spring boot 各版本文档目录:https://docs.spring.io/spring-boot/docs/
- SpringBoot 2.3.0.RELEASE版本的默认配置列表(其他版本类似):Common Application properties
Spring Boot 常用基础配置:
server:
# 服务端口号,默认8080
port: 8080
logging:
level:
# 微服务的日志配置。格式:包路径: 日志级别
com.test: debug
spring:
application:
name: test-service
datasource: # 数据源配置
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/leyou?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
Spring MVC 配置
端口配置
设置web访问端口
server:
port: 8080
日志配置
日志级别分为 FATAL、ERROR、WARN、INFO、DEBUG、ALL 或者自定义的级别。
Log4j 建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG
- 企业生产环境,一般设置为 INFO 级别,表示打印 INFO 及以上级别的日志,不打印 DEBUG 及以下级别的日志
- 开发和测试环境,一般设置为 DEBUG 级别,表示所有的级别的日志都能输出
日志级别控制:
logging:
level:
com.test: debug
org.springframework.web: debug
说明:
- logging.level:固定写法,说明下面是日志级别配置,日志相关其它配置也可以使用
- com.test 和 org.springframework 是指定包名,后面的配置仅对这个包有效
静态资源
默认的静态资源路径为:
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public
只要静态资源放在这些目录中任何一个,SpringMVC都会处理。
一般把静态资源放在classpath:/static/
目录下。
拦截器
- 如果想要保持 Spring Boot 的一些默认 MVC 特征,同时又想自定义一些 MVC 配置(包括:拦截器,格式化器, 视图控制器、消息转换器 等等),可以让一个类实现
WebMvcConfigurer
接口,并且添加@Configuration
注解,但不能添加@EnableWebMvc
注解 - 如果想要自定义
HandlerMapping
、HandlerAdapter
、ExceptionResolver
等组件,可以创建一个WebMvcRegistrationsAdapter
实例来提供以上组件 - 如果想要完全自定义 Spring MVC,不保留 Spring Boot 提供的一切特征,可以自己定义类并且添加
@Configuration
注解和@EnableWebMvc
注解
实现步骤:
- 自定义拦截器(实现 HandlerInterceptor 接口)
@Slf4j
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.debug("preHandle方法执行...");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.debug("postHandle方法执行...");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.debug("afterCompletion方法执行...");
}
}
- 添加配置类(实现 WebMvcConfigurer 接口),注册拦截器
@Configuration
public class MyWebConfig implements WebMvcConfigurer {
/**
* 注册自定义拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 通过registry来注册拦截器,通过addPathPatterns来添加拦截路径
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/user/**")
.excludePathPatterns("/user/login"); // 这个地址的不拦截
}
}
ApplicationRunner 接口
- 方法:
只定义了一个 run(ApplicationArguments args) 方法
run 方法的参数 ApplicationArguments 可以获取到当前项目执行的命令参数(比如把这个项目打成 jar 执行的时候,带的参数可以通过 ApplicationArguments 获取到)。
由于该方法是在容器启动完成之后,才执行的,所以,这里也可以从 spring 容器中拿到其他已经注入的 bean。
- 使用场景:
springBoot 项目启动时,若想在启动之后直接执行某一段代码,就可以自定义一个类实现 ApplicationRunner 这个接口,并重写接口的 run 方法。
@Component // 此类必须要交给spring管理才生效
public class ConsumerRunner implements Application{
@Oberride
public void run(ApplicationArgumers args) throws Exception{
//代码
System.out.println("需要在springBoot项目启动时执行的代码---");
}
}
- 在同一个项目中,可以定义多个 ApplicationRunner 的实现类。
如果有多个实现类,同时又需要它们按一定顺序执行,可以通过在实现类上加上 @Order 注解或者实现 Ordered 接口来实现。
SpringBoot 会按照 @Order 中的 value 值从小到大依次执行。即值越小拥有越高的优先级,值越小越先被加载。
注:值可为负数。