SpringBoot2核心功能(一)配置文件、web开发

11 篇文章 0 订阅

目录

一、配置文件

1.1 文件类型

1.1.1 properties

1.1.2 yaml

1.2 配置提示

二、web开发

2.1 SpringMVC自动配置概览

2.2 简单功能分析

2.2.1 静态资源访问

2.2.2 静态资源访问前缀

2.2.3 欢迎页支持

2.2.4 自定义 Favicon

2.2.5 静态资源配置原理

2.2.6 扩展知识——配置类只有一个有参构造器,则有参构造器所有参数的值都会从容器中确定

2.2.7 资源处理的默认规则

2.3 请求参数

2.3.1 注解

2.3.2 自定义对象参数——通过数据绑定原理

2.4 响应数据与内容协商

2.4.1 响应json——jackson.jar+@ResponseBody

2.4.2 内容协商——根据客户端接收能力的不同,返回不同类型的数据

2.5 拦截器

 


 

教案:https://www.yuque.com/atguigu/springboot/rg2p8g

 

一、配置文件

1.1 文件类型

1.1.1 properties

同以前的properties用法

1.1.2 yaml

YAML 是 "YAML Ain't Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。

 

非常适合用来做以数据为中心的配置文件

 

基本语法

  • key: value;kv之间有空格
  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • '#' 表示注释
  • 字符串无需加引号,如果要加,''与""表示字符串内容 会被 转义/不转义

 

数据类型

  • 字面量:单个的、不可再分的值。date、boolean、string、number、null
k: v
  • 对象:键值对的集合。map、hash、set、object
行内写法:  k: {k1:v1,k2:v2,k3:v3}
#或
k: 
  k1: v1
  k2: v2
  k3: v3
  • 数组:一组按次序排列的值。array、list、queue
行内写法:  k: [v1,v2,v3]
#或者
k:
 - v1
 - v2
 - v3

 

示例

@Data
public class Person {
    
    private String userName;
    private Boolean boss;
    private Date birth;
    private Integer age;
    private Pet pet;
    private String[] interests;
    private List<String> animal;
    private Map<String, Object> score;
    private Set<Double> salarys;
    private Map<String, List<Pet>> allPets;
}

@Data
public class Pet {
    private String name;
    private Double weight;
}

yaml表示以上对象

person:
  userName: zhangsan
  boss: false
  birth: 2019/12/12 20:12:33
  age: 18
  pet: 
    name: tomcat
    weight: 23.4
  interests: [篮球,游泳]
  animal: 
    - jerry
    - mario
  score:
    english: 
      first: 30
      second: 40
      third: 50
    math: [131,140,148]
    chinese: {first: 128,second: 136}
  salarys: [3999,4999.98,5999.99]
  allPets:
    sick:
      - {name: tom}
      - {name: jerry,weight: 47}
    health: [{name: mario,weight: 47}]

 

 

 

1.2 配置提示

自定义的类和配置文件绑定一般没有提示。加入下方的依赖,这样在编写yaml文件时,会和配置pring组件一样,产生提示信息。

<dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-configuration-processor</artifactId>
       <optional>true</optional>
 </dependency>

但是在打包时,如果不希望我们上述新增的配置处理器被打包到jar包中(我们不希望打出来的包太重了),可以使用下面的配置满足我们的需求

 <build>
   <plugins>
       <plugin>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-maven-plugin</artifactId>
           <configuration>
               <excludes>
                    <exclude>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-configuration-processor</artifactId>
                    </exclude>
                </excludes>
           </configuration>
        </plugin>
   </plugins>
</build>

 

 

 

 

二、web开发

 

2.1 SpringMVC自动配置概览

Spring Boot provides auto-configuration for Spring MVC that works well with most applications.(大多场景我们都无需自定义配置)

 

 

 

2.2 简单功能分析

 

2.2.1 静态资源访问

1、静态资源目录

