springboot

springboot优缺点
优点:
1.容易上手,自动starter依赖,简化配置提升开发效率,为spring开发提供一个更快、更广泛的入门体验。
2.无代码生成,不需要XML配置。
3.内嵌服务器,安全管理,运行数据监控、运行状况检查和外部化配置。
4.避免大量的maven导入和各种版本冲突。
缺点:
1.版本更新太快。2.封装太深,不易精通。

所有场景启动器最底层的依赖:

<dependency> 
	<groupId>org.springframework.boot</groupId> 
	<artifactId>**spring-boot-starter**</artifactId> 
	<version>2.3.4.RELEASE</version> 
	<scope>compile</scope> 
</dependency>

给容器中添加组件:
1.@Configuration+@Bean
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
@Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例

@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有。保持组件单实例
Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】

最佳实战配置
类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式

2.@Import({User.class, DBHelper.class}) //可以创建自己写的类,也可以是系统的类。
给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
@Import注解只能用在类上。且需要和@Component或@Configuration配合使用
3.@Component、@Controller、@Service、@Repository、@@ComponentScan

条件装配:@Conditional 满足Conditional指定的条件,则进行组件注入
在这里插入图片描述
@Conditional 如果作用在方法上,条件成立,这个方法返回的组件才能注册到容器中。
@Conditional如果作用在类上,条件成立,类中的所有组件都会注册到容器中。

原生配置文件引入 @ImportResource
@ImportResource(“classpath:beans.xml”)
可以导入原来定义好的配置文件

配置绑定
1.@ConfigurationProperties+ @Component
@ConfigurationProperties(prefix = “mycar”) //application.properties中mycar开头的配置可以被加载
只有在容器中的组件,才会拥有SpringBoot提供的强大功能 所以还需要一个 @Component注解
2.@EnableConfigurationProperties + @ConfigurationProperties
@EnableConfigurationProperties必须在配置类上
示例:@EnableConfigurationProperties(Car.class)
这个注解的两个作用:1、开启Car配置绑定功能。2、把这个Car这个组件自动注册到容器中
配置类

@ConfigurationProperties(prefix = "lzp")
@Data
public class testconfig {
    String name;
}

配置文件
在这里插入图片描述
测试类

@SpringBootTest
@EnableConfigurationProperties(testconfig.class)
public class testconfig {
    @Value("${lzp.name}")
    String name;

    @Test
    void contextLoads() {
        System.out.println(name);
    }
}

结果
在这里插入图片描述
从Spring Boot 2.2 开始,Spring通过类路径扫描查找并注册@ConfigurationProperties类。因此,不需要使用@Component(以及其他元注释,如@Configuration) 来注释此类类,甚至不需要使用@EnableConfigurationProperties

1.自动配置原理

@SpringBootApplication包含三个注解
在这里插入图片描述
(1)、@SpringBootConfiguration。代表当前是一个配置类
(2)、@CompentScan。指定扫描哪些包(默认是启动类所在的包及子包)
(3)、@EnableAutoConfiguration(自动配置功能主要的注解)
@EnableAutoConfiguration中包含两个注解
(1)@AutoConfigurationPackage(自动配置包)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

传入AnnotationMetadata类型的 metadata,获取到当前注解标注在哪个类上(主启动类)。
通过register()方法注册当前主启动类所在的包下的所有组件
(2)@Import(AutoConfigurationImportSelector.class)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
在这里插入图片描述
133个(2.6.2版本)
在这里插入图片描述
默认这133个自动配置全部加载。
按照条件装配规则(@Conditional),最终会按需配置。
总结:
SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
生效的配置类就会给容器中装配很多组件
只要容器中有这些组件,相当于这些功能就有了
定制化配置
用户直接自己@Bean替换底层的组件
用户去看这个组件是获取的配置文件什么值就去修改。
xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 ----> application.properties

2web开发

