SpringBoot学习

加粗样式# SpringBoot

2021-03-28开始学习springboot,争取一周之内跟着课程学习完毕,随看视频随着记一些笔记,加油吧~


使用springboot直到微服务,云原生等等


前言

没什么前言,好好学吧


一、创建springboot项目

1.创建步骤

  • 创建maven项目
  • 添加pom相关依赖
    <parent>
        <artifactId>org.springframework.boot</artifactId>
        <groupId>spring-boot-starter-parent</groupId>
        <version>2.3.4.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

  • 编写主程序
/**
 * 编写主程序类,启动类
 * 这是一个springboot应用
 */
@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class,args);
    }
}

  • 编写业务
@RestController
public class helloController {
    /**
     * 控制器,专门用来处理请求
     * @return
     */

    @RequestMapping("/hello")
    public String handle01(){
        return "hello Boot2";
    }
}

  • 测试:直接运行main方法

  • 简化配置:application.peoperties

  • 简化部署

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.2.6.RELEASE</version>
            </plugin>
        </plugins>
    </build>

2.自动配置管理

2.1.SpringBoot特点

2.1.1依赖管理
  • 父项目依赖管理
<parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.3.4.RELEASE</version>
    </parent>
  • 开发导入Starter场景启动器:只要引入starter 这个场景所有需要的依赖我们都自动引入
  • 无需关注版本号,自动版本仲裁
引入依赖都不用写版本号
引入的非版本仲裁jar要重写配置
  • 可以修改版本号:查看dependencies里规定当前依赖的版本;在当前项目里重写配置
2.1.2 优点
  • 自动配好tomcat
    引入tomcat
    配置tomcat
  • 自动配好springmvc
    引入springmvc全套组件
    自动配好springmvc常见组件(功能)
  • 自动配好web常见功能,如字符编码问题
  • 默认的包的结构
    不需要包扫描(MainApplication在最外层的时候)
  • 各种配置拥有默认值
    映射到MultipartProperties
    配置文件的值最终会绑定到每个类上,这个类会在容器中创建对象
  • 按需加载所有自动配置项

2.2容器功能

2.2.1 组件添加

1.@Configuration

  • 基本使用
  • Full模式与Lite模式
    示例:
    最佳实战(01代码)
    配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
    配置 类组件之间有依赖关系,方法会被调用得到之前的单实例组件,用Full模式

2.@Conditional 有条件的注入
3.@ImportResource 支持spring的xml文件导入

2.3 配置绑定

使用java读取到properties并且封装到JavaBean中

  • @Componet和@ConfigurationProperties
  • @ConfigurationProperties和@EnableConfigurationProperties(类)

3.SpringBoot自动配置原理

3.1 @SpringBootApplication

效果等同于

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
3.1.1 @SpringBootConfiguration

@Configuration
代表当前是一个配置类

3.1.2 @ComponentScan

指定要扫描哪些(基于spring注解)

3.1.3 @EnableAutoConfiguration

是这两个注解的合成

@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
1.自动配置包@AutoConfigurationPackage
@Import({Registrar.class}) //利用registrat导入一系列组件,把某一个包下所有组件导入进来(main程序所在的包下)
public @interface AutoConfigurationPackage {}
2.@Import({AutoConfigurationImportSelector.class})
1.利用getAutoConfigurationEntry(annotationMetadata),给容器批量导入一些组件
2.利用List<String> configurations=getCandidateConfigurations(annotationMetadata,attributes)获取到所有需要导入到容器的组件
2.利用工厂加载 Map<String,List<String>> loadSpringFactories(@Nullable Classloader classloader) 得到所有组件

自动配置类文件写死了springboot一启动,就要给容器中加载的所有配置类(127个),但不会全部生效!

3.2 按需配置

@ConditionalOnClass:按需生效,要看该注解
最终按照条件装配规则按需装配
springBoot默认会在底层配好所有的组件,但是如果用户自己配置了以用户自己的优先
总结

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

3.3

  • 引入场景依赖
  • 查看自动配置了哪些
  • 是否需要修改
  •  	参照文档修改配置项
     	自动义加入或者替换组件
    

4.开发小技巧

4.1 Lombok

简化javaBean开发

4.2 Spring Initailizr(初始化向导)

在这里插入图片描述

4.3 dev-tools

自动更新

二、SpringBoot核心功能

1.配置文件

1.1 文件类型

1.1.1 properties
1.1.2 yaml

1.简介
yam不是一种标记语言,仍是一种标记语言
用来以数据为中心的配置文件
2.基本语法

  • key: value (注意空格)
  • 大小写敏感
  • 缩进表示层级关系
  • 只允许空格缩进
  • 同级对齐即可
  • #表示注释
  • ‘’和“”表示字符串内容

3.数据类型
字面量:单个的不可再分 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

数组:一组按次序排列的值