只要静态资源放在类路径下:called /static (or /public or /resources or /META-INF/resources 访问 : 当前项目根路径/ + 静态资源名 就能访问到我们的静态资源。

 

 

2. 获取静态资源实现原理: 静态映射/**。

请求进来,先去找Controller看能不能处理。不能处理的所有请求,都交给静态资源去处理。

静态资源也找不到则响应404页面

 

改变默认的静态资源路径

spring:
  mvc:
    static-path-pattern: /res/**

  resources:
    static-locations: [classpath:/haha/]

 

 

2.2.2 静态资源访问前缀

默认无前缀。

如果需要配置前缀,可以在yaml文件中进行配置。下面的例子是给静态资源配置res前缀

spring:
  mvc:
    static-path-pattern: /res/**

 

 

配置静态资源得到指定存储路径(配置之后,将无法通过默认的路径获取静态资源)

 

 

 

2.2.3 欢迎页支持

  • 静态资源路径下  index.html
  • 可以配置静态资源路径,但是不可以配置静态资源的访问前缀。否则导致 index.html不能被默认访问
spring:
#  mvc:
#    static-path-pattern: /res/**   这个会导致welcome page功能失效

  resources:
    static-locations: [classpath:/haha/]
  • controller能处理/index

 

 

2.2.4 自定义 Favicon

favicon.ico 放在静态资源目录下即可。

 

 

2.2.5 静态资源配置原理

SpringBoot启动默认加载  xxxAutoConfiguration 类(自动配置类)

 

SpringMVC功能的自动配置类 WebMvcAutoConfiguration,在找到配置类后,需要看一下配置类是否生效。下面的源码,通过注解可以看出其生效了

@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class) //容器中没有这个WebMvcConfigurationSupport.class组件时,下面的配置才会生效
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
        ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {}

 

给容器中配了什么。

@Configuration(proxyBeanMethods = false)
@Import(EnableWebMvcConfiguration.class)
@EnableConfigurationProperties({ WebMvcProperties.class, ResourceProperties.class })
@Order(0)
public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {}

 

配置文件的相关属性和xxx进行了绑定。WebMvcProperties与spring.mvc进行了绑定ResourceProperties与spring.resources进行了绑定

 

 

 

2.2.6 扩展知识——配置类只有一个有参构造器,则有参构造器所有参数的值都会从容器中确定

//有参构造器所有参数的值都会从容器中确定
//ResourceProperties resourceProperties;获取和spring.resources绑定的所有的值的对象
//WebMvcProperties mvcProperties 获取和spring.mvc绑定的所有的值的对象
//ListableBeanFactory beanFactory Spring的beanFactory
//HttpMessageConverters 找到所有的HttpMessageConverters
//ResourceHandlerRegistrationCustomizer 找到 资源处理器的自定义器。=========
//DispatcherServletPath  
//ServletRegistrationBean   给应用注册Servlet、Filter....
public WebMvcAutoConfigurationAdapter(ResourceProperties resourceProperties, WebMvcProperties mvcProperties,
                ListableBeanFactory beanFactory, ObjectProvider<HttpMessageConverters> messageConvertersProvider,
                ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider,
                ObjectProvider<DispatcherServletPath> dispatcherServletPath,
                ObjectProvider<ServletRegistrationBean<?>> servletRegistrations) {
            this.resourceProperties = resourceProperties;
            this.mvcProperties = mvcProperties;
            this.beanFactory = beanFactory;
            this.messageConvertersProvider = messageConvertersProvider;
            this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizerProvider.getIfAvailable();
            this.dispatcherServletPath = dispatcherServletPath;
            this.servletRegistrations = servletRegistrations;
}

 

 

2.2.7 资源处理的默认规则

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
       if (!this.resourceProperties.isAddMappings()) {
                logger.debug("Default resource handling disabled");
                return;
       }
       Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
       CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
       //webjars的规则
       if (!registry.hasMappingForPattern("/webjars/**")) {
                customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
                        .addResourceLocations("classpath:/META-INF/resources/webjars/")
                        .setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
        }
            

        String staticPathPattern = this.mvcProperties.getStaticPathPattern();
        if (!registry.hasMappingForPattern(staticPathPattern)) {
                customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern)
                        .addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
                        .setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
        }
}
通过以下配置,可以导致上述倒吗中走入条件 this.resourceProperties.isAddMappings(),并打印出日志:静态资源访问已被禁用
​​​​​​​spring:
  resources:
    add-mappings: false   禁用所有静态资源规则
 

 

 

 

2.3 请求参数

 

2.3.1 注解

@PathVariable——用于获取路径参数

PathVariable用于获取请求路径中传入的变量值;可以根据变量名获取,也可以通过map将参数一次性全部获取。测试代码如下:

@RestController
public class ParameterTestController {
    @GetMapping("/car/{id}/owner/{username}")
    public Map<String, Object> getCar(@PathVariable("id") Integer id,
                                      @PathVariable("username") String name,
                                      @PathVariable Map<String, String> pv) {
        Map<String, Object> map = new HashMap<>();
        map.put("id", id);
        map.put("name", name);
        map.put("pv", pv);
        return map;
    }
}

 

 

@RequestHeader——用于获取请求头信息

测试代码如下:

@RestController
public class ParameterTestController {


    @GetMapping("/car/{id}/owner/{username}")
    public Map<String, Object> getCar(@PathVariable("id") Integer id,
                                      @PathVariable("username") String name,
                                      @PathVariable Map<String, String> pv,
                                      @RequestHeader("User-Agent") String userAgent,
                                      @RequestHeader Map<String, String> header) {
        Map<String, Object> map = new HashMap<>();
        map.put("id", id);
        map.put("name", name);
        map.put("pv", pv);
        map.put(" userAgent", userAgent);
        map.put("headers", header);
        return map;
    }


}

 

 

@RequestParam——获取请求参数

@RestController
public class ParameterTestController {

    @GetMapping("/car/{id}/owner/{username}")
    public Map<String, Object> getCar(@PathVariable("id") Integer id,
                                      @PathVariable("username") String name,
                                      @RequestParam Map<String, String> params) {
        Map<String, Object> map = new HashMap<>();
        map.put("id", id);
        map.put("name", name);
        map.put("params", params);
        return map;
    }


}

 

 

@RequestAttribute——获取请求域中的值

测试代码如下:

@Controller
class RequestController {
    @GetMapping("/goto")
    public String goToPage(HttpServletRequest request) {
        request.setAttribute("msg", "成功了...");
        request.setAttribute("code", 200);
        return "forward:/success"; //转发到 /success 请求
    }

    @ResponseBody
    @GetMapping("/success")
    public Map success(@RequestAttribute("msg") String msg,
                       @RequestAttribute("code") Integer code,
                       HttpServletRequest request) {
        Object msg1 = request.getAttribute("msg");
        Map<String, Object> map = new HashMap<>();
        map.put("reqMethod_msg", msg1);
        map.put("annotation_msg", msg);
        return map;
    }
}

 

 

 

@CookieValue——获取cookie的值

@RestController
public class ParameterTestController {

    @GetMapping("/car/{id}/owner/{username}")
    public Map<String, Object> getCar(@PathVariable("id") Integer id,
                                      @PathVariable("username") String name,
                                      @RequestParam Map<String, String> params,
                                      @CookieValue(" _ga") String _ga,
                                      @CookieValue("_ ga") Cookie cookie) {
        Map<String, Object> map = new HashMap<>();
        map.put("id", id);
        map.put("name", name);
        map.put("params", params);
        return map;
    }
}

 

 

 

@RequestBody——获取post请求体的值

@RestController
public class ParameterTestController {
    @PostMapping("/save")
    public Map postMethod(@RequestBody String content) {
        Map<String, Object> map = new HashMap<>();
        map.put(" content", content);
        return map;
    }
}

 

 

 

2.3.2 自定义对象参数——通过数据绑定原理

可以自动类型转换与格式化,可以级联封装。

 

 

 

 

2.4 响应数据与内容协商

 

2.4.1 响应json——jackson.jar+@ResponseBody

环境配置

需要引入以下依赖

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

该依赖中帮我们引入了starter-json

starter-json主要使用了jackson来处理依赖

 

 

示例代码

@Controller
public class ResponseTestController {

    @ResponseBody
    @GetMapping("/test/person")
    public User getUser() {
        User user = new User();
        user.setAge(10);
        user.setName("rudy");
        return user;
    }
}

 

 

 

2.4.2 内容协商——根据客户端接收能力的不同,返回不同类型的数据

1、引入xml依赖

<dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

引入依赖之后,优先返回xml格式的数据

 

原理

客户端发送请求时,请求头中携带的Accept字段对应的值控制了服务端的返回值信息:

  • application/json时,返回的是json格式的数据
  • application/xml时,返回的是xml格式的数据

 

 

2.  原理

1、判断当前响应头中是否已经有确定的媒体类型。MediaType

2、获取客户端(PostMan、 浏览器 Accepte请求头字段) [application/xml]

3、遍历循环所有当前系统的MessageConverter,看谁支持操作这个对象(Person)

4、找到支持操作Person的converter, 把converter支 持的媒体类型统计出来。

5、客户端需要[application/xml] 。服务端能力[10种、json. xml]

6、进行内容协商的最佳匹配媒体类型

7、用支持将对象转为最佳匹配媒体类型的converter。调用它进行转化。

 

 

 

3. 其他——可以开启基于请求参数的内容协商

spring:
    contentnegotiation:
      favor-parameter: true  #开启请求参数内容协商模式

发请求:

 

 

 

2.5 拦截器

https://www.cnblogs.com/black-spike/p/7813238.html

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 是一个用于构建独立的、生产级别的 Spring 应用程序的框架。它简化了 Spring 应用程序的开发过程,提供了一种快速、灵活和可扩展的方式来构建应用程序。 Spring Boot 的核心功能包括: 1. 自动配置:Spring Boot 根据应用程序的依赖和配置,自动配置各种常见的功能,如数据库连接、Web 容器等。开发人员只需添加相应的依赖和配置,即可快速搭建起一个可运行的应用程序。 2. 起步依赖:Spring Boot 提供了一系列预定义的依赖,称为起步依赖(Starter Dependencies),用于简化应用程序的构建和配置。开发人员只需添加相应的起步依赖,即可获得所需功能的所有依赖项。 3. 嵌入式容器:Spring Boot 内置了多个嵌入式容器,如Tomcat、Jetty等,可以将应用程序打包成一个可执行的 JAR 文件,并直接运行,无需部署到外部容器。 4. 简化配置:Spring Boot 提供了一种简化的配置方式,通过 application.properties 或 application.yml 文件来配置应用程序的属性。开发人员可以集中管理应用程序的配置,而无需编写大量的 XML 配置文件。 5. 健康检查:Spring Boot 提供了健康检查的功能,可以通过访问 /actuator/health 端点来检查应用程序的健康状态。开发人员可以自定义健康检查的规则,并监控应用程序的运行状态。 6. 监控和管理:Spring Boot 集成了 Actuator 模块,提供了对应用程序的监控和管理功能。通过访问 /actuator 端点,可以获取应用程序的各种信息,如内存使用情况、线程池状态等。 7. 异常处理:Spring Boot 提供了统一的异常处理机制,可以捕获应用程序中的异常,并返回统一的错误信息。开发人员可以自定义异常处理器,实现对不同类型的异常进行处理。 8. 日志管理:Spring Boot 集成了常见的日志框架,如Logback、Log4j等,可以方便地进行日志记录和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值