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文件格式

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

被折叠的 条评论
为什么被折叠?



