Spring Boot笔记1

1. SpringBoot简介

1.1. 原有Spring优缺点分析

1.1.1. Spring的优点分析

Spring是Java企业版(Java Enterprise Edition,javeEE)的轻量级代替品。无需开发重量级的Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java对象(Plain Old Java Object,POJO)实现了EJB的功能。

1.1.2. Spring的缺点分析

虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。

不论是一开始的基于XML的配置,还是Spring2.5引入的基于注解的组件扫描,还是Spring 3.0引入的基于Java的配置,这些都代表了开发时的额外损耗。

因为在思考Spring配置和解决业务问题之间需要进行思维切换,甚至还带来了何种方式配置更好的无谓争论,所以编写配置挤占了编写应用程序逻辑的时间。和所有框架一样,Spring实用,但与此同时它要求的回报也不少。

除此之外,项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。

1.2. SpringBoot的概述

SpringBoot对上述Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。

1.2.1. SpringBoot的特点

  • SpringBoot不是对Spring功能上的增强,而是提供了一种快速构建Spring的方式
  • 开箱即用,没有代码生成,也无需XML配置。同时也可以修改默认值来满足特定的需求
  • 提供了一些大型项目中常见的非功能性特性,如嵌入式服务器(嵌入Tomcat,无需部署WAR文件)、安全、指标,健康检测、外部配置等

1.2.2. SpringBoot的核心功能

  • 起步依赖
    起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。
    简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
  • 自动配置
    Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的。

后面会详细说明起步依赖与自动配置的原理解析。

2. SpringBoot实例

2.1. 创建SpringBoot简单实例

下面使用Maven创建一个基于SpringBoot的Web工程的简单实例。

2.1.1. 创建工程

注意:虽然是创建Web工程,但由于SpringBoot内嵌了Tomcat,所以这里选择jar包形式的工程。

2.1.2. 添加依赖

在pom.xml文件中添加SpringBoot的相关依赖

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.neusoft</groupId><artifactId>boot</artifactId><version>0.0.1-SNAPSHOT</version><!-- 继承Spring Boot父级依赖,也就是:spring-boot-dependencies。父级依赖管理了Spring Boot项目中的所有依赖版本,以后导入依赖默认不需要写版本号了。(当前没有在dependencies里面管理的依赖自然需要声明版本号)--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.3.RELEASE</version></parent><dependencies><!-- spring-boot-starter是Spring Boot的核心启动器。只要引入官方提供的starter,就可以将此模块中的相关jar都导入进来。官方的starter命名规范是:spring-boot-starter-模块名所以,下面配置会将web开发相关jar都导入进来,并自动管理版本信息。--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>

2.1.3. 添加工程主启动类

在类路径下创建HelloApplication.java文件

package com.neusoft.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplicationpublic class HelloApplication {public static void main(String[] args) {SpringApplication.run(HelloApplication.class, args);}}

注意:

  1. @SpringBootApplication注解指定该类为SpringBoot的程序入口类。
  2. SpringBoot项目的Bean默认装配规则是:根据入口类所在包位置从上往下扫描。
    例如:如果DemoApplication类所在的包为:com.neusoft.demo;那么就会自动扫描com.neusoft.demo 包及其所有子包,否则不会被扫描!
    所以,应将SpringBoot的程序入口类放到mapper、service所在包的上级。
  3. SpringApplication类中的run方法会对当前SpringBoot工程进程初始化创建。

2.1.4. 创建Controller

在 HelloApplication.java 所在包下创建controller包,然后创建Controller。

