Spring Boot自动配置原理
pre:Spring工厂加载机制
Spring SPI
Spring框架从3.2版本开始提供了SpringFactoriesLoader工厂加载机制,类似于Java提供的SPI机制,Spring利用这种机制实现了Spring Bean的自动配置
1:SpringFactoriesLoader是Spring框架内部的通用工厂加载机制(Spring3.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 注解导入一个 AutoConfigurationImportSelector 类型,这个类型实现了
ImportSelector 接口 的 selectImports() 方法 ,在这个方法中使用 Spring 工厂加载机制加载 classpath 下
META - INF 文件夹下的 spring.factories 文件中以 EnableAutoConfiguration 为 key 的所有 Value 值(自动配
置类),对 满足条件的类型 利用 Java Config 方式进行自动配置;
@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 地址 | |
@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/");
}
}