SpringBoot日常知识整理

本文详细介绍了SpringBoot的关键特性,包括项目管理工具Maven或Gradle,启动方式,@SpringBootApplication注解的作用,以及如何自定义SpringMVC配置。还涉及到了RestTemplate的使用,过滤器、拦截器的原理,数据绑定,事务管理和字符串编码转换。此外,探讨了前后端分离的重定向,SpringBootCLI,CommandLineRunner,以及数据验证@Validated和@Valid的差异和使用方法。最后,解释了SpringBoot启动参数-D与--的用途。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot日常知识整理


一、项目管理工具

SpringBoot项目使用Maven/gradle作为项目管理工具,pom.xml与settings.gradle为各自的项目管理文件。主要作用为1、统一开发规范与工具 , 2、统一管理jar包

二、SpringBoot启动

SpringBoot通过main方法所在类文件开启SpringBoot项目,通过注释@SpringBootApplication启动其他SpringBoot自动配置与按规则自定义的信息。

三、@SpringBootApplication注释内容

@SpringBootApplication内主要有@ComponentScan与@EnabledAutoConfigure两个注释,前者能能扫到当前包下所有配置类与组件,后者能开启SpringBoot的自动配置功能。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {


 


四、SpringBoot具有默认SpringMVC配置信息

要让SpringBoot默认的SpringMVC相关配置信息无效,则在配置自定义SpringMVC的配置类(继承WebMvcConfigurer)上使用@EnableWebMVC注释即可

五、后端发送请求对象RestTemplate

使用RestTemplate需要引入相关依赖。

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.6</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>


引入依赖包后,SpringBoot只自动配置了RestTemplateBuilder相关基础组件,而未生成RestTemplate;

为了导入RestTemplate组件需要通过builder.build()创建。
若需要拓展,如修改连接与超时时间等,可通过设置
ClientHttpRequestFactory、httpClientBuilder、HttpClientConnectionManager组件;

依赖关系为RestTemplate->ClientHttpRequestFactory->httpClientBuilder->HttpClientConnectionManage。

六、反射应用:

可以通过反射方式为对象按照属性名设置值、为对象按照方法名执行。可在http请求与响应中通过解析器进行参数或响应值进行转换对象设置。

七、参数数据绑定:

控制器中对没有注释标注的参数,都会经过参数数据绑定,在Spring执行过程中通过ServletRequestDataBinder进行数据与Request参数数据绑定。对有注释标注的参数,则会通过对应解析器进行数据绑定。SpringMVC支持自定义解析器,自定义解析器可通过实现HandlerMethodArgumentResolver接口组件完成数据绑定。

八、过滤器:


过滤器对响应报文的头部字段进行修改只能在chain.doFilter之前,之后不可对响应报文的头部字段进行修改,但可对响应报文体修改。因controller方法执行完毕后响应报文状态即设置为了commited,hearder固定。

@WebFilter:标注过滤器,指定过滤路径与过滤器名称。
@ServletComponentScan:扫描过滤器等Servlet容器组件,使Servlet容器下的过滤器组件在Spring下生效。
@Component:标注过滤器,声明将过滤器交由Spring容器管理。

//过滤器无需手动设置过滤器注入
@Component
@WebFilter(filterName = "file", urlPatterns = "/filter")
public class myTestFilter implements Filter{
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
 }


 

九、拦截器:

//拦截器需通过WebMvcConfigurer的addInterceptors设置拦截器注入
public class testInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }
}


 

十、过滤器、拦截器、解析器中的request、response:

request、response是同一个;并且更改SpringMVC流程中的的request、response会直接改变后面流程中的reuqest、response(如:更改chain.doFilter(request,response,chain)中request与response)

十一、过滤器、拦截器、解析器中的request、response为什么是同一个的源码流程解析:

通过SpringBoot框架源码预览可以看出过滤器链filterChain.doFilter执行到完成所有过滤器的执行,将其中的HttpServletRequest与HttpServletResponse交由Servlet容器执行器service方法(进入Spring容器层次),故可以在filterchain中通过doFilter的request与response替换完成NativeRequest与NativeResponse更改。