引入web-starter会自动引入SpringMVC和TomCat
SpringBoot启动默认加载 xxxAutoConfiguration 类(自动配置类)
SpringMVC功能的自动配置类 WebMvcAutoConfiguration,生效
在这里插入图片描述
在这里插入图片描述
配置文件的相关属性和xxx进行了绑定。WebMvcPropertiesspring.mvc、ResourcePropertiesspring.resources
在这里插入图片描述
只有一个有参构造器
//有参构造器所有参数的值都会从容器中确定
2 //ResourceProperties resourceProperties;获取和spring.resources绑定的所有的值的对象
3 //WebMvcProperties mvcProperties 获取和spring.mvc绑定的所有的值的对象
4 //ListableBeanFactory beanFactory Spring的beanFactory
5 //HttpMessageConverters 找到所有的HttpMessageConverters
6 //ResourceHandlerRegistrationCustomizer 找到 资源处理器的自定义器。=========
7 //DispatcherServletPath
8 //ServletRegistrationBean 给应用注册Servlet、Filter…
静态资源处理的默认规则
在这里插入图片描述
先判断isaddmapping,是否进行了资源绑定,默认是true。改为false的话,静态资源就无法访问了。
然后通过getStaticLocations获取静态资源的路径
在这里插入图片描述
默认是这4个。
欢迎页的规则
在这里插入图片描述
在这里插入图片描述
HandlerMapping:处理器映射。保存了每一个Handler能处理哪些请求。
REST使用与原理
在这里插入图片描述
主要针对表单提交请求。
@xxxMapping; Rest风格支持(使用HTTP请求方式动词来表示对资源的操作)
以前:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户
现在: /user GET-获取用户 DELETE-删除用户 PUT-修改用户 POST-保存用户
核心Filter;HiddenHttpMethodFilter
用法: 表单method=post,隐藏域 _method=put
SpringBoot中需要手动开启,默认是不开启的
spring:
mvc:
hiddenmethod:
filter:
enabled: true #开启页面表单的Rest功能
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

表单提交会带上_method=PUT
请求过来被HiddenHttpMethodFilter拦截
请求是否正常,并且是POST
获取到_method的value的值。
兼容以下请求;PUT.DELETE.PATCH
原生request(post),
包装模式requesWrapper重写了getMethod方法,返回的是传入的值。也就是PUT
过滤器链放行的时候用wrapper。以后的方法调用getMethod是调用requesWrapper的。

//自定义filter
在这里插入图片描述
返回自定义的OrderedHiddenHttpMethodFilter

//自定义filter 
@Bean 
public HiddenHttpMethodFilter hiddenHttpMethodFilter(){  
	HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter(); 
	methodFilter.setMethodParam("_m"); 
	return methodFilter; 
 }

请求路径映射
最原始:doGet 会调用processRequest,processRequest会调用doService,DispatcherServlet类中做doService的实现,在doService中调用doDispatch(每个请求都会调用)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
先判断handlerMappings(处理器映射)是否为空,不为空的话就遍历
在这里插入图片描述
RequestMappingHandlerMapping:保存了所有@RequestMapping 和handler的映射规则。有5个

SpringBoot自动配置欢迎页的 WelcomePageHandlerMapping 。访问 /能访问到index.html;
SpringBoot自动配置了默认 的 RequestMappingHandlerMapping
RequestMappingHandlerMapping映射了所有方法上标注了@RequestMapping、@GetMapping、@PutMapping、@DeleteMapping、@PostMapping的方法。根据过来的请求决定调用哪个方法处理。
怎么知道哪个请求调用哪个方法处理?
请求进来,挨个尝试所有的HandlerMapping看是否有请求信息。
如果有就找到这个请求对应的handler
如果没有就是下一个 HandlerMapping

请求参数解析
@PathVariable、//获取路径变量(‘/’后边的’{}'里边的值)
在这里插入图片描述
pv可以获取id和name 一起获取。

@RequestHeader、//获取请求头
在这里插入图片描述
带key:比如User-Agent 只获取User-Agent这一项。
不带key:获取所有的请求头。
@RequestAttribute、//获取请求中的参数。然后进行页面跳转。(setAttribute之后)
也可以用 httpserveletRequest的getAttribute方法。

在这里插入图片描述
在这里msg和msg1的内容是一样的。

RedirectAttributes:重定向传参
在这里插入图片描述

@RequestParam、//获取请求路径中的某个值(?后边的值)
在这里插入图片描述
在这里插入图片描述
可以获取单个参数的值
可以获取单个参数的多个值
可以获取所有参数的值

@MatrixVariable、//获取矩阵变量的值
SpringBoot默认是禁用了矩阵变量的功能
removeSemicolonContent(移除分号内容)支持矩阵变量的。
想要开启,配置类中实现接口,重写一个方法
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
此时,path是sell 矩阵变量也可以被解析
@CookieValue、//获取cookie的值
@RequestBody //获取请求体中数据,封装为对象
在这里插入图片描述
也可以解析不同的路径后边的矩阵变量
在这里插入图片描述

一个请求的处理过程
HandlerMapping中找到能处理请求的Handler(Controller.method())
1.为当前Handler 找一个适配器 HandlerAdapter;
RequestMappingHandlerAdapter 适配器执行目标方法并确定方法参数的每一个值
doDispatch中:
在这里插入图片描述