k: [v1,v2,v3]
k:
	- v1
	- v2
	- v3

2.Web开发

2.1 SpringMvc配置概览

2.2简单功能分析

2.2.1.静态资源访问

静态资源目录
类路径:/static /public /resources /META-INF/resources
原理:静态映射
请求进来 先去找Controller看能不能处理。不能的话交给静态资源处理器。静态资源能找到就访问,静态没有就404

静态资源访问前缀

默认无前缀

spring:
  mvc:
    static-path-pattern: /res/**
  resources:
    static-locations: [classpath:/haha/]

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

webjar

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.5.1</version>
        </dependency>

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

2.2.2 欢迎页支持
  • 静态资源路径下 index.html
  • controller能处理index请求
2.2.3 自定义Favicon

(这部分调试半天没弄出来,之后再看看)

2.2.4 静态资源原理分析
  • SpringBoot启动默认加载 xxxAutoConfiguration类,自动配置类(web开发中加载web配置类)
  • SpringMvc自动配置类WebMvcAutoConfiguration,查看是否生效
@Configuration(
    proxyBeanMethods = false
)
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class})
  • 查看容器中配置了什么?
  • 配置文件的相关属性和什么进行了绑定?
  •  WebMvcProperties==springMvc
     ResourceProperties==spring.resources
    
  • 扩展知识
  •   *****一个配置类只有一个有参构造器*****:有参构造器所有的参数的值都会从容器中确定
      ResourceProperties 获取和spring.resources绑定的所有值的对象
      WebMvcProperties 获取和spring.mvc绑定的所有的值的对象
      ListableBeanFactory Spring的bean工厂
      HttpMessageConverters 找到所有的HttpMessageConverters 
      ResourceHandlerRegistrationCustomizer找到资源处理器的自定义器
    
  •   *****资源处理的默认规则*****
    
        public void addResourceHandlers(ResourceHandlerRegistry registry) { //resources.add-mapping=false来禁用所有静态资源
            if (!this.resourceProperties.isAddMappings()) {
                logger.debug("Default resource handling disabled");
            } else {
                Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
                CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
                if (!registry.hasMappingForPattern("/webjars/**")) {
                    this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{"/webjars/**"}).addResourceLocations(new String[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
                }

                String staticPathPattern = this.mvcProperties.getStaticPathPattern();
                if (!registry.hasMappingForPattern(staticPathPattern)) {
                    this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(WebMvcAutoConfiguration.getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
                }
            }
        }
  •   欢迎页的处理规则
    

2.3 请求参数处理

2.3.1 请求映射
  • @xxxMapping
  • Rest风格支持 (HTTP请求方式动词来表示对资源的操作)
  •  GET-获取用户
     DELETE-删除用户
     PUT-修改用户
     POST-保存用户
     核心Filter:HiddenHttpMethodFilter
     在springboot中手动开启
    

表单提交rest风格原理

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

Rest使用客户端工具

  • 使用postman直接发动put delete请求,无需filter
    请求映射原理
    (这部分之后再看,目前时间紧急p28)
2.3.2 普通参数与基本注解
  • 注解
    <li>@PathVariable (路径变量)</li>
    <li>@RequestHeader (获取请求头)</li>
    <li>@RequestParam (获取请求参数)</li>
    <li>@CookieValue (获取cookie值)</li>
    <li>@RequestAttribute (获取request域属性)</li>
    <li>@RequestBody (获取请求体)</li>
    <li>@RequestAttribute(获取request域属性)</li>
    <li>@MatrixVariable (矩阵变量)</li>
  • Servlet API
  • 复杂参数
  • 自定义对象参数
2.3.3 POJO封装过程
2.3.4 参数处理原理(p32开始)
  • HandlerMapping中找到能处理请求的Handler(Controller.method())
  • 为当前handler找一个适配器 HandlerAdapter

2.4 数据响应与内容协商

2.5 视图解析与模块引擎

srpingboot不支持jsp语句

2.5.1 视图解析

在这里插入图片描述

2.5.2 模板引擎-Thymeleaf

1.简介
是一个现代化 服务器端的java模板引擎
2.基本语法

  • 表达式
表达式名字语法用途
变量取值&{…}获取请求域,session域,对象等
选择变量*{…}获取上下文对象值
消息#{…}获取国际化等值
链接@{…}生成链接
片段表达式~{…}jsp:include作用,引入公共页面
  • 字面量
  • 文本操作
  • 数学运算
  • 逻辑运算
  • 比较运算
  • 条件运算
  • 特殊操作

3.设置属性值 th:attr
thymeleaf使用
1.引入Starter
自动配好的策略

  • 所有的thymeleaf相关配置都在ThymeleafProperties
  • 配置好了springTemplataEngnie
  • 配好了ThymeleafViewResolver
  • 我们只需要直接开发页面,前缀后缀都指定了
    3.核心开发
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1 th:text="${msg}">哈哈</h1>
<h2>
    <a href="www.atguigu.com" th:href="${link}">百度</a>
    <a href="www.atguigu.com" th:href="@{link}">百度2</a>

</h2>
</body>
</html>
2.5.3 构建后台管理系统

1.项目创建
2.静态资源处理
3.路径构造
4.模板抽取
5.页面跳转
6.数据渲染

2.5.4 视图解析-源码分析(p47)
2.5.5 拦截器机制(源码p49)
2.5.6 文件上传

1.页面表单

2.文件上传代码

    @PostMapping("/upload")
    public String upload(@RequestParam("email") String email,
                         @RequestParam("username") String username,
                         @RequestPart("headerImg") MultipartFile headerImg,
                         @RequestPart("photos") MultipartFile[] photos) throws IOException {
        log.info("上传的信息:email:{},username:{},headerimg:{},photos:{}",
                email,username,headerImg.getSize(),photos.length);

        if(!headerImg.isEmpty()){
            //保存在文件服务器,OSS服务器
            String originalFilename = headerImg.getOriginalFilename();
            headerImg.transferTo(new File("F:\\code more\\TEST\\"+originalFilename));
        }
        if(photos.length>0){
            for(MultipartFile photo:photos){
                if(!photo.isEmpty()){
                    String originalFilename = photo.getOriginalFilename();
                    photo.transferTo(new File("F:\\code more\\TEST\\"+originalFilename));

                }
            }
        }
        return "main";
    }

3.自动配置原理

2.5.7 异常处理
2.5.8 Web原生组件注入
2.5.9 嵌入式servlet容器
2.5.10 定制化原理

1.定制化常见方式

  • 修改配置文件
  • xxxCustomizer
  • 编写自定义的配置类 xxxConfiguration;+@Bean替换,增加组件中的默认组件,视图解析器
  • web应用实现WebMvcConfiguration即可定制化web功能
  •  @EnableWebMvc+WebMvcConfigurer——@Beanke
     可以全面接管SpringMVC,所有规则自己配置
    

3.数据访问

3.1 Sql

3.1.1 数据源的自动配置

1.导入jdbc场景

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<properties>
    <java.version>1.8</java.version>
    <mysql.version>5.1.49</mysql.version>
</properties>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

2.分析自动配置
自动配置的类

  • DataSourceAutoConfiguration:数据源的自动配置
  • DataSourceTransactionManagerAutoConfiguration:事务管理器的自动配置
  • JdbcTemplateAutoConfiguration:JdbcTemplate的自动配置,可以来对数据库进行crud
  • JndiDataSourceAutoConfiguraion:jndi的自动配置
  • XADataSourceAutoConfiguration:分布式事务相关
3.1.2使用Druid数据源

1.druid官方github地址

  • 自定义
  • 找starter,该配置文件

2.自定义方式
1.创建数据源

        //pom.xml
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.17</version>
        </dependency>

然后进行一系列操作(但是过时不需要啦)

3.1.3 官方Starter进行监控

1.引入druid-starter

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.17</version>
        </dependency>

2.分析自动配置

  • 扩展配置项:spring.datasource.druid
  • DruidSpringAopConfiguration.class
  • DruidStatViewServletConfiguration.class
  • DruidWebStatFilterConfiguration.class
  • DruidFilter

3.配置实例

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/springboot
    username: root
    password: ""
    driver-class-name: com.mysql.jdbc.Driver

    druid:
      aop-patterns: com.lyc.boot.*
      stat-view-servlet:
        enabled: true
        login-username: admin
        login-password: admin

      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
      filters: stat,wall
      filter:
        stat:
          slow-sql-millis: 1000
          log-slow-sql: true
          enabled: true
        wall:
          enabled: true
          config:
            update-allow: false

3.2 整合MyBatis操作

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>

3.2.1 配置模式
  • 全局配置文件
  • SqlSessionFactory 自动配置好了
  • SqlSession 自动配置了SqlSessionTemplate组合了SqlSession
  • @import(AutoConfiguredMapperScannerRegistrar.class)
  • Mapper
    @EnableConfigurationProperties(MyBatisProperties.class);
    @AutoConfigureAfter()

配置过程概览
  • 配置mybatis规则(全局配置文件 sql映射文件位置)
  • 声明Mapper接口(创建Interface),在sql映射文件绑定xml(namespace)
  • controller->service->dao->daoImp
  • 在yaml中配置全局配置属性
3.2.2 注解模式
  • 引入mybatis-starter
  • 配置application.yaml 指定mapper-location位置即可
  • 编写mapper接口和mapper注解
  • 简单方法(注解方式),复杂方法写上配置文件
3.2.3 混合模式

同上

3.3 整合MyBatis-Plus

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值