• SpringBoot基础篇 (1)


    目录

    一、快速上手SpringBoot

    1.1 SpringBoot入门程序开发

    1.2 基于SpringBoot官网创建项目

    1.3 基于阿里云创建项目

    1.4 手动创建项目

    二、SpringBoot简介

    2.1 parent

    2.2 starter

    2.2.1 starter和parent的区别

    2.3 引导类

    2.4 内嵌tomcat

    2.4.1 内置服务器

    三、简单功能分析

    3.1 静态资源访问

    3.1.1 静态资源目录

    3.1.2 静态资源访问前缀

    3.1.3 webjar

    3.2 欢迎页支持

    3.3 自定义Favicon


    一、快速上手SpringBoot

    1.1 SpringBoot入门程序开发

            SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化SPring应用的初始搭建以及开发过程

    步骤:

    ①:创建新模块,选择Spring Initializr,并配置模块相关基础信息

    ②:选择当前模块需要使用的技术集

    ③:开发控制器类

    1. //Rest模式
    2. @RestController
    3. @RequestMapping("/books")
    4. public class BookController {
    5. @GetMapping
    6. public String getById(){
    7. System.out.println("Springboot is running...");
    8. return "Springboot is running...";
    9. }
    10. }

     ④:运行自动生成的Application类

    最简SpringBoot程序所包含的基础文件

    • pom.xml文件
    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <parent>
    6. <groupId>org.springframework.bootgroupId>
    7. <artifactId>spring-boot-starter-parentartifactId>
    8. <version>2.7.3version>
    9. <relativePath/>
    10. parent>
    11. <groupId>com.learngroupId>
    12. <artifactId>springboot_01_01quickstartartifactId>
    13. <version>0.0.1-SNAPSHOTversion>
    14. <name>springboot_01_01quickstartname>
    15. <description>springboot_01_01quickstartdescription>
    16. <properties>
    17. <java.version>1.8java.version>
    18. properties>
    19. <dependencies>
    20. <dependency>
    21. <groupId>org.springframework.bootgroupId>
    22. <artifactId>spring-boot-starter-webartifactId>
    23. dependency>
    24. <dependency>
    25. <groupId>org.springframework.bootgroupId>
    26. <artifactId>spring-boot-starter-testartifactId>
    27. <scope>testscope>
    28. dependency>
    29. dependencies>
    30. <build>
    31. <plugins>
    32. <plugin>
    33. <groupId>org.springframework.bootgroupId>
    34. <artifactId>spring-boot-maven-pluginartifactId>
    35. plugin>
    36. plugins>
    37. build>
    38. project>
    • Application类
    1. @SpringBootApplication
    2. public class Springboot0101quickstartApplication {
    3. public static void main(String[] args) {
    4. SpringApplication.run(Springboot0101quickstartApplication.class, args);
    5. }
    6. }
    • Spring程序与SpringBoot程序对比

     

    1.2 基于SpringBoot官网创建项目

    地址:https://start.spring.io/

     

    1.3 基于阿里云创建项目

    地址:https://start.aliyun.com

     

     

    1.4 手动创建项目

    ①手动导入坐标

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0modelVersion>
    6. <groupId>com.learngroupId>
    7. <artifactId>springboot_01_04_quickstartartifactId>
    8. <version>1.0-SNAPSHOTversion>
    9. <parent>
    10. <groupId>org.springframework.bootgroupId>
    11. <artifactId>spring-boot-starter-parentartifactId>
    12. <version>2.7.3version>
    13. <relativePath/>
    14. parent>
    15. <properties>
    16. <maven.compiler.source>8maven.compiler.source>
    17. <maven.compiler.target>8maven.compiler.target>
    18. properties>
    19. <dependencies>
    20. <dependency>
    21. <groupId>org.springframework.bootgroupId>
    22. <artifactId>spring-boot-starter-webartifactId>
    23. dependency>
    24. <dependency>
    25. <groupId>org.springframework.bootgroupId>
    26. <artifactId>spring-boot-starter-testartifactId>
    27. <scope>testscope>
    28. dependency>
    29. dependencies>
    30. project>

    ②手动制作引导类

    1. package com.learn;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. /**
    5. * @author 咕咕猫
    6. * @version 1.0
    7. */
    8. @SpringBootApplication
    9. public class Application {
    10. public static void main(String[] args) {
    11. SpringApplication.run(Application.class,args);
    12. }
    13. }

    二、SpringBoot简介

    SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发环境

    Spring程序缺点

    • 依赖配置繁琐
    • 配置繁琐

    SpringBoot程序优点

    • 起步依赖(简化依赖配置)
    • 自动配置(简化常用工程相关配置)
    • 辅助功能(内置服务器,....)

    2.1 parent

    2.2 starter

     一个starter里面包含了若干个依赖信息 

    2.2.1 starter和parent的区别

    starter

    • SpringBoot中常见项目名称,定义了当前项目使用的所有依赖坐标,以达到减少依赖配置的目的

    parent

    • 所有SpringBoot项目要继承的项目,定义了若干个坐标版本号(依赖管理,而非依赖),以达到减少依赖冲突的目的

    在实际开发中

    • 使用任意坐标是,仅书写GAV中的G和A,V由SpringBoot提供,除非SpringBoot未提供对应版本V
    • 如发生坐标错误,再指定Version(要小心版本冲突)

    parent和starter解决配置问题

    2.3 引导类

    • 启动方式
    1. @SpringBootApplication
    2. public class Springboot0102QuickstartApplication {
    3. public static void main(String[] args) {
    4. SpringApplication.run(Springboot0102QuickstartApplication.class, args);
    5. }
    6. }
    • SpringBoot的引导类是Boot工程的执行入口,运行main方法就可以启动项目
    • SpringBoot工程运行后初始化Spring容器,扫描引导类所在包加载Bean

    2.4 内嵌tomcat

    2.4.1 内置服务器

    • tomcat(默认)        apache出品,粉丝多,应用面广,负载了若干较重的组件
    • jetty                           更轻量级,但负载性能远不及tomcat
    • undertow                   undertow,负载性能勉强跑赢tomcat

    总结:

    • SpringBoot先加载所有的自动配置类,xxxxAutoConfiguration
    • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxxProperties和配置文件进行了帮i的那个
    • 生效的配置类就会给容器中装配很多组件
    • 只要容器中有这些组件,相当于这些功能就有了
    • 定制化配置

            ◇用户直接自己@Bean替换底层的组件

            ◇用户去看这个组件是获取的配置文件什么值就去修改

              xxxxAutoConfiguration----->组件----->xxxxProperties里面拿值----->application.properties

    三、简单功能分析

    3.1 静态资源访问

    3.1.1 静态资源目录

    只要静态资源放在当前项目的这几个类路径下:called /static(or /public or /resources or /META-INF/resources

    访问路径:当前项目根路径/ + 静态资源名

    原理:静态映射/**

    请求一进来,先去找Controller看能不能处理,不能处理的所有请求又都交给静态资源处理器。静态资源也找不到则响应404页面。

    可以改变默认的静态资源路径

    1. spring:
    2. mvc:
    3. static-path-pattern: /res/**
    4. resources:
    5. static-locations: [classpath:/haha/]

    3.1.2 静态资源访问前缀

    默认无前缀

    1. spring:
    2. mvc:
    3. static-path-pattern: /res/**

    当前项目 + static-path-pattern + 静态资源名 = 静态资源文件夹下找

    3.1.3 webjar

    自动映射 /webjars/**

    https://www.webjars.org/

    1. <dependency>
    2. <groupId>org.webjars</groupId>
    3. <artifactId>jquery</artifactId>
    4. <version>3.5.1</version>
    5. </dependency>

    访问地址:http://localhost:8080/webjars/jquery/3.5.1/jquery.js 后面地址要按照依赖里面的包路径

    3.2 欢迎页支持

    • 静态资源路径下 index.html

            ◇ 可以配置静态资源路径

            ◇ 但是不可以配置静态资源的访问前缀。否则导致 index.html不能被默认访问

    1. spring:
    2. # mvc:
    3. # static-path-pattern: /res/** 这个会导致welcome page功能失效
    4. resources:
    5. static-locations: [classpath:/haha/]
    • controller能处理 /index

    3.3 自定义Favicon

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

    1. spring:
    2. # mvc:
    3. # static-path-pattern: /res/** 这个会导致 Favicon 功能失效

    四、请求参数处理

    4.1 请求映射原理

    SpringMVC功能分析从org.springframework.web.servlet.DispatcherServlet--->doDispatch() 

    1. protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    2. HttpServletRequest processedRequest = request;
    3. HandlerExecutionChain mappedHandler = null;
    4. boolean multipartRequestParsed = false;
    5. WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    6. try {
    7. ModelAndView mv = null;
    8. Exception dispatchException = null;
    9. try {
    10. processedRequest = checkMultipart(request);
    11. multipartRequestParsed = (processedRequest != request);
    12. // 找到当前请求使用哪个Handler(Controller的方法)处理
    13. mappedHandler = getHandler(processedRequest);
    14. //HandlerMapping:处理器映射。/xxx->>xxxx

    RequestMappintHandlerMapping:保存了所有@RequestMapping和handler的映射规则

    所有的请求映射都阻碍HandlerMappint中

    •  SpringBoot自动配置欢迎页的WelcomePageHandlerMapping。访问 / 能访问到index.html
    • SpringBoot自动配置了默认的Request MappingHandlerMapping
    • 请求进来,挨个尝试所有的HandlerMapping看是否有请求信息

              ◇ 如果有就找到这个请求对应的handler

              ◇ 如果没有就是下一个HandlerMapping

    • 我们需要一些自定义的映射处理,也可以自己给容器中放HandlerMapping。自定义HandlerMapping
    1. protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
    2. if (this.handlerMappings != null) {
    3. for (HandlerMapping mapping : this.handlerMappings) {
    4. HandlerExecutionChain handler = mapping.getHandler(request);
    5. if (handler != null) {
    6. return handler;
    7. }
    8. }
    9. }
    10. return null;
    11. }

  • 相关阅读:
    ajax和web前端:深入解析其重要性、应用、挑战与未来趋势
    JavaWeb开发-09-MyBatis
    DOM 事件流(事件捕获和事件冒泡)
    造个Python轮子,实现根据Excel生成Model和数据导入脚本
    Centos、OpenEuler OS更改源地址
    Google Colab
    NLP-词向量、Word2vec
    Centos7安装GBase8a V9.5
    CentOS 7 基于C 连接ZooKeeper 客户端
    61、SpringBoot -----跨域资源的设置----局部设置和全局设置
  • 原文地址:https://blog.csdn.net/weixin_61843013/article/details/126600143