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…
希望本文章能够帮到您~