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注解的时候,可以用exclude或excludeName属性,或是在应用配置文件yml中指定参数spring.autoconfigure.exclude统一排除。
邮件starter
一个很方便的用来发邮件的starter,用法建议百度。
SpringBoot启动过程与扩展应用
应用启动类,如果没有必要,一般建议启动入口类要放置于根目录下,以便使用注解扫描并管理所有子目录包的组件。
SpringBoot懒加载
懒加载的意思是bean不会在应用启动时全部创建,只会在其真正使用时才创建。如果要开启懒加载,yml配置文件中配置spring.main.lazy-initialization: true
Spring Boot Runner
它允许Spring Boot应用启动完成之后,在接受请求之前运行一些特定的代码逻辑。可以实现ApplicationRunner或CommandLineRunner接口。
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设置成0,SpringBoot就会使用系统随即空闲的端口。
持久化
要让嵌入式容器支持会话持久化,配置:
1 | |
优雅关闭
1 | |
注册拦截器
实现HandlerInterceptor接口来创建一个拦截器,如:
1 | |
然后在自定义Web配置类中进行注册:
1 | |
注册消息转换器
可以在自定义Web配置类中覆盖原有配置,或是添加额外的自定义转换器。
1 | |
注册类型转换器
Converter接口可以转换参数的类型,同样也是在自定义Web配置类中进行注册。
1 | |
注册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 | |
数据库驱动类参数driver-class-name可以不用指定,SpringBoot可以推断主流数据库类型
事务管理
SpringBoot提供了事务的自动配置,如果没有自定义的事务需求,那么使用默认自动配置的事务即可,在代理方法上使用@Transactional事务注解即可
事务失效的场景
- 数据库引擎不支持事务
- 没有被
Spring管理:记得加上@Service注解让这个类被加载成一个Bean - 方法不是
public的 - 发生自身调用:调用了该类自己的方法事务就不会生效
- 没有配置事务管理器:
Spring框架需要注意,SpringBoot会自动配置(前提是添加了jdbc启动器依赖 - 设置了不支持事务:
@Transactional(propagation=Propagation.NOT_SUPPORTED) - 异常没有被抛出:
try{...}catch{}这里catch里面是空的,虽然捕获了异常但是没有抛出,所以事务不会回滚 - 异常类型不匹配:
Spring默认回滚的是RuntimeException异常,如果要触发其他异常的回滚,则需要在@Transactional事务注解上指定异常类:@Transactional(rollbackFor=Exception.class)
Spring Data JPA
JPA是java提供的持久化API,为POJO提供持久化的标准规范,可以把java对象映射为数据库中的记录
Hibernate是java最流行的JPA规范的实现框架
Spring Data JPA则是对Hibernate更上一层的封装
使用JPA,在实体类上加上@Entity注解即可
(评价是依然不如Mybatis
Mybatis
使用MyBatis框架一般需要以下两个组件:
*Mapper.java:数据库映射接口,提供对应的数据库操作方法
*Mapper.xml:数据库SQL映射配置文件,提供数据库映射接口执行的SQL
在配置文件中添加MyBatis配置参数:
1 | |
接口需要使用@Mapper注解修饰
SpringBoot计划任务
To do…

希望本文章能够帮到您~