Day5 Springboot自动配置原理,Java Bean校验,全局异常处理,静态资源

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 注解导入一个 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
检查是否是一个有效的 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/");
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值