SpringBoot基础认识

创建SpringBoot模块

首先需要引设置maven并引用maven环境

1.打开项目结构,new module,选择Spring Initializr,URL选默认:

group填写分组如com.kdy  , Artifact起个模块名如springboot_quickstart,Type选择Maven  , Language为Java  ,packing选择jar , Java版本选择8 , version自定义 , name和Description不重要 , Package填写包名如com.kdy。

2.next后,选择某个稳定版如2.5.4,依赖里面勾选Web下的Spring Web依赖:

Spring Web:Build web, including RESTful, applications using Spring MVC. UsesApache Tomcat as the default embedded container.

SpringWeb:使用SpringMVC.UsesApacheTomcat作为默认的嵌入式容器构建Web,包括RESTful和上下文applicaiton。

3.next,起个模块名可用和Artifict一样如springboot_quickstart666,选择位置。finish。

4.打开这个springboot模块,先找到pom文件刷新maven,将spring web的spring-boot-start-parent和spring-boot-starter-web和spring-boot-starter-test三个starter加载进来。Java版本和packaging打包方式也都可以在pom文件中调。

5.项目结构:

src和pom文件,src包含main和test,main包含Java和resource,Java包含包com.kdy,包下有个引导类。resource下static文件夹和template文件夹和application.properties配置文件,test包含Java,Java包含com.kdy包,包里有测试类。

入门

com.kdy.controller中创建BookController

@RestController
@RequestMapping("/books")
public class BookController {@GetMappingpublic String getById(){System.out.println("springboot is running...");return "springboot is running";}
}

启动引导类,访问8080加controller即可 

和spring区别

spring阶段需要写web.xml文件并配置,springboot不用了。现在不需要配置spring核心配置和springmvc的配置了。

隐藏左侧目录冗余文件夹或文件

Setting -> editor -> File Types -> lgnored Files and Folders,+上名想忽略的文件名,也用*.imi这种*号进行占位。

SpringBoot和Spring的区别

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

