SpringBoot的一些杂项

本文最后更新于:2023年6月1日 上午

SpringBoot的starter

starter的命名规范

官方启动器:spring-boot-starter-*
第三方启动器:*-spring-boot-starter

stater的分类

application starter:应用级starter
production starter:生产级starter,就一个,提供生产功能以帮助开发者监控和管理应用。
technical starter:技术级别的starter,帮助开发者排除或者替换SpringBoot框架内部默认的技术组件。

自动配置

SpringBoot都会自动配置,想查看自动配置报告,可以用java -jar xx.jar -debug/Ddebug,或者spring-boot:run -Dspring-boot.run.arguments="--debug"
在使用@SpringBootApplication或是@EnableAutoConfiguration注解的时候,可以用excludeexcludeName属性,或是在应用配置文件yml中指定参数spring.autoconfigure.exclude统一排除。

邮件starter

一个很方便的用来发邮件的starter,用法建议百度。

SpringBoot启动过程与扩展应用

应用启动类,如果没有必要,一般建议启动入口类要放置于根目录下,以便使用注解扫描并管理所有子目录包的组件。

SpringBoot懒加载

懒加载的意思是bean不会在应用启动时全部创建,只会在其真正使用时才创建。如果要开启懒加载,yml配置文件中配置spring.main.lazy-initialization: true

Spring Boot Runner

它允许Spring Boot应用启动完成之后,在接受请求之前运行一些特定的代码逻辑。可以实现ApplicationRunnerCommandLineRunner接口。

SpringBoot日志管理

彩色日志配置

yml配置文件中配置`spring.output.ansi.enabled: always/detect(默认)/never

SpringBootWeb核心应用

SpringBoot支持两种Web类型:servlet(即传统的WebMVC)和reactive(响应式的WebFlux

嵌入式容器

容器配置

容器参数绑定类为ServerProperties类,可以通过其绑定的以server.*开头的参数来配置所有容器的通用配置(application.yml中)。
还能通过Java类的方式来自定义Servlet容器,只需实现WebServerFactoryCustomizer<ConfigurableServletWebServerFavtory>接口即可。

随机空闲端口

server.port设置成0SpringBoot就会使用系统随即空闲的端口。

持久化

要让嵌入式容器支持会话持久化,配置:

1
2
3
4
5
6
7
8
server:
servlet:
session:
persistent: true # 开启持久化
store-dir: /tmp/session-store # 持久化目录
tracking-modes:
- cookie
- url # 追踪模式

优雅关闭

1
2
3
4
5
server:
shutdown: graceful
spring:
lifecycle:
timeout-per-shutdown-phase: 20s # 超时参数

注册拦截器

实现HandlerInterceptor接口来创建一个拦截器,如:

1
2
3
4
@Component
public class ExampleInterceptor implements HandlerInterceptor {
...
}

然后在自定义Web配置类中进行注册:

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {
private final ExampleInterceptor exampleInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(exampleInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/example/**");
}
}

注册消息转换器

可以在自定义Web配置类中覆盖原有配置,或是添加额外的自定义转换器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Configuration
public class WebConfig implements WebMvcConfigurer {
// 覆盖原有配置
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
...
}

// 添加额外转换器
@Bean
public HttpMessageConverters customConverters() {
HttpMessageConverter<?> a = new aHttpMessageConverter();
return new HttpMessageConverters(a);
}
}

注册类型转换器

Converter接口可以转换参数的类型,同样也是在自定义Web配置类中进行注册。

1
2
3
4
5
6
7
8
9
10
11
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new ExampleConverter());
}
}

public class ExampleConverter implements Converter<String, String> {
...
}

注册Servlet、Fliter、Listener

三种方法:SpringBoot的手动注册、组件扫描注册、动态注册。
一帮情况下扫描注册组件是最简洁的。

静态资源管理

默认情况下,SpringBoot加载的classpath下的几个静态资源目录有:

/static
/public
/resources
/META-INF/resources
要自定义,通过spring.web.resources.static-locations参数指定
可以添加额外的静态资源目录映射,实现WebMvcConfigurer并覆盖addResourcesHandles即可

参数校验

要对接口参数进行校验,可以导入spring-boot-starter-validation启动器

约束注解

校验接口参数要用到javax(jakarta).validation包下的约束注解
@Valid@Validated
校验接口参数类时,将@Validated放在方法参数类前,然后把约束注解放在类成员变量上面;
校验接口单个参数时,将@Validated注解放在当前Controller类上面,然后将约束注解放在方法参数类前;
要返回具体的参数错误,则需要拦截对应的MethodArgumentNotValidException异常,并做对应的返回处理

国际化

需要手动切换语言的情况,注册一个LocaleResolver区域解析器和区域拦截器

跨域请求

@CrossOrigin可以用在类或者方法上
WebMvcConfigurer配置类中可以实现全局跨域
(但是实际应用会在Nginx上配置跨域

SpringBoot数据访问

分为关系型数据库和非关系型数据库(NoSQL)

嵌入式数据库

相当于“内存形式的关系型数据库”,它在应用中只有一个jar文件,而没有其他的外部环境,所有数据都存储在内存中,也不能持久化数据,应用关闭就会丢弃所有数据
(重点:实际工作中很少用

数据源

SpringBoot支持数据库数据源的自动配置,只需要导入spring-boot-starter-data-jdbc启动器依赖及对应的数据库驱动依赖即可

1
2
3
4
5
6
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/database_name
usernane: root
password: 123456

数据库驱动类参数driver-class-name可以不用指定,SpringBoot可以推断主流数据库类型

事务管理

SpringBoot提供了事务的自动配置,如果没有自定义的事务需求,那么使用默认自动配置的事务即可,在代理方法上使用@Transactional事务注解即可

事务失效的场景

  1. 数据库引擎不支持事务
  2. 没有被Spring管理:记得加上@Service注解让这个类被加载成一个Bean
  3. 方法不是public
  4. 发生自身调用:调用了该类自己的方法事务就不会生效
  5. 没有配置事务管理器:Spring框架需要注意,SpringBoot会自动配置(前提是添加了jdbc启动器依赖
  6. 设置了不支持事务:@Transactional(propagation=Propagation.NOT_SUPPORTED)
  7. 异常没有被抛出:try{...}catch{}这里catch里面是空的,虽然捕获了异常但是没有抛出,所以事务不会回滚
  8. 异常类型不匹配:Spring默认回滚的是RuntimeException异常,如果要触发其他异常的回滚,则需要在@Transactional事务注解上指定异常类:@Transactional(rollbackFor=Exception.class)

Spring Data JPA

JPAjava提供的持久化API,为POJO提供持久化的标准规范,可以把java对象映射为数据库中的记录
Hibernatejava最流行的JPA规范的实现框架
Spring Data JPA则是对Hibernate更上一层的封装
使用JPA,在实体类上加上@Entity注解即可
(评价是依然不如Mybatis

Mybatis

使用MyBatis框架一般需要以下两个组件:
*Mapper.java:数据库映射接口,提供对应的数据库操作方法
*Mapper.xml:数据库SQL映射配置文件,提供数据库映射接口执行的SQL
在配置文件中添加MyBatis配置参数:

1
2
3
mybatis:
mapper-locations: classpath: mapper/*.xml
type-aliases-package: com.example.entity

接口需要使用@Mapper注解修饰

SpringBoot计划任务

To do…


这里有一只爱丽丝

希望本文章能够帮到您~


SpringBoot的一些杂项
https://map1e-g.github.io/2023/05/23/spring-essay-1/
作者
MaP1e-G
发布于
2023年5月23日
许可协议