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容器中使用.

springboot 等待部分bean加载完成后执行_java

 Spring Boot 2.7.0之后的版本

springboot 等待部分bean加载完成后执行_java_02

 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/");
}
}