spring缺点:依赖设置繁琐配置繁琐。sprignboot优点:起步依赖(简化依赖配置)
自动配置(简化常用工程相关配置)辅助功能(内置服务器,......

Parent

版本管理,防止版本冲突。

所有SpringBoot项目要继承的项目,定义了若干个坐标版本号(依赖管理,而非依赖),以达到减少依赖冲突的目的。spring-boot-starter-arent各版本间存在着诸多坐标版本不同

Start

start的就是含有很多依赖的依赖,springboot中有很多这样的start依赖传递的方式的start的依赖,所以就简便了很多。

以达到减少依赖配置的目的。

引导类

@SpringBootApplication
public class SpringbootBeginQuickstartApplication {public static void main(String[] args) {SpringApplication.run(SpringbootBeginQuickstartApplication.class, args);}
}

SpringApplication.run的就是一个容器

@SpringBootApplication
public class SpringbootBeginQuickstartApplication {public static void main(String[] args) {ConfigurableApplicationContext ctx = SpringApplication.run(SpringbootBeginQuickstartApplication.class, args);BookController bean = ctx.getBean(BookController.class);System.out.println(bean);//com.kdy.controller.BookController@6e28bb87}
}

当然,你也可用@Component标柱的类也会到容器中。 

 @SpringBootApplication标记为springboot配置类。

内含@SpringBootConfiguration-》@Configuration内涵@ComponentScan

内嵌tomcat

spring-boot-starter-web中有spring-boot-starter-tomcat有tomcat-embed-core。

程序启动就是通过这个tomcat的核心core发布的。

当然,我们也可将其换为:

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId></dependency>

Jetty比Tomcat更轻量级,可扩展性更强(相较于Tomcat),谷歌应用引擎(GAE)已经全面切换为Jetty。

RestFul风格开发

@Controller与@ResponseBody=@RestController,设置当前controller为restFul风格

/*@Controller
@ResponseBody*/
@RestController("/users")//同时提取下面restfu风格的统一路径
public class UserController {
/*    @RequestMapping("/save")@ResponseBodypublic String save(@RequestBody User user){System.out.println("user save"+user);return "{'model':'user save'}";//手写json}@RequestMapping("/delete")@ResponseBodypublic String delete(Integer id){System.out.println("user delete"+id);return "{'model':'user delete'}";}@RequestMapping("/update")@ResponseBodypublic String update(@RequestBody User user){System.out.println("user update"+user);return "{'model':'user update'}";}*///restful//@RequestMapping(value = "/users",method = RequestMethod.POST)改为如下@PostMapping//@ResponseBody 提到controller上了public String save2(@RequestBody User user){System.out.println("user save"+user);return "{'model':'user save'}";//手写json}//@RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)改为如下@DeleteMapping("/{id}")//@ResponseBody 提到controller上了public String delete2(@PathVariable("id") Integer id){System.out.println("user delete"+id);return "{'model':'user delete'}";}//@RequestMapping(value = "/users",method = RequestMethod.PUT)改为如下@PutMapping//@ResponseBody 提到controller上了public String update2(@RequestBody User user){System.out.println("user update"+user);return "{'model':'user update'}";}//@RequestMapping(value = "/users/{id}",method = RequestMethod.GET)改为如下@GetMapping("/{id}")//@ResponseBody 提到controller上了public String getById(@PathVariable("id") Integer id){System.out.println("user getById"+id);return "{'model':'user getById'}";}//@RequestMapping(value = "/users",method = RequestMethod.GET)改为如下@GetMapping//@ResponseBody 提到controller上了public String getAll(){System.out.println("user getaLL");return "{'model':'user getaLL'}";}
}

@RequestBody与@RequestParam与@PathVariable的区别:

@RequestParam用于接收url地址传参或表单传参

@RequestBody用于接收json数据
@PathVariable用于接收路径参数,使用{参数名称}描述路径参数
后期开发中:

发送请求参数超过1个时,以json格式为主,@RequestBody应用较广

如果发送非json格式数据,选用@RequestParam接收请求参数

采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值

SpringBoot复制工程文件夹模板

详见springboot基础篇(4)开头部分

SpringBoot配置文件yml等

默认配置文件application.properties

敲下有提示:比如

server.port=80
#关闭启动banner显示
# spring.main.banner-mode=off
#换成当前文件夹下的其他图片
# spring.banner.image.location=logo.png
# 日志级别 info \debug\error
logging.level.root=info

查询boot配置的网址 

Spring Boot Reference Documentation

springboot的配置文件application.properties是关联pom中的start-web包的,是关联服务器的。所以springboot的每一个配置使用的是它对应的一项技术。

yml

resource新建file起名application.yml,并将原来application.properties删除或移到resource下bak文件夹。

server:port: 81#关闭启动banner显示
spring:main:banner-mode: off#换成当前文件夹下的其他图片banner:image:location: logo.png# 日志级别 info \debug\error
logging:level:root: info

idea有提示 

yaml

resouce下,我们将yml文件扔到bak文件夹中,再创建一个application.yaml

内容同上yml,port改为82. maven clean后重启

如果resource下三种配置共存优先级

三个配置工程优先级properties>yml>yaml

不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留

只是起冲突的内容才会用到上面优先级。

设置yaml文件idea识别为boot配置(yaml无提示)

右上角项目结构->facets->spring(绿色)选择当前项目点进,点右侧上方菜单最会一个boot配置按钮(customize spring boot按钮),点菜单加号,选择本项目yaml和yml文件即可。

可删除properties文件,如果你创建配置名叫application1111.yml,也可在上述boot配置让其识别为boot配置文件。

yml格式语法规范

yml重数据而轻格式。XML格式明显。

大小写敏感
属性层级关系使用多行描述,每行结尾使用冒号结束
使用缩进表示层级关系,同层级左侧对齐,只允许使用2个空格(不允许使用Tab键)

属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
#表示注释

yml定义属性和读取属性

# 自定义yml属性
country: 英国
birthday: 2002-11-15
user:name: kdyage: 22
user2:name: 张三age: 22
# 单个数组
fruit:- apple- banana
#  单个数组
fruit2: [apple,banana,pain apple]
#对象数组
userList:- name: zhangsanage: 18- name: lisiage 17
#对象数组
userlist3: [{name:zhangsan,age:18},{name:lisi,age:17}]
#对象数组
userList2:-name: zhangsanage: 18-name: lisiage 17

@Value读取yml中写的属性

@RestController
@RequestMapping("/books")
public class BookController {@Value("${country}")private String country;@Value("${user.name}")private String name;@Value("${fruit[1]}")private String fruit;@Value("${userList[0].name}")private String listName;@GetMappingpublic String getById(){System.out.println("springboot is running...");System.out.println(country);System.out.println(name);System.out.println(fruit);System.out.println(listName);return "springboot is running";}
}

或使用自动装配,封装全部yml属性@Autowired    private Environment env;

@RestController
@RequestMapping("/books")
public class BookController {@Autowiredprivate Environment env;//import org.springframework.core.env.Environment;@GetMappingpublic String getById(){System.out.println(env.getProperty("country"));System.out.println(env.getProperty("user.name"));System.out.println(env.getProperty("fruit[1]"));System.out.println(env.getProperty("userList[0].name"));return "springboot is running";}
}

或封装部分yml属性

datasource:driver: com.mysql.jd.Driverurl: jdbc:mysql://localhost/springboot_dbusername: rootpassword: root123456

 随便找个地方建一个对应的类

@Component//spring接管
@ConfigurationProperties(prefix = "datasource")//yml中的属性名
public class MyDataSource {private String driver;private String url;private String username;private String password;//提供set方法,以便spring自动装配使用public void setDriver(String driver) {this.driver = driver;}public void setUrl(String url) {this.url = url;}public void setUsername(String username) {this.username = username;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "MyDataSource{" +"driver='" + driver + '\'' +", url='" + url + '\'' +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

自动装配

@RestController
@RequestMapping("/books")
public class BookController {@Autowiredprivate MyDataSource myDataSource;@GetMappingpublic String getById(){System.out.println(myDataSource);return "springboot is running";}
}

yml属性引用当前yml的其他属性

baseDir: d:\img
tempDir: "${baseDir}\a.txt"  #加上引号,转义为字符串

如果属性中出现特殊字符,可以使用双引号包裹起来作为字符解析。

springboot整合第三方技术

1.junit

springboot项目中pom自带的spring-boot-starter-test集成了junit

可找到结构test目录下自动生成的测试类,@Autowired注入某个bean,就可在方法中调用该bean的方法

@SpringBootTest
class SpringbootBeginQuickstartApplicationTests {@Autowiredprivate BookDaoImpl bookDao;@Testvoid contextLoads() {bookDao.save();}
}

 新建测试类

如果新建测试类在引导类所在的包及其子包下的话,如引导类在mian中Java中的com.kdy,且要新建的测试类在test目录中的java的com.kdy及子包下,这时类上方只需加上@SpringBootTest,可注入,可用@Test测试。

但如果如果新建的测试类不在引导类所在的包及其子包下,注解需要加上引导类字节码

@SpringBootTest(classes = SpringbootBeginQuickstartApplication.class)

2.Mybatis

创建boot项目,除了勾选web下pring Web依赖,也可在勾选SQL里的 mybatis Framewok,和Mysql Driver。不勾选自己加也行,如下:

<!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.3</version></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>

 然后,domain写个实体类,可以lombok加上,然后mapper包只需写一个BookMapper的接口。

接口中类上方只需加上一个boot整合muybatis的注解@Mapper即可,然后可用注解的方式写sql,在厕所类中注入后调用测试即可。

@Mapper//用在接口类上,在编译之后会生成相应的接口实现类
public interface BookMapper {@Select("select * from book where id = #{id}")public Book getBookById(@Param("id") Integer id);
}

也可在resource下创建和mapper接口同一个包路径的mapper.xml,复制头文件在里面写sql语句,不用sql注解了。

如果版本问题运行出现时区问题,需在url后加上?serverTimezon=UTC 

3.Mybatis-Plus

创建项目时可用阿里云的镜像

Choose starter service URL:  选择 Custom:  https://start.aliyun.com,先勾选spring web依赖,在勾选关系型数据库mybatisPlus和mysql drver,会引入以下依赖:

		<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency>

 mapper包只需写一个BookMapper的接口:

@Mapper
public interface BookMapper extends BaseMapper<Book> {
}

无需注解写sql或mapper.xml写sql,mp中有很多增删改查的api ,需要类名和数据表名及相关属性名称对应起来。

也可在yml中配置mp的参数如

mybatis-plus:global-config:db-config:table-prefix: tab_ #如果实体类叫Book,数据表名叫tab_book,可配置这个

4.Druid

阿里巴巴的包手动导包,我们配合mybatis和mysql使用

		<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.1</version></dependency>
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/jdbcusername: rootpassword: root123type: com.alibaba.druid.pool.DruidDataSource #非整合方式配置duird
spring:datasource:druid: #整合方式配置driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/jdbcusername: rootpassword: root123

运行mybatis的测试即可,测试mybatis接口方法。

总结

导包普通包或starter,配置yml属性,使用、测试、运行

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

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

相关文章

k8s概念-DaemonSet

回到目录 参考链接https://v1-23.docs.kubernetes.io/zh/docs/concepts/workloads/controllers/daemonset/ DaemonSet 确保全部&#xff08;或者某些&#xff09;节点上运行一个 Pod 的副本 当节点加入到K8S集群中&#xff0c;pod会被&#xff08;DaemonSet&#xff09;调度到…

【AI】《动手学-深度学习-PyTorch版》笔记(九):从零开始实现线性回归的训练

AI学习目录汇总 1、生成数据 在深度学习中,用来训练的数据集通过标注来实现。 咱们在这一步使用函数来生成一组数据集 1.1 定义数据生成函数 定义数据生成函数:synthetic_data %matplotlib inline import random import torch from d2l import torch as d2l def synthet…

【开源源码学习】

C 迷你高尔夫 一款打高尔夫的游戏。亮点是碰撞反应和关卡设计。 GitHub - mgerdes/Open-Golf: A cross-platform minigolf game written in C. TypeScript 俄罗斯方块 复刻经典的俄罗斯方块&#xff0c;项目采用ReactReduxImmutable的技术栈。 GitHub - chvin/react-tetr…

使用Canvas制作画板

使用Canvas制作画板 在本篇技术博客中&#xff0c;我们将使用JavaScript和Canvas技术来创建一个简单的画板应用程序。这个画板将允许用户在一个画布上绘制线条&#xff0c;使用橡皮擦擦除绘制的内容&#xff0c;更改线条的颜色和宽度&#xff0c;并支持撤销和重做功能。 准备…

go interface和nil可以比较吗?

2个 interface 比较 Go语言中&#xff0c;interface的内部实现包含了 2 个字段&#xff0c;类型 T 和 值V&#xff0c;interface 可以使用 或 ! 进行比较。 2 个 interface 相等有以下两种情况&#xff1a; 两个 interface 均等于 nil &#xff08;此时 V 和 T 都处于 unse…

检查 CPU 的上下文切换

一.什么是cpu上下文切换 CPU 上下文切换是操作系统在多任务环境下管理进程的一项关键任务。在现代计算机系统中&#xff0c;有多个进程同时运行&#xff0c;每个进程都需要一定的 CPU 时间来执行其任务。由于 CPU 在某一时刻只能执行一个进程的指令&#xff0c;因此操作系统需…

MySQL内置函数使用说明

MySQL函数使用说明 MySQL 是一个流行的关系型数据库管理系统&#xff0c;它提供了许多内置函数来处理和操作数据。这些函数可以简化数据库查询和操作的过程&#xff0c;提高代码的可读性和效率。以下是一些常见的 MySQL 内置函数及其使用说明和示例。 数值函数 ABS() 函数原…

静态资源导入探究

静态资源可以在哪里找呢&#xff1f;我们看看源码 从这个类进去 里面有个静态类 WebMvcAutoConfigurationAdapter 有个配置类&#xff0c;将这个类的对象创建并导入IOC容器里 这个静态类下有个方法 addResourceHandlers(ResourceHandlerRegistry registry)静态资源处理器 若自…

[软件工程] 架构映射战略设计方案模板

3 系统上下文 结合全局分析阶段获得的价值需求&#xff08;利益相关者、系统愿景、系统范围&#xff09;确定系统上下文&#xff0c;体现用户、目标系统与伴生系统之间的关系。 3.1 概述 绘制系统上下文图&#xff0c;明确解空间的系统边界。 3.2 系统协作业务流程1…n 根据全局…

从零实现深度学习框架——Transformer从菜鸟到高手(一)

引言 &#x1f4a1;本文为&#x1f517;[从零实现深度学习框架]系列文章内部限免文章&#xff0c;更多限免文章见 &#x1f517;专栏目录。 本着“凡我不能创造的&#xff0c;我就不能理解”的思想&#xff0c;系列文章会基于纯Python和NumPy从零创建自己的类PyTorch深度学习框…

【环境配置】Windows下WSL将ubuntu挪位置-系统盘清理

问题–垃圾太多&#xff0c;系统盘空间占用太大 最近 C 盘空间暴涨&#xff0c;用工具 WinDirStat-强烈推荐的工具 查看发现 WSL 子系统占用了6个多 G 的空间&#xff0c;遂想办法挪个位置&#xff1b; 【关键字】将 Windows 里的子系统挪到非系统盘 D 盘&#xff1b; 解决 打…

Redis 序列化器和持久化

Redis 序列化器 针对数据的序列化/反序列化提供了多种可选择策略 比如RedisSerializer&#xff0c;接下来我们详细看看 1、JdkSerializationRedisSerializer 用于 POJO 对象的存取场景&#xff0c;使用 JDK 本身序列化机制&#xff0c;将 pojo 类通过ObjectInputStream/Object…

生产服务器突然本机无法访问本机IP的端口

生产服务器突然本机无法访问本机IP的端口 一、现象描述 生产服务器突然无法访问自己本机IP地址的端口&#xff0c;通过localhost或者127.0.0.1都可以正常访问 二、问题分析 服务器是搭建在虚拟机上面&#xff0c;起初由于服务器内存不足的原因&#xff0c;导致了服务器故障无…

Rust-调用C程序

在Rust中调用C语言的代码需要以下几个步骤&#xff1a; 编写或获得C语言的代码。创建Rust的外部函数接口&#xff08;FFI&#xff09;。使用Rust的unsafe块调用C函数。 下面我们通过一个例子来演示这个过程。 假设我们有一个C语言函数&#xff0c;用于交换两个整数&#xff…

深度学习环境配置pytorch-GPU版本

一、下载与安装Anaconda 官网&#xff1a;https://www.anaconda.com/download 安装时添加环境变量勾选上&#xff0c;这样可以减少一步操作&#xff0c;不用再去自己手动添加了。 二、在anaconda里面创建虚拟环境 创建虚拟环境&#xff0c;其中pytorch为虚拟环境名&#xff0c;…

UNet 系列:做医学图像分割的任何人,都必须要会使用 nnU-Net

UNet 系列 UNet下采样和上采样跳跃连接 UNet&#xff1a;多层级和多尺度的密集链接nnUNet集成模型预处理训练过程推理后处理4行命令使用 nnUNet 训练自己的医学图像分割模型 UNet 经典的卷积神经网络都很深&#xff0c;越深的卷积层越适合处理大目标的东西&#xff0c;而医学病…

golang自带的命令行解析库flag库实践

1. 简介 flag用于解析命令行选项。有过类 Unix 系统使用经验的童鞋对命令行选项应该不陌生。例如命令ls -al列出当前目录下所有文件和目录的详细信息&#xff0c;其中-al就是命令行选项。 命令行选项在实际开发中很常用&#xff0c;特别是在写工具的时候。 指定配置文件的路径…

爆改vue3 setup naiveui可编辑table

使用naiveui官网的可编辑table总是报错&#xff0c;所以手写了一个 思路&#xff1a;table数据数组unitMsgArr对应一个布尔的数组isEditArr &#xff0c;点击table可编辑的行数据的时候&#xff0c;更改对应的isEdit为true&#xff0c;此时渲染组件EditCom&#xff0c;在EditC…

flask---》登录认证装饰器/配置文件/路由系统

登录认证装饰器 # 0 装饰器的本质原理-# 类装饰器&#xff1a;1 装饰类的装饰器 2 类作为装饰器 # 1 装饰器使用位置&#xff0c;顺序 # 3 flask路由下加装饰器&#xff0c;一定要加endpoint-如果不指定endpoint&#xff0c;反向解析的名字都是函数名&#xff0c;不加装饰器…

【数据可视化】(一)数据可视化概述

目录 0.本章节概述 一、数据可视化 1、什么是数据可视化? 2、数据可视化的好处 3、数据可视化的用途 二、数据探索 1、数据相关工具的使用情景: 2、探索性查询 三、数据挑战 1、什么是数据挑战?