使用:拦截器与过滤器将请求拦截下来,响应依然可以响应,只不过后续处理不执行而已。抛出异常可通过@ControllerAdvice进入异常处理。

十二、SpringBoot中事务:

在Spring Boot中,当我们使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖的时候,框架会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager。所以我们不需要任何额外 配置就可以用@Transactional注解进行事务的使用(使用Mybatis下则导入spring-boot-starter-jdbc依赖)。

事务只针对存在的数据源生效。SpringBoot使用@EnableTransactionManagement注释启动事务管理。当@Transactional标注的方法内抛出异常,则当前事务中执行的数据源操作将回滚。

十三、Java:字符串编码转换:

Java下可以进行字符串编码转换,通过String字符串作为中间介。不过不是所有字符串编码都可以进行转换,比如GBK与UTF-8编码可以进行字符串转换,而UTF-8与ISO_8859_1无法进行字符串转换,会出现字符串显示乱码。

需要额外注意,java字符串默认字符编码是由本地windows的语言地域里的设定决定,而非固定。本地测试得到的默认字符串编码为UTF-8。

//字符串编码转换测试代码示例
    @org.junit.Test
    public void test3() {
        String str1 = "你好";
        try {
            byte[] b0 = str1.getBytes();
            byte[] b = str1.getBytes("GBK");
            String str2 = new String(b, "GBK");
            byte[] b1 = str2.getBytes(StandardCharsets.UTF_8);
            String str3 = new String(b1, StandardCharsets.UTF_8);
            byte[] b2 = str2.getBytes(StandardCharsets.ISO_8859_1);
            String str4 = new String(b2, StandardCharsets.ISO_8859_1);
            System.out.println(b1 + str3 + " " + b + " " + str2 + b2 + "" + str4);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            System.out.println("编码解码失败");
        }
    }



运行结果:

十四、前后端分离 后台重定向地址:

对于HttpServletResponse  response响应,直接使用
response.sendRedirect("http://www.baidu.com");即可完成重定向。

十五、Spring Boot CLI:


Spring Boot CLI是SpringBoot的命令行工具,通过命令行能快速安装、启动与配置Spring Boot项目。也就是说,SpringBoot的开发可以不使用IDE。

然而,使用SpringBoot CLI开发比使用IDE复杂且可视化程度低,因此普通程序员通过IDE开发能更加专注于业务代码的实现,减少对项目较低层层面的关注。

十六、SpringBoot中的CommendLineRunner类:

在Springboot启动中,会对上下文中所有的CommendLineRunner类型对象执行启动的run方法。通过@Order进行顺序的排列执行。

应用:要想在SpringBoot启动时执行一些操作,既可以使用@PostConstruct标注相应执行方法,也可以创建CommendLineRunner接口的方法类重写run方法实现。

十七、SpringBoot中数据校验@Validated与@Valid:

SpringBoot数据校验使用@Validated或者@Valid。

@Validated与@Valid标注在形参、类、方法上用于进行类对象字段验证的操作。待验证的类对象字段上需标注相应验证注释,如@NotEmpty、@NotBlank、@NotNull等.

@Valid属于JAVA拓展包下的注释,用于满足JSR-303验证规范。
@Validated属于Spring包下对@Valid拓展的注释,包含@Valid的所有功能,增加了对分组验证的支持。

@Valid使用:


1、引入pom依赖:依赖版本好必须保持一致

有两种依赖引入方式

1.1、


        <dependency>
            <groupId>jakarta.validation</groupId>
            <artifactId>jakarta.validation-api</artifactId>
            <version>2.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.16.Final</version>
        </dependency>


 

1.2、SpringBoot已对依赖版本一致进行封装,其中包含上面两依赖以及版本对应:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>


 

2、验证字段标明注释:

import lombok.Data;

import javax.validation.constraints.*;

@Data
public class ValidObject {

