SpringBoot1~~~

目录

快速入门

依赖管理和自动配置

修改自动仲裁/默认版本号

starter场景启动器

自动配置

修改默认扫描包结构

修改默认配置

读取application.properties文件

按需加载原则

容器功能

@Configuration

@Import

​编辑

@Conditional

@ImportResource

配置绑定@ConfigurationProperties

Lombok

yaml

基本语法

数据类型

应用

细节

静态资源访问

Rest风格请求处理

接收参数相关注解

@PathVariable、@RequestParam

@RequestHeader

@CookieValue

@RequestBody

@RequestAttribute、@SessionAttribute

复杂参数

自定义对象参数-自动封装

自定义转换器

实现接口形式

向容器注入Bean形式                              

处理Json

内容协商

Thymeleaf

拦截器

实现接口形式

向容器注入Bean形式

文件上传

第一种

第二种 


快速入门

jdk8+,maven3.5+

    <!--导入springboot父工程-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.3</version>
    </parent>
    <!--导入web项目场景启动器:会自动导入和web开发相关的所有依赖-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
//表示这是一个springboot应用/项目
@SpringBootApplication
public class MainApp {
    public static void main(String[] args) {
        SpringApplication.run(MainApp.class,args);
        //或者
        ConfigurableApplicationContext ioc
                = SpringApplication.run(MainApp.class, args);
    }
}
@Controller
public class HelloController {
    @RequestMapping("/hello")
    @ResponseBody
    public String hello() {
        return "hello";
    }
}

依赖管理和自动配置

修改自动仲裁/默认版本号

spring-boot-starter-parent 还有父项目, 声明了开发中常用的依赖的版本号,并且进行 自动版本仲裁 , 即如果程序员没有指定某个依赖jar的版本,则以父项目指 定的版本为准

在pom.xml修改版本号

starter场景启动器

开发中我们引入了相关场景的starter,这个场景中所有的相关依赖都引入进来了
比如我们做web开发引入了,该starter将导入与web开发相关的所有包

    <!--导入web项目场景启动器:会自动导入和web开发相关的所有依赖-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

依赖树:可以看到spring-boot-starter-web ,帮我们引入了spring-webmvc,spring-web 开发模块,还引入了spring-boot-starter-tomcat 场景,spring-boot-starter-json 场景,这些场景下面又引入了一大堆相关的包,这些依赖项可以快速启动和运行一个项目,提高开发效率

所有场景启动器最基本的依赖就是spring-boot-starter,这个依赖也就是SpringBoot自动配置的核心依赖

官方/第三方strater

自动配置

扫描包默认主程序(MainApp)所在的包及其子包下会被扫描

修改默认扫描包结构

scanBasePackages指定扫描的包,com.edu这个包及子包会被扫描

@SpringBootApplication(scanBasePackages = {"com.edu","aa.bb"}) 
public class MainApp {
    public static void main(String[] args) {
        SpringApplication.run(MainApp.class,args);
    }
}

修改默认配置

1、在resources目录下创建application.properties文件,更改value
2、在application.properties文件中自定义配置,通过@Value("${}")获取对应属性值

读取application.properties文件

也可以放在resource目录下的config目录下、项目路径下