package com.neusoft.boot.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestControllerpublic class HelloController {@RequestMapping("/hello")public String say(){          //可以直接返回对象或集合,客户端将接收到json数据return "hello...";}}

@RestController 注解标识当前类为Controller组件,并且直接响应json数据。

2.1.5. 测试

执行HelloApplication类的入口方法,SpringApplication类中的run方法就会启动当前的SpringBoot工程。

Tomcat started on port(s): 8080 (http) with context path ''
Started DemoApplication in 4.292 seconds (JVM running for 5.15)

当控制台输出上述内容时,表示SpringBoot工程启动成功。 在地址栏中输入url进行访问测试:

注意:SpringBoot内嵌了Tomcat,所以只需要运行SpringBoot工程的主启动类即可。

2.1.6. 工程目录结构

2.2. 使用Spring Initializr创建工程

上面案例中,我们自己手动搭建了一个SpringBoot框架。实际上,为了实现快速开发,SpringBoot官方给我们提供了一个初始化器,可以引导我们快速构建一个SpringBoot工程。

2.2.1. 使用官方工具生成工程

打开 SpringBoot 官网:https://spring.io/projects/spring-boot/; 在网站的下部有 Spring Initializr 的链接。

点击此链接,进入到工程引导页面:

注意:

  1. 引导页面的左部,设置工程属性及版本信息等内容。右部设置工程所添加的依赖jar包。
  2. Packaging 处选择 Jar 形式。(因为SpringBoot 内置服务器,不需要打成 war 包)
  3. 因为我们想要创建web工程,所以添加 Spring Web 依赖模块。
  4. 最后,点击 “GENERATE” 按钮,生成整个工程。

2.2.2. 工程目录结构

先使用IDE导入工程(这里使用STS导入此Maven工程)。

注意: mvnw是一个maven wrapper script(Maven包装脚本),它可以让你在没有安装maven或者maven版本不兼容的条件下运行maven的命令。

2.2.3. pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><!-- pom模型版本 --><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.3.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><!-- 项目信息 --><groupId>com.neusoft</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><!-- 配置工程字符编码集 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies><!-- 配置SpringBoot的Maven插件 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

2.2.4. 工程主启动类

package com.neusoft.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

2.2.5. 创建Controller

在 DemoApplication.java 所在包下创建controller包,然后创建Controller。

package com.neusoft.demo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {@RequestMapping("/hello")public String say() {return "hello...";}
}

2.2.6. 测试

执行 DemoApplication类的入口方法,然后在地址栏中输入url进行访问测试。

2.3. 2.3.使用STS创建工程

2.3.1. 创建Spring Starter Project工程

2.3.2. 添加工程信息

注意:这里添加Maven工程需要的一些信息

2.3.3. 添加版本及依赖信息

注意:这里添加SpringBoot版本信息、添加的依赖信息。然后点击 “Finish” 。

2.3.4. 生成SpringBoot工程

工程创建完成后,我们会发现:创建的工程与使用 Spring Initializr 创建的工程是完全一样的。

2.4. SpringBoot热部署

我们在开发中反复修改类、页面等资源,每次修改后都是需要重新启动才生效,这样每次启动都很麻烦,浪费了大量的时间,我们可以在修改代码后不重启就能生效,在 pom.xml 中添加如下配置就可以实现这样的功能,我们称之为热部署。

<!--热部署配置-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId>
</dependency>

2.5. SpringBoot的跨域处理

除了使用传统的过滤器来设置跨域处理配置之外,SpringBoot还给我们提供了两种跨域处理方式:

  1. 使用 @CrossOrigin 注解配置某一个 Controller 允许跨域。
//只要在此Controller上使用@CrossOrigin注解就可实现跨域访问,并可配置允许跨域的url
@CrossOrigin("*") 
@RestController
public class DeptController { //... }
  1. 实现 WebMvcConfigurer 接口中的 addCorsMappings 方法,在此方法中配置全局跨域处理。
    在工程中添加 WebMvcConfig 类。此类配置了 @Configuration 注解,就成为一个 Spring 容器类,工程启动时会自动加载此类中的配置。
package com.neusoft.demo;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {/*
* addMapping:配置可以被跨域的路径,可以任意配置,可以具体到直接请求路径。 
* allowCredentials:是否开启Cookie
* allowedMethods:允许的请求方式,如:POST、GET、PUT、DELETE等。
* allowedOrigins:允许访问的url,可以固定单条或者多条内容
* allowedHeaders:允许的请求header,可以自定义设置任意请求头信息。 
* maxAge:配置预检请求的有效时间
*/registry.addMapping("/**").allowedOrigins("*").allowCredentials(true).allowedMethods("*").allowedHeaders("*").maxAge(36000);}
}

2.6. @RequestBody实现参数序列化

前端使用 AJAX 的 post 方式请求时,需要对请求参数做序列化处理,否则 SpringMVC 无法接收提交参数。

//使用qs模块中的stringify方法实现post提交时的参数序列化
this.$axios.post('http://localhost:8080/hello', this.$qs.stringify(user))...

在 SpringBoot 中,可以使用 @RequestBody 注解,在服务器端实现 post 提交时的参数序列化处理。这样,前端的 post 请求就可以直接提交 json 对象了。

@RequestMapping("/hello")
//在参数前使用@RequestBody注解
public String say(@RequestBody User user) {System.out.println(user);return "hello...";
}
let user = {userId: 1,userName: 'zhangsan',password: '123'
};
axios.post('http://localhost:8080/elm/hello',user).then(response => {console.log(response.data);}).catch(error => {console.log(error);});

@RequestBody 注解很强大,它甚至于可以直接接收 json 数组。

@RequestMapping("/hello")
//使用集合接收json数组
public String say(@RequestBody List<User> list) {for(User user : list) {System.out.println(user);}return "hello...";
}
let userArr = [{userId: 1,userName: '张三',password: '123'
}, {userId: 2,userName: '李四',password: '888'
}, {userId: 3,userName: '王五',password: '999'
}]
axios.post('http://localhost:8080/elm/hello', userArr).then(response => {console.log(response.data);}).catch(error => {console.log(error);});

注意:@RequestBody 注解不支持get方式请求

后续笔记icon-default.png?t=N7T8https://blog.csdn.net/qq_64071654/article/details/135263480

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bmp2Png是什么工具?好用吗?

Bmp2Png是什么工具&#xff1f;好用吗&#xff1f; 批量BMP图片转为PNG透明图片&#xff0c;去掉BMP黑色背景&#xff0c;压缩导出png图片V1.1前段时间上传了一款bmp转png并去黑底的demo软件&#xff0c;非常受欢迎&#xff0c; 上一版本地址&#xff1a;批量BMP图片转为PNG…

计算机网络 (期末救命版)

文章目录 Ⅰ 网络概述1. 互联网概述与组成2. 计算机网络的类别3. 计算机网络的性能指标4. 计算机网络体系结构 Ⅱ 物理层1. 物理层的任务2. 信道复用技术 Ⅲ 数据链路层1. 点对点信道2. 基本问题3. 点对点协议 PPP4. 使用广播信道的数据链路层 Ⅳ 网络层1. 网络层的服务2. 网际…

解算人生--写于2023跨年之夜

最近买了一本书&#xff0c;书名叫《计算》 读了部分内容&#xff0c;虽然理解上还需要再下下功夫&#xff0c;但是直观的感觉冲击还是挺大的&#xff0c;最明显的就是表面与本质的把握。大家可能都有这样一种感觉&#xff0c;初步涉足某一领域时&#xff0c;开始我们都会被大量…

github使用技巧(经验篇)

相关经验 指定代码范围并高亮显示 例如&#xff0c;指定nn_ops.py文件2612-L2686行的代码&#xff1a;https://github.com/tensorflow/tensorflow/blob/v2.14.0/tensorflow/python/ops/nn_ops.py#L2612-L2686 FAQ Q&#xff1a;github网页打不开&#xff1f; 【github加载不…

WeNet语音识别调用通义千问

WeNet语音识别调用通义千问 WeNet语音识别对通义千问&#xff08;Qwen-72B-Chat Bot&#xff09;调用&#xff0c;首先通过WeNet将用户的语音输入转录为文本&#xff0c;然后将此文本输入通用问答模型以获取答案。 本人原创作品&#xff0c;体验一下 连续对话 WeNet语音识别…

一起玩儿物联网人工智能小车(ESP32)——22. 用ESP32的LED PWM控制器给TT马达调速(C MicroPython)

新年快乐&#xff01; 2024&#xff0c;我们一起玩儿&#xff01; 摘要&#xff1a;本文主要介绍如何使用Mixly实现PWM波形的输出。 下面就先用Mixly实现PWM波形的输出。首先打开Mixly软件&#xff0c;这次还是先使用C语言来实现。如果你有示波器&#xff0c;或者逻辑分析仪&a…

基于SSM的牙科诊所管理系统

基于SSM的牙科诊所管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 前台主页 后台界面 摘要 随着社会的不断发展和人们生活水平的提高&#xff0c;牙…

C++面试宝典第13题:计算餐厅账单

题目 假如你是一家餐厅的收银员,需要编写一个程序来计算顾客的账单。程序应该能够接受顾客点的菜品和数量,并根据菜品的单价计算出总价。另外,程序还应该能够处理折扣和优惠券,并输出最终的账单金额。 解析 这道题主要考察应聘者使用面向对象的设计方法来解决实际问题的能力…

【网络面试(3)】浏览器委托协议栈完成消息的收发

前面的博客中&#xff0c;提到过很多次&#xff0c;浏览器作为应用程序&#xff0c;本身是不具备向网络中发送网络请求的能力&#xff0c;要委托操作系统的内核协议栈来完成。协议栈再调用网卡驱动&#xff0c;通过网卡将请求消息发送出去&#xff0c;本篇博客就来探讨一下这个…

UG NX二次开发(C#)-Ufun和NXOpen混合编程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、Ufun函数3、 NXOpen4、混合编程实现1、前言 在UG NX二次开发过程中,采用Ufun功能比较简单,能用比较少的代码实现我们需要的功能,但是ufun函数的功能不是很强大,尤其随着UG NX的版本…

LeetCode刷题--- 不同路径 III

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递…

基于 LangChain + GLM搭建知识本地库

一种利用 langchain 思想实现的基于本地知识库的问答应用&#xff0c;目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。 受GanymedeNil的项目document.ai和AlexZhangji创建的ChatGLM-6B Pull Request启发&#xff0c;建立了全流程可使用开源模…

Python中JSON模块的使用

1 JSON简介 JSON是JavaScript Object Notation即Javascript对象简谱的缩写。JSON是一种轻量级的数据交换格式&#xff0c;JSON数据是由键值对组成的结构&#xff0c;与Python中的字典类似&#xff0c;由尖括号包围的键值对组成&#xff0c;键和值的类型可以是字符串、数字、布…

【华为机试】2023年真题B卷(python)-滑动窗口最大值

一、题目 题目描述&#xff1a; 有一个N个整数的数组&#xff0c;和一个长度为M的窗口&#xff0c;窗口从数组内的第一个数开始滑动直到窗口不能滑动为止&#xff0c; 每次窗口滑动产生一个窗口和&#xff08;窗口内所有数的和&#xff09;&#xff0c;求窗口滑动产生的所有窗口…

电缆厂 3D 可视化管控系统 | 图扑数字孪生

图扑软件(Hightopo)专注于 Web 的 2D&3D 可视化&#xff0c;自主研发 2D&3D 图形渲染引擎、数据孪生应用开发平台和开发工具&#xff0c;广泛应用于 2D&3D 可视化、工业组态与数字孪生领域&#xff0c;图扑软件为工业物联网、楼宇、场馆、园区、数据中心、工厂、电…

shell编程一

shell 定义 Shell 也是一种程序设计语言&#xff0c;它有变量&#xff0c;关键字&#xff0c;各种控制语句&#xff0c;有自己的语法结构&#xff0c;利用shell程序设计语 可以编写功能强、代码简短的程序 #! Shebang 定义解释器 shell的分类和切换 # cat /etc/shells /bin/sh…

C语言学习----存储类别

存储类别 &#x1f33f;本文是C Primer Pluse 中文版第12章的部分内容整理 &#x1f331;主要是围绕C中作用域 链接 存储期 展开 &#xff0c;是后面进行多文件管理的基础~ &#x1f308;概要 &#x1f34e;明确对象 变量名 标识符的基本概念和含义 &#x1f350;作用域和链接描…

ES6之Reflect详解

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

2023年度学习总结

想想大一刚开始在CSDN写作&#xff0c;这一坚持&#xff0c;就是我在CSDN的第九个年头&#xff0c;这也是在CSDN最有里程碑的一年&#xff0c;这一年我被评为CSDN的博客专家啦&#xff01;先是被评为Unity开发领域新星创作者&#xff0c;写的关于一部分Unity开发的心得获得大家…

ES应用_ES实战

依靠知识库使用es总结一些使用技巧。 1 快速入门 ES是将查询语句写成类似json的形式&#xff0c;通过关键字进行查询和调用。 1.1 创建 下面创建了一个主分片为5&#xff0c;副本分片为1的ES结构。ES本身是一种noschema的结构&#xff0c;但是可以通过指定mapping编程schema的…