Spring Boot自动配置原理
pre:Spring工厂加载机制
Spring SPI
Spring框架从3.2版本开始提供了SpringFactoriesLoader工厂加载机制,类似于Java提供的SPI机制,Spring利用这种机制实现了Spring Bean的自动配置
1:SpringFactoriesLoader是Spring框架内部的通用工厂加载机制(Spring3.2之后提供的)
2:他负责加载classpath下的META-INF/spring.factories文件,并实例化文件中的类型
3:文件内容格式必须是Properties(格式)
key必须是某个类型的全限定名称(包名+类名)
value可以是单个值,可以是使用逗号分隔的多个值
例如:example.MyService=example.MyService1,example.MyService2
key和value之间可以没有继承关系
1.在Spring Boot项目中的启动类上有一个注解@SpringBootApplication,这个注解是对三个注解进行了封装,分别是
@SpringBootConfiguration:配置类
@EnableAutoConfiguration
@ComponentScan:组件扫描,扫描启动类所在的包及其子包
其中@EnableAutoConfiguration是实现自动化配置的核心注解.该注解通过@Import注解导入对应的自动配置选择器.
@EnableAutoConfiguration内部就是读取了该项目和该项目引用的Jar包的classpath路径下META-INF/spring.factories文件中的所配置的类的全类名.在这些配置类中所定义的Bean(@Bean:把方法返回值注入到spring容器)会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中.
条件判断会有像@ConditionalOnClass这样的条件注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有Bean放入spring容器中使用.
Spring Boot 2.7.0之后的版本
JavaBean校验
JSR-303规范:Bean Validation
JSR-303规范的参考实现:hibernate validator(属于Hibernate下的一个项目)
约束 | |
---|---|
@NotBlank | 不能为空,检查时会将空格忽略,只能用在String类型上 |
@NotNull | 不能为null,可以用在除了基本数据类型之外的所有引用类型 |
@AssertTrue
|
@AssertTrue
用于
boolean
字段,该字段只能为
true
|
@AssertFalse
|
用于
boolean
字段,该字段的值只能为
false
|
@CreditCardNumber
|
对信用卡号进行一个大致的验证
|
@DecimalMax
|
只能小于或等于该值(可以用在String上)
|
@DecimalMin
|
只能大于或等于该值(可以用在String上)
|
@Max
|
该字段的值只能小于或等于该值
|
@Min
|
该字段的值只能大于或等于该值
|
@Digits(integer=,fraction=)
|
检查是否是一种数字的整数、分数
,
小数位数的数字
|
@Email
|
检查是否是一个有效的
email
地址
|
@Future
|
检查该字段的日期是否是属于将来的日期
|
@Past
|
检查该字段的日期是在过去
|
@Length(min=,max=)
|
只能用于字符串,检查字段的长度是否在
min
和
max
之间
|
@NotEmpty
|
不能为空,可用于
String
、
Collection
、
Map
、数组
|
@Null
|
检查该字段为空
|
@Pattern(regex=, flag=)
|
被注释的元素必须符合指定的正则表达式,只能用在
String
类型上
|
@Range(min=,max=,message=)
|
被注释的元素必须在合适的范围内
|
@Size(min=, max=)
|
检查该字段的
size
是否在
min
和
max
之间,可以是字符串、数组、集
合、
Map
等
|
@URL(protocol=,host,port)
|
检查是否是一个有效的
URL
,如果提供了
protocol
,
host
等,则该
URL
还需满足提供的条件
|
Spring Boot中引入Maven依赖
Spring Boot 2.3之后的版本
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
全局异常处理
/**
* <mvc:annotation-driven>注册了ExceptionHandlerExceptionResolver处理@ExceptionHandler
* @ControllerAdvice + @ResponseBody
* 为所有Controller中的方法(@RequestMapping注解的方法)异常通知
* 当Controller的方法抛出异常后, 会被这个类中标记了 @ExceptionHandler的方法处理掉
*/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(RuntimeException.class)
public ResultVO handle(RuntimeException e) {
log.error(e.getMessage(), e);
return new ResultVO(500, e.getMessage(), "");
}
@ExceptionHandler(Exception.class)
public ResultVO handle(Exception e) {
log.error(e.getMessage(), e);
return new ResultVO(500, "系统异常!", "");
}
}
Spring Boot自定义方式处理静态资源
重新实现WebMvcConfigurer接口的addResourceHandlers()方法
@Configuration
public class MvcConfig implements WebMvcConfigurer {
/**
* <mvc:resources mapping="/files/**" location="/files/" />
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/files/**") // mapping属性
.addResourceLocations("file:d:/upload/et2304/");
}
}