Springboot

本文详细介绍了Spring Boot的自动配置机制,包括配置类、Bean的自动注入、条件注解@Conditional以及如何将类中的属性与配置文件绑定。同时,讨论了复杂参数的处理、对象绑定过程,以及数据响应与内容协商机制,如如何根据需求选择合适的响应格式。

1.自动扫描主程序下的所有包(aoc容器)

  

2.依赖继承,版本仲裁

3.自动配置(就是已经都自带jar包了,只要导入spring-boot-xx就自动配置依赖)

配置类

 Bean的自动注入

 

 true使用代理,得到的都是单实例对象(有容器检查,容器里有的就用容器里的)

false得到的新的对象(跳过容器检查,直接new)

(一般不存在注册依赖的情况(一个bean依赖调用另一个bean)就改成false)

可以用配置类生成bean,也可以直接注解注入(service,repository,component,controller啥的)

@import,写在组件上方(容器里的对象)

将指定类型组件传入

 

 @Conditional

 当组件容器满足条件时执行:

 当容器中有tom的时候,下面才注入

 将目标的spring配置文件全部注入

将类中的属性与配置文件绑定

 第二种方法(会注入car并且开启car的属性配置)(有时候导入的第三方包没有注入,可以这边自己注入)

 也就是所有的配置文件都导入了,但是根据有config注解来判断有没有这个类来表示有没有自动配置;

也就是只需要类名(文件上传解析器满足)就算名字不满足,也可以生效

 用户优先原则每一个主键都绑定了自己的配置文件,这个配置文件又和主配置文件绑定

doService方法,请求映射,会扫描所有的servlet的url进行匹配分发 

 

 

package com.cskaoyan.controller;
import com.sun.org.glassfish.gmbal.ParameterNames;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @author looper
 * @
 **/
@RestController
public class HelloController {

    @RequestMapping("/bug.jpg")
    public String hello() {
        return "aaa";
    }

    //    @RequestMapping(value = "/user",method = RequestMethod.DELETE)
    @DeleteMapping("/user")
    public String delUser(Integer id) {
        return "删除,delete" + id;
    }

    //    @RequestMapping(value = "/user",method = RequestMethod.PUT)
    @PutMapping("/user")
    public String putUser(@RequestParam("id") Integer id) {
        return "修改,put" + id;
    }

    @GetMapping("/user/{id}/owner/{username}")
    public Map getUser(@PathVariable("id") Integer id,
                       @PathVariable("username") String name,
                       @PathVariable Map<String, String> pv,
                       @RequestHeader Map<String, String> head) {
        Set<String> keySet = head.keySet();
        for (String s : keySet) {
            System.out.println(s + ":" + head.get(s));
        }
        HashMap<String, Object> map = new HashMap<>();
        map.put("id", id);
        map.put("username", name);
        map.put("pv", pv);
        return map;
    }

    @PostMapping("/user")
    public String postUser(@RequestBody String s) {

        return s;

    }

}

参数解析过程:(@parammeter等等)

        1.先找到service,遍历,分发给对应方法(从容器中取得对象)

        2.遍历所有参数的注解.查看是否支持该注解

        3.对应遍历26种注解解析器,一一对应,找到匹配的注解(并且将判断结果放置缓存之中)

        3.(从缓存中取得解析结果)解析器开始解析:1.取得参数名字;取得各种信息(如果要请求头,就请求头解析器取得,如果要参数就uri解析器解析取得),2.将解析的结果,返回(比如是路径参数解析器,就吧解析的uri结果并且放入到requst域之中(比如要id,直接从请求域中拿到id),然后返回给写的integer id)

参数是:servletapi,就是如下解析器

注:形参传入session等等方法,同3.遍历所有的类型查看是否匹配(传入@modelAttribute,Reponsebody也在这里) 4.匹配到对应类型之后解析完毕(解析结果缓存放入)(取出缓存),执行对应的方法(大多数的情况都是:分发请求,从容器取得对象,(之后根据解析器不同出现分支),分支结束之后执行对应方法),举例:如果是session,调用方法返回一个session给到传入的形参;

一句话总结:注解的参数,会与传入的请求中的参数匹配,返回(session也是,需要什么,括号形参填入什么,解析器就返回什么)

 复杂参数

  可以在形参,传入这些(map,model,request),相当于在请求域中放置属性;

同样先进行,参数解析,(map)解析为MapMethoprocessor(之后进行缓存步骤),然后返回一个bindingawareModelMap,(既是model又是map,他们俩的类型也都返回这个)

之后目标是方法put到请求域里,以及转发(如果有),就要调用模型视图解析器(ModelAndViewContainer)

模型视图解析器里(包含着model的操作(来源于map与model),放入要转发的对象(如果有的话))传入到modelAndView里,

 

 之后一系列操作后,将值转移到hashmap中,之后执行

通过这个方法,把每一个参数setAttribute 

一句话总结:map传入之后,底层调用的是mv,put就是遍历放进请求域中,然后调用mv的view来进行转发

传入对象绑定过程

 执行对应的方法(大多数的情况都是:分发请求,从容器取得对象,(之后根据解析器不同出现分支),分支结束之后执行对应方法),

使用的beanutils(因为传递依赖的就是map,填入的就是bean),还会进行数据格式的转换,然后反射

        --遍历对象的参数,与请求的参数一一匹配

细节如下:

 级联属性:

 4.数据响应与内容协商

 

 也就是,返回的时候,根据填写类型的不同,找到对应的解析器,然后进行返回(json啊,跳转啊,视图啊子类的)

有无responsebody注解,有就用json方式写出

==之后用消息转换器来转换数据

 

 消息转换器的写出操作:

 

 只要写了responsebody,以下类型都会通过返回值处理器进行处理

 返回文件资源

 

 内容协商

 拿到请求头,根据请求头的信息,返回对应的数据

基于请求参数的内容协商

1.设置

2.

 

 =============

Th:页面跳转

 

 注意名称空间

<html lang="en" xmlns:th="http://www.thymeleaf.org">

 

 

 

 

 

Starter配置依赖, parent继承依赖

替换依赖

 yaml文件格式

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值