springboot(一)
基础
1.介绍与入门
1.1介绍
- SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。
- Spring程序缺点
- 依赖设置繁琐
- 以前写Spring程序,使用的技术都要自己一个一个的写,现在一个坐标搞定
- 配置繁琐
- 以前写配置类或者配置文件,然后用什么东西就要自己写加载bean这些东西,现在什么都不用写
- 依赖设置繁琐
- SpringBoot程序的核心功能及优点
- 起步依赖(简化依赖配置)
- 依赖配置的书写简化就是靠这个起步依赖达成的
- 自动配置(简化常用工程相关配置)
- 配置过于繁琐,使用自动配置就可以做响应的简化,但是内部还是很复杂的
- 辅助功能(内置服务器,……)
- 除了上面的功能,其实SpringBoot程序还有其他的一些优势
- 起步依赖(简化依赖配置)
- Spring程序缺点
1.2SpringBoot的四种创建方式
①idea官方创建
-
创建新模块→Spring Initializr
- 配置相关的信息
- 选择的java版本和电脑上安装的jdk版本对应即可,但是最低要求为jdk8
- 点击下一步时,idea需要为联网状态,否则无法跳转到下一页,只会一直转圈圈
- 配置相关的信息
-
选择当前模块需要使用的技术集
- 右下角出现新的内容项即为勾选成功
- 右下角出现新的内容项即为勾选成功
-
创建控制器类
-
@RestController @RequestMapping("/books") public class BookController { @GetMapping public String getById(){ System.out.println("springboot--测试----11111"); return "springboot--测试----11111"; } }
-
-
运行自动生成的application类
-
然后打开浏览器,输入
http://localhost:8080/books
访问即可
②官网创建
- 打开Spring的官网,打开SpringBoot的目录
https://spring.io/projects/spring-boot
,拉到底下- 点击蓝色的字体
- 点击蓝色的字体
- 这里和idea创建的流程一样
- 点击
CENERATE
- 下载之后就是一个springboot过程文件夹的压缩包了
- 解压缩此文件后,得到工程目录,在Idea中导入即可
③idea阿里云创建
- 创建新模块→Spring Initializr
- 地址:http://start.aliyun.com或https😕/start.aliyun.com
- 其他配置和idea官方的创建一致
- 阿里云提供的工程创建地址初始化完毕后和实用SpringBoot官网创建出来的工程略有区别。
- 主要是在配置文件的形式上有区别。
④手工创建(无需联网)
-
创建一个maven项目
-
参照标准SpringBoot工程的pom文件,书写自己的pom文件
-
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.2</version> </parent> <artifactId>SpringBoot</artifactId> <groupId>com.example</groupId> <version>0.0.1-SNAPSHOT</version> <modelVersion>4.0.0</modelVersion> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> </project>
-
需要用什么技术集就将它的依赖导入即可
-
-
创建一个
Application
类.将application的代码写上-
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class); } }
-
1.3隐藏指定文件/文件夹
- 打开设置
Editor
→File Types
→Ignored Files and Folders
- 输入要隐藏的名称,支持*号通配符,点击确认即可
1.4简化操作的方面体现
①parent
- SpringBoot将所有的技术版本的常见使用方案给整理出来,以后开发者使用时直接用它提供的版本方案称为
parent
parent
自身具有很多个版本,每个parent
版本中包含有几百个其他技术的版本号,不同的parent
间使用的各种技术的版本号有可能会发生变化。当开发者使用某些技术时,直接使用SpringBoot提供的parent
就行了,由parent
帮助开发者统一的进行各种技术的版本管理- parent定义出来以后,并不是直接使用的,仅仅给了开发者一个说明书,但是并没有实际使用
②starter
- SpringBoot把所有的技术使用的固定搭配格式都给开发出来称为
starter
starter
定义了使用某种技术时对于依赖的固定搭配格式,也是一种最佳解决方案,使用starter可以帮助开发者减少依赖配置
③starter与parent的区别
-
starter是一个坐标中定了若干个坐标,以前写多个的,现在写一个,是用来减少依赖配置的书写量的
-
parent是定义了几百个依赖版本号,以前写依赖需要自己手工控制版本,现在由SpringBoot统一管理,这样就不存在版本冲突了,是用来减少依赖冲突的
-
实际开发应用方式
-
实际开发中如果需要用什么技术,先去找有没有这个技术对应的starter
- 如果有对应的starter,直接写starter,而且无需指定版本,版本由parent提供
- 如果没有对应的starter,手写坐标即可
-
实际开发中如果发现坐标出现了冲突现象,确认你要使用的可行的版本号,使用手工书写的方式添加对应依赖,覆盖SpringBoot提供给我们的配置管理
-
方式一:直接写坐标
-
方式二:覆盖
中定义的版本号,就是下面这堆东西了,哪个冲突了覆盖哪个就OK了 <properties> <activemq.version>5.16.3</activemq.version> <aspectj.version>1.9.7</aspectj.version> <assertj.version>3.19.0</assertj.version> <commons-codec.version>1.15</commons-codec.version> <commons-dbcp2.version>2.8.0</commons-dbcp2.version> <commons-lang3.version>3.12.0</commons-lang3.version> <commons-pool.version>1.6</commons-pool.version> <commons-pool2.version>2.9.0</commons-pool2.version> <h2.version>1.4.200</h2.version> <hibernate.version>5.4.32.Final</hibernate.version> <hibernate-validator.version>6.2.0.Final</hibernate-validator.version> <httpclient.version>4.5.13</httpclient.version> <jackson-bom.version>2.12.4</jackson-bom.version> <javax-jms.version>2.0.1</javax-jms.version> <javax-json.version>1.1.4</javax-json.version> <javax-websocket.version>1.1</javax-websocket.version> <jetty-el.version>9.0.48</jetty-el.version> <junit.version>4.13.2</junit.version> </properties>
-
-
④引导类
-
SpringBoot本身是为了加速Spring程序的开发的,而Spring程序运行的基础是需要创建自己的Spring容器对象(IoC容器)并将所有的对象交给Spring的容器管理,也就是一个一个的Bean。
-
SpringBoot加速开发Spring程序,当前这个类运行后就会产生一个Spring容器对象,并且可以将这个对象保存起来,通过容器对象直接操作Bean。
-
@SpringBootApplication public class Springboot0101QuickstartApplication { public static void main(String[] args) { ConfigurableApplicationContext ctx = SpringApplication.run(Springboot0101QuickstartApplication.class, args); BookController bean = ctx.getBean(BookController.class); System.out.println("bean======>" + bean); } }
-
-
其实SpringBoot程序启动还是创建了一个Spring容器对象。这个类在SpringBoot程序中是所有功能的入口,称这个类为引导类。
-
作为一个引导类最典型的特征就是当前类上方声明了一个注解@SpringBootApplication
⑤内嵌tomcat
-
内嵌Tomcat定义位置
- starter-web里面导入了一个核心的坐标,tomcat-embed-core,叫做tomcat内嵌核心。就是这个东西把tomcat功能引入到了我们的程序中。
-
内嵌Tomcat运行原理
- tomcat服务器运行其实是以对象的形式在Spring容器中运行的
- 运行的是上面的tomcat内嵌核心
-
更换内嵌Tomcat
-
SpringBoot提供了3款内置的服务器
-
tomcat(默认):apache出品,粉丝多,应用面广,负载了若干较重的组件
-
jetty:更轻量级,负载性能远不及tomcat
-
undertow:负载性能勉强跑赢tomcat
-
-
<!--直接添加坐标即可,以jetty为例--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>
-
2.基础配置
2.1属性配置
-
SpringBoot通过配置文件application.properties就可以修改默认的配置
-
修改端口
-
server.port=80
-
-
关闭运行日志图表
-
spring.main.banner-mode=off
-
-
设置运行日志的显示级别
-
logging.level.root=debug
-
-
-
查看对应的配置项
- 打开网址:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties
- 打开查看附录中的Application Properties就可以获取到对应的配置项了
-
配置项和使用的技术依赖有关,如果把相关的技术依赖去掉了就无法修改配置
2.2配置文件分类
-
SpringBoot除了支持properties格式的配置文件,还支持另外两种格式的配置文件。
- properties
server.port=80
- yml
server: port: 81
- yaml
server: port: 82
- yml和yaml文件格式就是一模一样的,只是文件后缀不同
- port:的后面要有一个空格
-
配置文件优先级
-
properties > yml > yaml
-
不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留
-
-
自动提示功能消失
- 打开设置,【Files】→【Project Structure...】
- 在弹出窗口中左侧选择【Facets】,右侧选中Spring路径下对应的模块名称,也就是自动提示功能消失的那个模块
- 点击Customize Spring Boot按钮
- 选择添加配置文件,然后选中要作为配置文件的具体文件就OK了
2.3yaml文件
-
SpringBoot的配置以后主要使用yml结尾的这种文件格式,并且在书写时可以通过提示的形式加载正确的格式。
-
YAML(YAML Ain't Markup Language),一种数据序列化格式。具有容易阅读、容易与脚本语言交互、以数据为核心,重数据轻格式的特点。
-
常见的文件扩展名有两种:
-
.yml格式(主流)
-
.yaml格式
对于文件自身在书写时,具有严格的语法格式要求
- 大小写敏感
- 属性层级关系使用多行描述,每行结尾使用冒号结束
- 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
- 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
-
号 表示注释
- yaml格式中也可以表示数组,在属性名书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔
-
-
2.4yaml数据读取
-
读取单一数据
-
使用@Value可以读取单个数据,属性名引用方式:${一级属性名.二级属性名……}
- 使用@Value注解时,要将该注入写在某一个指定的Spring管控的bean的属性名上方
- 使用@Value注解时,要将该注入写在某一个指定的Spring管控的bean的属性名上方
-
读取全部数据
- 把所有的数据都封装到这一个对象中,这个对象叫做Environment,使用自动装配注解可以将所有的yaml数据封装到这个对象中
- 数据封装到了Environment对象中,获取属性时,通过Environment的接口操作进行,具体方法时getProperties(String),参数填写属性名即可
- 把所有的数据都封装到这一个对象中,这个对象叫做Environment,使用自动装配注解可以将所有的yaml数据封装到这个对象中
-
读取对象数据
-
首先定义一个对象,并将该对象纳入Spring管控的范围,也就是定义成一个bean,然后使用注解@ConfigurationProperties指定该对象加载哪一组yaml中配置的信息。
-
这个@ConfigurationProperties必须告诉他加载的数据前缀是什么,这样当前前缀下的所有属性就封装到这个对象中。记得数据属性名要与对象的变量名一一对应啊,不然没法封装。其实以后如果你要定义一组数据自己使用,就可以先写一个对象,然后定义好属性,下面到配置中根据这个格式书写即可。
-
-
yaml文件中的数据引用
-
baseDir: /usr/local/fire center: dataDir: ${baseDir}/data tmpDir: ${baseDir}/tmp logDir: ${baseDir}/log msgDir: ${baseDir}/msgDir
-
如果需要使用转义字符,需要将数据字符串使用双引号包裹起来
lesson: "Spring\tboot\nlesson"
-
-
3.SSMP整合
3.1整合JUnit
-
SpringBoot将没有技术含量的内容书写进行开发简化,能走默认值的走默认值,能不写的就不写
-
@SpringBootTest class Springboot04JunitApplicationTests { //注入你要测试的对象 @Autowired private BookDao bookDao; @Test void contextLoads() { //执行要测试的对象对应的方法 bookDao.save(); System.out.println("two..."); } }
-
-
加载的配置类或者配置文件是前面启动程序使用的引导类。手工指定引导类
-
在注解@SpringBootTest中添加classes属性指定配置类
@SpringBootTest(classes = Demo3.class)
-
使用@ContextConfiguration注解进行
@ContextConfiguration(classes = Demo3.class)
-
3.2.整合MyBatis
-
创建模块时勾选要使用的技术
-
MyBatis
-
对应数据库
-
手工导入对应的技术的starter和数据库的坐标
<dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies>
-
-
配置数据源相关信息
-
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ssm username: root password: 1234
-
-
创建实体类
-
public class Book { private Integer id; private String type; private String name; private String description; }
-
-
创建
Dao
类-
@Mapper public interface BookDao { @Select("select * from tbl_book where id = #{id}") public Book getById(Integer id); }
-
-
创建测试类
-
@SpringBootTest class Springboot05MybatisApplicationTests { @Autowired private BookDao bookDao; @Test void contextLoads() { System.out.println(bookDao.getById(1)); } }
-
3.3整合MyBatis-Plus
-
导入对应的starter
-
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency>
-
如果使用的是官网的方式创建的没有mybatisPlus的选项勾选的,阿里云的创建方式有
-
-
配置数据源相关信息
-
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ssm username: root password: 1234
-
-
创建实体类
-
public class Book { private Integer id; private String type; private String name; private String description; }
-
-
创建
Dao
类-
@Mapper public interface BookDao { @Select("select * from tbl_book where id = #{id}") public Book getById(Integer id); }
-
-
创建测试类
-
@SpringBootTest class Springboot05MybatisApplicationTests { @Autowired private BookDao bookDao; @Test void contextLoads() { System.out.println(bookDao.getById(1)); } }
-
3.4整合Druid
-
在没有指定数据源时,配置如下
-
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ssm?serverTimezone=Asia/Shanghai username: root password: 1234
-
此时虽然没有指定数据源,但是SpringBoot帮我们选了一个它认为最好的数据源对象,这就是HiKari。
-
-
更换数据源
-
导入对应的坐标(注意,是坐标,此处不是starter)
<dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency> </dependencies>
-
修改配置,在数据源配置中有一个type属性,专用于指定数据源类型
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC username: root password: 1234 type: com.alibaba.druid.pool.DruidDataSource
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?