在这里插入图片描述
我们标注的requestMapping注解的方法,会找到第一个适配器。
2.执行目标方法
参数解析器-HandlerMethodArgumentResolver
// Actually invoke the handler.
//DispatcherServlet – doDispatch
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
mav = invokeHandlerMethod(request, response, handlerMethod); //执行目标方法

在这里插入图片描述
3.参数值解析器:确定将要执行的目标方法的每一个参数的值是什么;
在这里插入图片描述
4.返回值解析器,确定返回的参数
在这里插入图片描述
然后执行目标方法,也就是接收请求的方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5.确定目标方法每一个参数的值
在这里插入图片描述

先判断所有参数解析器哪个可以解析这个参数
在这里插入图片描述

在这里插入图片描述
调用各自 HandlerMethodArgumentResolver 的 resolveArgument 方法即可
在这里插入图片描述

6.目标方法执行完成
ServletInvocableHandlerMethod类中在这里插入图片描述

将所有的数据都放在 ModelAndViewContainer;包含要去的页面地址View。还包含Model数据(Map、Model都算)。
在这里插入图片描述
7、处理派发结果
DispatcherSevelet类中:
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
然后调用render方法(渲染)
在这里插入图片描述
然后调用view.render
在这里插入图片描述
然后调用createMergedOutputModel方法
在这里插入图片描述
然后
在这里插入图片描述
然后渲染合并输出的模型数据
在这里插入图片描述
暴露模型作为请求域属性,把model的数据加到request域中
在这里插入图片描述

请求参数中有ServeltAPI
在这里插入图片描述
复杂参数
重定向redirect和转发forward
转发:是在服务器内部控制权的转移,是由服务器区请求,客户端并不知道是怎样转移的,因此客户端浏览器的地址不会显示出转向的地址。
​重定向:是服务器告诉了客户端要转向哪个地址,客户端再自己去请求转向的地址,因此会显示转向后的地址,也可以理解浏览器至少进行了两次的访问请求。

重定向的流程:

​ 浏览器发送请求->服务器运行->响应请求------->,返回给浏览器一个新的地址与响应码,浏览器进行判断为重定向,自动发送一个新的请求给服务器,请求地址为刚刚服务器发送给浏览器的地址。服务器运行->响应请求

转发的流程:

​ 发送请求 -->服务器运行–>进行请求的重新设置,例如通过request.setAttribute(name,value)–>根据转发的地址,获取该地址的网页–>响应请求给浏览器

地址栏
转发:不变,不会显示出转向的地址
重定向:会显示转向之后的地址

请求
转发:一次请求
重定向:至少提交了两次请求

数据
转发:对request对象的信息不会丢失,因此可以在多个页面交互过程中实现请求数据的共享
重定向:request信息将丢失

Map、Model(map、model里面的数据会被放在request的请求域 request.setAttribute,转发存在request中)、Errors/BindingResult、RedirectAttributes( 重定向携带数据)、ServletResponse(response)、SessionStatus、UriComponentsBuilder、ServletUriComponentsBuilder。

1 Map<String,Object> map, Model model, HttpServletRequest request 都是可以给request域中放数据,
2 request.getAttribute(); (获取)
在这里插入图片描述
这两个参数处理器处理。
在这里插入图片描述
Map、Model类型的参数,会返回 mavContainer.getModel();—> BindingAwareModelMap 是Model 也是Map mavContainer.getModel(); 获取到值的
map model的处理方式一样。
在这里插入图片描述
在这里插入图片描述

自定义类型参数 封装POJO
ServletModelAttributeMethodProcessor 这个参数处理器支持
1.先判断是否为简单类型,自定义的对象肯定不是。
在这里插入图片描述
2.将请求中的数据绑定到对象
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
WebDataBinder binder = binderFactory.createBinder(webRequest, attribute, name);
WebDataBinder :web数据绑定器,将请求参数的值绑定到指定的JavaBean里面
WebDataBinder 利用它里面的 Converters 将请求数据转成指定的数据类型。再次封装到JavaBean中

GenericConversionService:在设置每一个值的时候,找它里面的所有converter那个可以将这个数据类型(request带来参数的字符串)转换到 指定的类型(JavaBean – Integer) byte – > file

在这里插入图片描述
在这里插入图片描述
未来我们可以给WebDataBinder里面放自己的Converter;
private static final class StringToNumber implements Converter<String, T>
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值