public class ConfigFileApplicationListener {
    private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/*/,file:./config/";
    private static final String DEFAULT_NAMES = "application";
}

按需加载原则

自动配置遵守按需加载原则:引入了哪个场景starter就会加载该场景关联的jar 包,没有引入的starter 则不会加载其关联jar

SpringBoot 所有的配置功能都在spring-boot-autoconfigure 包里面

容器功能

Sping注入组件的注解仍可以在SpringBoot使用

@Configuration

传统:通过配置文件注入组件

 

使用@Configuration添加/注入组件,创建配置类来注入组件

前提:在springboot扫描的包/子包下会注入到容器
    1. @Configuration 标识这是一个配置类, 等价于配置文件
    2. 可以通过@Bean 注解注入bean对象到容器

    3.当一个类被@Configuration标识,该类-Bean也会注入容器,可以被获取

@Configuration
public class BeanConfig {
    //name的值指定bean的id,不指定id就是方法名
    @Bean(name = "monster")
    public Monster monster01() {
        return new Monster(200,"tom",18,"dance");
    }
}

SpringBoot2 新增特性: proxyBeanMethods 指定 Full 模式 和 Lite模式

proxyBeanMethods:代理bean的方法

(1) Full(proxyBeanMethods = true)(默认)【保证每个@Bean 方法被调用多少次返回的组件都是单实例的, 是代理方式】

(2) Lite(proxyBeanMethods = false)【每个@Bean 方法被调用多少次返回的组件都是新创 建的, 是非代理方式】

(3) 特别说明: proxyBeanMethods 是在调用@Bean方法才生效,因此,需要先获取 BeanConfig 组件,再调用方法;而不是直接通过 SpringBoot 主程序得到的容器来获取 bean, 注意观察直接通过 ioc.getBean() 获取 Bean, proxyBeanMethods 值并没有生效

(4) 如何选择: 组件依赖必须使用Full模式,如果不需要组件依赖使用Lite模式

(5) Lite模式也称为轻量级模式,因为不检测依赖关系,运行速度快

 

容器只有一个,配置类可以有多个, 就和Spring可以有多个ioc配置文件是一个道理

@Import

使用@Configuration可以将Bean注入到容器

也可以在配置类上使用@Import,就不必写具体的方法
默认id就是对应类型的全类名

@Conditional

条件装配:满足Conditional指定的条件,则进行组件注入
@Conditional 是一个根注解,下面有很多扩展注解

如果扩展注解放在配置类上,表示该类的所有组件都要进行条件约束

@ImportResource

作用:原生配置文件引入, 也就是可以直接导入Spring 传统的 beans.xml ,可以认为是SpringBoot 对Spring 容器文件的兼容

将beans.xml文件导入到配置类中

spring或springboot扫描beans.xml文件需要new ClassPathXmlApplicationContext(“”);

现在导入到配置类中,springboot可以直接SpringApplication.run(MainApp.class, args);

@Configuration
@ImportResource(locations = "classpath:beans.xml")
public class BeanConfig2 {}

配置绑定@ConfigurationProperties

加入configuration-processor依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <!--
                配置optional为true
                说明: 表示防止将此依赖传递到其它模块
            -->
            <optional>true</optional>
        </dependency>

使用Java读取到SpringBoot 核心配置文件 application.properties 的内容, 并且把它封装到JavaBean中 

如果不添加@Component注解会报错

第二种方法在配置类上加@EnableConfigurationProperites,通过配置类注入到容器

开启Furn配置绑定功能,把Furn组件自动注册到容器中

在Bean中必须要有set方法,否则属性值是null

如果application.properties有中文,需要转成unicode编码写入

在网站中把中文转码,再粘贴回去

Lombok

写@AllArgsConstructor会覆盖无参构造器,搭配上@NoArgsConstructor

@Slf4j --- 日志输出

yaml

以数据为中心的标记语言

基本语法

数据类型

字面量

单个的、不可再分的值:data、boolean、string、number、null

对象

键值对的集合:map、hash、set、object

数组

一组按次序排列的值:array、list、queue

应用

前缀就是yaml第一级的名称

细节

如果 application.properties 和 application.yml 有 相同的前缀值绑定

application.properties 优先级高, 开发时,应当避免

加入依赖会有提示字段

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <!--
                配置optional为true
                说明: 表示防止将此依赖传递到其它模块
            -->
            <optional>true</optional>
        </dependency>

静态资源访问

可以直接访问x.jpg,直接放在resources下访问会报错

静态资源访问原理原理:http://localhost:8080/1.jpg,静态映射是/**,先看/1.jpg是否会被Controller处理,否则交给静态资源处理,如果静态资源找不到则响应404 页面

静态资源访问前缀和控制器请求路径冲突,需要改变静态资源访问前缀

在application.yml修改

spring:
  web:
    resources:
      static-locations: /res/**

改变默认的静态资源路径,比如希望在类路径下增加 hspimg目录作为静态资源路径

如果你配置static-locations,原来的访问路径就被覆盖了,需要重新指定一下

spring:
  mvc:
    static-path-pattern: /res/**
  web:
    resources:
      static-locations: ["classpath:/hspimg/","classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"]

Rest风格请求处理

Rest 风格支持(使用HTTP请求方式动词来表示对资源的操作)

请求方式:/monster

GET-获取怪物

DELETE-删除怪物

PUT-修改怪物

POST-保存妖怪

 细节

1、客户端是PostMan 可以直接发送Put、delete等方式请求,可不设置Filter

2、如果要SpringBoot支持页面表单的Rest功能, 则需要注意如下细节

        需要在application.yml 启用filter功能,否则无效

        Rest风格请求核心Filter ; HiddenHttpMethodFilter ,表单请求会被 HiddenHttpMethodFilter 拦截 , 获取到表单 _method 的值,再判断是PUT/DELETE/PATCH

spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true

 

没有视图解析器,会输出abc,否则就走视图解析器定位的页面

        使用@Controller
        return "xxx"; 

        1、先看Controller有没有对应的[没有配置视图解析器]

        2、如果配置视图解析器,就定位页面

1、页面在静态目录下

spring:
    view:
      suffix: .html
      prefix: /

2、更改静态资源访问路径,view需要和static-path-pattern保持一致

spring:
  mvc:
    static-path-pattern: /res/**
    view:
      suffix: .html
      prefix: /res/

接收参数相关注解

@PathVariable、@RequestParam

在形参加上@PathVariable Map<String,String> map,可以把所有参数放进Map中,但是有多个值(List)只会取第一个,因为Map的key是唯一的

<a href="/monster/200/jack">@PathVariable-路径变量 monster/200/jack</a>

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

@RequestHeader

获取 Http 请求头 

@RequestHeader里的参数名不区分大小写
可以通过Map获取所有Http请求头

@CookieValue

获取Cookie,还可以通过request

1. value = "cookie_key" 表示接收名字为 cookie_key的cookie
2. 如果浏览器携带来对应的cookie , 那么 后面的参数是String ,则接收到的是对应的value
3. 后面的参数是Cookie ,则接收到的是封装好的对应的cookie

@RequestBody

处理Json数据

获取POST请求体

也可以封装到JavaBean对象中

输入hspedu 100,输出

@RequestAttribute、@SessionAttribute

获取域的数据

复杂参数

 

自定义对象参数-自动封装

会自动封装,要求提交的数据,表单请求参数名和对象的字段名保持一致

 

自定义转换器

SpringBoot在响应客户端请求时,将提交的数据封装成对象时,使用了内置的转换器(有124个

实现接口形式

向容器注入Bean形式                              

Converter 转换器接口

1、新建一个配置类,使用Lite模式

2、注入Bean(返回类型是接口类型WebMvcConfigurer)

     2.1.返回这个类型的对象并重写addFormatters方法,并自定义转换器

     2.2.使用匿名内部类,实现接口的方法(转换器会注册到converters容器中

换种写法,先创建自定义的转换器

如果添加了多个Converter<String,Car>类型的转换器,Hashmap的key是唯一的

后面的会覆盖前面的

处理Json

SpringBoot支持返回Json格式数据,在启用Web开发场景时,已经引入了相关依赖

会先经过return monster;再经过转换器

底层仍然使用转换器,根据请求带来的Accept类型,发出请求时就已经指定了返回的格式

内容协商

可以手动设置Accept=application/json或application/xml等等(在postman可以设置

默认按照Json格式返回,springboot 依赖包含了 json 数据格式的 jar 依赖。

可以在pox.xml中引入xml依赖,由于xml比json优先级高,会显示xml 格式的数据类型

对于浏览器,我们无法修改Accept的值 
需要开启支持基于请求参数的内容协商功能(在application.yaml中设置)

在地址后加上?format=xxx ,xxx 就是要转换显示为xxx格式的数据的值

format可以修改

Thymeleaf

服务器渲染技术,页面数据是在服务端进行渲染的,并不是前后端分离

首先要声明名称空间:xmlns:th="http://www.thymeleaf.org"

引入Thymeleaf依赖,项目会自动完成配置 

会直接使用视图解析到thymeleaf下的模板文件

拦截器

使用了Thymeleaf

与转换器写法差不多

1、实现HandlerInterceptor接口  

2、拦截器注册到配置类中(实现WebMvcConfigurer的addInterceptors)

3、指定拦截规则

实现接口形式

/images/**是静态资源的图片,也会发出请求,需要放行

向容器注入Bean形式

文件上传

使用了Thymeleaf

设置上传文件大小

第一种

第二种 

文件名:随机数+毫秒数+实际文件名

分目录存放:根据当前日期存放

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/898930.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为云购买弹性云服务器(教程)

配置弹性云服务器 基础配置 实例 操作系统

『完整代码』坐骑召唤

创建一个按钮 作为召唤/消失坐骑的开关 将预制体放入指定文件夹 命名为Mount01 创建脚本并编写&#xff1a;CallMount.cs using UnityEngine; using UnityEngine.UI; public class CallMount : MonoBehaviour{public Button callBtn;GameObject mountPrefab;GameObject mountIn…

信息搜集 --子域名

1.证书查询 通过ssl证书指纹在crt.sh |证书搜索网站搜索 这些就是证书一样的 2.fofa等空间测绘平台查询 3.dns查询 https://dnsdumpster.com/ 4.威胁情报中心 360 微步等等 5.枚举 暴力破解 工具推荐&#xff1a;oneforall GitHub - shmilylty/OneForAll: OneForAll是一款…

windows 上面交叉编译 适合arm架构上的linux内核系统的qt 版本,源码编译

1. 在机器上确认系统信息 cat /proc/cpuinfomodel name : ARMv7 Processor rev 5 (v7l) arm 32位 BogoMIPS : 57.14 Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 CPU implementer : 0x41 CPU architecture: 7 …

【Linux】线程互斥与同步,生产消费模型(超详解)

目录 线程互斥 进程线程间的互斥相关背景概念 数据不一致问题 锁 深度理解锁 原理角度理解&#xff1a; 实现角度理解&#xff1a; 线程同步 条件变量 测试代码 生产消费模型 生产消费模型概念 编写生产消费模型 BlockingQueue &#xff08;1&#xff09;创建生产…

双十一宠物空气净化器哪款吸毛好而且噪音低?希喂、IAM、有哈真实测评

家人们谁懂啊&#xff0c;家里怎么会有一只这么爱掉毛的小猫咪啊&#xff0c;看着香香软软的&#xff0c;谁知道掉起毛来六亲不认啊&#xff0c;搞得我这个老母亲筋疲力尽啊&#xff0c;每天只想着清理它掉下来的浮毛&#xff0c;主要是还特别难清理。 所以后面入手了能吸毛的…

OpenAI o1复现:自动构造prm训练数据-OmegaPRM

作者&#xff1a;cmathx 原文&#xff1a;https://zhuanlan.zhihu.com/p/1477078851 openai o1复现中&#xff0c;有个比较关键的问题&#xff0c;怎么样自动化构造prm模型的训练数据&#xff1f;本文主要从代码层面&#xff0c;来解析OmegaPRM原理。 论文 Improve Mathemat…

Discuz | 起尔开发 传奇开服表游戏公益服发布论坛网站插件

Discuz | 起尔开发 传奇开服表游戏公益服发布论坛网站插件 插件下载&#xff1a;源码 - 起尔开发的插件下载 演示地址&#xff1a;discuz.72jz.com 标黄和非标黄自动分开 在标黄时间内显示在上面置顶&#xff0c;标黄过期后自动显示在下面白色区域。 后台可以设置非标黄默认…

四、多线程带来的的⻛险-线程安全

4.1 观察线程不安全 运行以下代码&#xff1a; package demo02;public class Test {private static int count 0;public static void main(String[] args) throws Exception {Thread t1 new Thread(() -> {for (int i 0; i < 50_000; i) {count;}});Thread t2 new …

通过Docker Compose构建自己的Java项目

通过Docker Compose构建自己的Java项目 前置条件 安装了Docker,未安装的请移步:CentOS7 / CentOS8 安装 Docker-ce安装了Docker-Compose,未安装的请移步:在CentOS7、CentOS8系统下安装Docker Compose1. 配置阿里云镜像仓库 为了提高Docker镜像的下载速度,我们可以配置阿…

版本工具报错:Error Unity Version Control

NotConfiguredClientException: Unity VCS client is not correctly configured for the current user:Client config file.

python 爬虫 入门 三、登录以及代理。

目录 一、登录 &#xff08;一&#xff09;、登录4399 1.直接使用Cookie 2.使用账号密码进行登录 可选观看内容&#xff0c;使用python对密码进行加密&#xff08;无结果代码&#xff0c;只有过程分析&#xff09; 二、代理 免费代理 后续&#xff1a;协程&#xff0c;…

TitanIDE:解锁编程教学新范式

在高校软件工程类课程教育中&#xff0c;传统编程教学方式正面临着多重痛点&#xff1a; 环境配置繁琐&#xff1a;软件工程类课程往往需要学生自行配置复杂的开发环境。但是&#xff0c;学校硬件设备条件差异、软件兼容性问题等因素&#xff0c;导致学生学习效率低下&#xf…

热销王西圣H1头戴式耳机—全平台售罄断货:揭秘抢购潮究其原因?

西圣xisem作为国内平价享轻奢的领军品牌&#xff0c;就在今年它家的头戴式蓝牙耳机性价比标杆—西圣H1&#xff0c;凭借其发烧级的千元音质、降噪与满级的旗舰配置性能&#xff0c;不仅惊艳了整个耳机圈&#xff0c;还在仅仅的几个月内&#xff0c;西圣H1头戴式耳机已经火爆断货…

python 使用gradio启动程序报错

问题一&#xff1a;localhost is not accessible 解决办法&#xff1a; export no_proxy"localhost,127.0.0.1,::1"

C#学习笔记(三)

C#学习笔记&#xff08;三&#xff09; 第 二 章 命名空间和类、数据类型、变量和代码规范二、类的组成和使用分析1. 基本概念2. 类的内容组成3. 方法的初步理解 第 二 章 命名空间和类、数据类型、变量和代码规范 二、类的组成和使用分析 1. 基本概念 类是程序的基本单元&a…

PostgreSQL中触发器递归的处理 | 翻译

许多初学者在某个时候都会陷入触发器递归的陷阱。通常&#xff0c;解决方案是完全避免递归。但对于某些用例&#xff0c;您可能必须处理触发器递归。本文将告诉您有关该主题需要了解的内容。如果您曾经被错误消息“超出堆栈深度限制”所困扰&#xff0c;那么这里就是解决方案。…

Javascript算法——二分查找

1.数组 1.1二分查找 1.搜索索引 开闭matters&#xff01;&#xff01;&#xff01;[left,right]与[left,right) /*** param {number[]} nums* param {number} target* return {number}*/ var search function(nums, target) {let left0;let rightnums.length-1;//[left,rig…

大话网络协议:从OSI七层模型说开去

时至今日,互联网已经是大家日常生活中不可或缺的一部分,购物、点餐、刷剧、网课,已经融入了我们生活的方方面面。但网络具体是怎么工作的呢? 特别是我们具体从事软件研发、ICT行业的同学,理解和掌握这个我们产品运行的基础设施尤为必要。 本文,我们会力争用最简单易懂的…

秋季猫咪疯狂掉毛,宠物空气净化器有用吗?性价比高的该怎么选?

我家猫真的是换季就变掉毛怪&#xff0c;整只猫“虚胖”了一大圈不止&#xff0c;在阳光下可以看见非常多飘在空气中的浮毛。浮毛到处乱飞&#xff0c;沉积在黑色的衣服上&#xff0c;就形成白色的薄膜。自从养猫后&#xff0c;我再也没穿过深色的衣服。 现在每天都给它梳毛&am…