    @NotBlank
    @Size(min = 4, max = 15)
    private String id;

    @Max(100)
    @Min(0)
    private Integer age;

    @NotNull
    private String name;

    @Email
    private String email;
}


3、编写全局验证异常处理类:
 

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public String handleException(Exception e){
        return "全局异常处理器处理valid验证异常";
    }
}

4、编写RequestBody对象验证控制器
4.1、通过全局异常处理器处理验证异常:

import com.example.abilitymodulesummary.validations.ValidObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

@Slf4j
@RestController
public class ValidController {

    @RequestMapping("/validtest/valid")
    public String validController(@RequestBody @Valid ValidObject validObject){
        return "验证valid";
    }
}



4.2、若不打算通过异常处理处理验证异常,可通过绑定BindResult对验证结果进行处理:

import com.example.abilitymodulesummary.validations.ValidObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;

@Slf4j
@RestController
public class ValidController {

    @RequestMapping("/validtest/valid")
    public String validController(@RequestBody @Valid ValidObject validObject, BindingResult bindingResult){
        log.info("控制器内验证valid开始");
         return "控制器内验证valid结束,验证结果是否有错误:"+(bindingResult.hasErrors()?"有":"无");
    }
}


 

5、验证示例:
切换到全局异常处理器处理异常,对4.1验证:


控制器内部处理验证异常,对4.2验证:


@Validated使用:


1、引入pom依赖:


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>



或者

        <dependency>
            <groupId>jakarta.validation</groupId>
            <artifactId>jakarta.validation-api</artifactId>
            <version>2.0.2</version>
        </dependency>
        <!-- hibernate validator-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.16.Final</version>
        </dependency>


 

2、验证字段标明注释:

import lombok.Data;

import javax.validation.constraints.*;

@Data
public class ValidatedObject {

    @NotBlank(message = "id不能为空白",groups = {first.class,second.class,third.class})
    @Size(min = 4, max = 15,groups = {first.class,second.class,third.class})
    private String id;

    @Max(value = 100,groups = second.class)
    @Min(value = 0,groups = second.class)
    private Integer age;

    @NotNull(message = "name不能为null",groups = third.class)
    private String name;

    @Email(message = "email必须满足邮箱格式",groups = third.class)
    private String email;

    public interface first{};

    public interface second{};

    public interface third{};

}


 

3、编写全局验证异常处理类:.
 

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public String handleException(Exception e){
        return "全局异常处理器处理valid验证异常";
    }
}

4、编写RequestBody对象验证控制器
4.1、通过全局异常处理器处理验证异常:

import com.example.abilitymodulesummary.validations.ValidatedObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class ValidatedController {

    @RequestMapping("/validtest/validated")
    public String validatedController(@RequestBody @Validated({ValidatedObject.first.class, ValidatedObject.second.class, ValidatedObject.third.class}) ValidatedObject validatedObject){

        log.info("控制器内验证validated开始");
        return "控制器内验证validated结束,验证结果是否有错误:";
    }
}



4.2、若不打算通过异常处理处理验证异常,可通过绑定BindResult对验证结果进行处理:


import com.example.abilitymodulesummary.validations.ValidatedObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@Slf4j
@RestController
public class ValidatedController {

    @RequestMapping("/validtest/validated")
    public String validatedController(@RequestBody @Validated({ValidatedObject.first.class, ValidatedObject.second.class, ValidatedObject.third.class}) ValidatedObject validatedObject, BindingResult result){

        log.info("控制器内验证validated开始");
        return "控制器内验证validated结束,验证结果是否有错误:"+result.hasErrors();
    }
}


5、验证示例:
切换到全局异常处理器处理异常,对4.1验证:

控制器内部处理验证异常,对4.2验证:

十八、SpringBoot中启动参数-D与--作用:

-D与--作用相同,都是配置属性值,即如同在Application.properties文件中配置属性值;如-DSpring.profile.active=dev等同于--Spring.profile.active=dev。-D在jar包前配置才有效,--在jar包后配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅尝即止何来突破

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值