SpringBoot

SpringBoot

SpringBoot是以简化Spring应用的初始搭建以及开发过程

入门案例

首先创建一个空项目,然后在设置中检查maven的仓库地址和配置文件地址是否为自己设置的地址,不是则进行修改。

接着右键空项目,点击新建,新建模块,点击Spring Initializer,具体配置可以参考下图
在这里插入图片描述

设置好后,点击下一步,进入下一步设置
在这里插入图片描述

注意:SpringBoot2使用的jdk版本为1.8,而SpringBoot3使用的jdk版本为17,所以jdk版本要匹配boot版本,否则会导致程序启动失败。

然后就是静静的等待其资源加载完毕。

加载完成之后,会发现生成了一大堆东西(如果不想看见这么多东西也有解决办法,以后只要有不想看见的文件都可以通过这样屏蔽掉)。
在这里插入图片描述

其中最熟悉的还是maven代码风格的src目录,springboot还贴心的给你在刚才设置的软件包下面添加了一个引导类,注意,这不像maven自身生成的开始代码(没用,基本都直接删了),所以这个不能随意删除,因为它也被称为springBoot程序的入口。
在这里插入图片描述

此时,直接创建一个控制器类,在里面随意写一些代码

package code.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @创建人 HeXin
 * @所属包 BookController
 * @所属项目 SpringBoot
 * @创建时间 2023/4/3 21:55
 * @描述 SpringBoot入门案例
 */
//Rest模式
@RestController
@RequestMapping("/books")
public class BookController {
	@GetMapping
	public String testGet(){
		System.out.println("Hello!SpringBoot!");
		return "Hello!SpringBoot!";
	}
}

然后,直接点击运行键开始运行(或者直接点击右键入口文件,然后点击运行即可)。对,你没听错,直接运行,不需要配置那些各种各样的配置类,也不用配置Tomcat(因为SpringBoot将Tomcat服务器作为对象内嵌至Spring容器中进行运行),可以直接运行这个程序。

运行成功的后,会出现下面的效果
在这里插入图片描述

这个就是boot程序的标志,还有一些运行的日志。
在这里插入图片描述

此时,boot程序已经成功运行,它与tomcat运行程序不同,它并没有直接跳出浏览器访问程序的首页,而是需要自己手动输入网址访问。那么,就先输入网址测试一下是否能够访问成功。
在这里插入图片描述

发现控制台确实也打印了该字符串,说明程序已经成功运行~

一个最基本的SpringBoot就已经创建好了。

对比一下Spring与SpringBoot程序,才发现没有对比就没有伤害

类/配置文件SpringSpringBoot
pom文件中的坐标手动添加勾选添加
web3.0配置类(web.xml)手动添加
Spring/SpringMVC配置类(springMVC.xml)手动添加
控制器手动添加手动添加

从对比表中可以看出,SpringBoot帮我们省去了很多写配置文件的时间,真正做到了简化开发。

它的有点有:

  1. 起步依赖(简化了依赖配置)
  2. 自动配置(简化了常用工程相关的配置)
  3. 辅助功能(内置有服务器,不需要自己手动配置TomCat服务器)

好了,通过这个简单的入门案例,总结一下:

  1. 开发SpringBoot程序可以根据上述步骤联网快速制作。(注意,这里一定要联网创建,否则会创建失败)
  2. SpringBoot2程序需要基于JDK8进行制作。
  3. SpringBoot程序中需要使用什么技术或功能直接在创建的时候勾选即可。
  4. 运行SpringBoot程序可以通过运行Application程序入口进行。

补充:如果无法访问springBoot官网的状态下如何创建SpringBoot程序
在这里插入图片描述

当然,因为idea创建的时候用的springboot是国外的网站,如果出现了网速不好,无法访问的时候,可以使用国内的网站创建,比如阿里云就为我们提供了一个创建网站
在这里插入图片描述

分析

通过查看SpringBoot中的pom.xml文件的配置可以对其程序进行分析

starter

SpringBoot中常见项目名称,定义了当前项目所使用的所有依赖坐标,以达到减少依赖配置的目的。开发SpringBoot程序需要导入坐标时通常导入对应的starter。每个不同的starter根据功能的不同,通常包含多个依赖坐标。

parent

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

实际开发

  • 在使用任意坐标时,仅仅书写GAV(groupId、artifactId、version)中的G和A即可,而V是由SpringBoot提供,除非SpringBoot未提供对应版本V(如durid)
  • 如发生坐标错误,再指定Version(小心版本冲突)

再查看引导类(SpringBootDay01Application.java)

通过查看该类上的注解的源代码得知,其就是一个Spring的容器,是一个组件扫描类,也是一个配置类。
在这里插入图片描述

在这里插入图片描述

所以,当所有的控制器都放置在引导类目录或其下级目录时就会被全部扫描并放入容器中,可以直接使用,相反,如果控制器放在引导类目录之上,它将无法扫描到该控制器,也就无法使用

可以得知:

  • SpringBoot的引导类是Boot工程的执行入口,运行main方法就可以启动项目
  • SpringBoot工程运行后初始化Spring控制器,扫描引导类所在包加载bean

补充

SpringBoot内置服务器

  1. Tomcat(默认):apache,应用面广,负载了若干较重的组件
  2. Jetty:更轻量级,负载性能远不及Tomcat
  3. Undertow:负载性能勉强跑赢Tomcat

属性配置

SpringBoot默认配置文件application.properties,可以在这个文件中修改配置信息,只需要将需要修改的配置信息写在前面,然后用等号链接其修改后的值(类似于键值对),如修改服务器端口号(server.port=80,将服务器的端口号修改为80),不需要将所有配置单词都记住,大概记住几个字母,idea会有提示的。如果实在什么都不知道,可以直接商SpringBoot官网上查询,查询地址:Common Application Properties

tips:在网页中按Ctrl+F可以打开搜索功能。

SpringBoot提供了三种配置文件的格式:

  • properties(默认格式/传统格式)
  • yml(主流格式)
  • yaml

配置文件之间加载的优先级:properties>yml>yaml

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

yml(和yaml)语法规则:

  1. 大小写敏感
  2. 属性层级关系使用多行描述,每行结尾使用冒号结束
  3. 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
  4. 属性值前面要添加空格(属性名与属性值之间使用冒号和空格隔开->规则)
  5. 使用~表示null
  6. 使用双引号包裹特殊字符(比如字符之间有空格)
  7. 日期必须使用yyyy-MM-dd格式,时间和日期之间使用T连接,最后使用+代表时区
  8. 数组表示方式:在属性名书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间用空格隔开。
  9. 属性值中出现转义字符,需使用双引号进行包裹

代码演示

# 单个数据
country: China
judge: true
time: 2022-06-09

# 对象数据
user:
  name: wlm
  age: 18
  email: wlm@qq.com

# 多层级数据
a:
  b:
    c:
      d: Hello!

# 数组
# 格式一:
hobbies:
  - Java
  - Go
  - Python
  - C++
  -
# 格式二:
likes: [sleep,game,music]

# 对象数组
# 格式一:
users:
  -
    name: xiaoming
    age: 20
    email: xiaoming@qq.com
  -
    name: xiaohong
    age: 19
    email: xiaohong@qq.com

# 格式二:
person: [{name: lihua,age: 21,email: lihua@sina.com},{name: Tom,age: 28,email: tommon.@163.com}]

# 引用数据
baseDir: D:\Users\Java
tempDir: ${baseDir}\SpringBoot

属性配置完成了,应该如何读取呢?

代码演示

读取单个数据

//读取单独数据
@Value("${country}")
private String country;

//读取多层级数据
@Value("${a.b.c.d}")
private String value;

//读取数组元素数据
@Value("${hobbies[0]}")
private String hobby;

//读取对象属性数据
@Value("${user.name}")
private String username;

//读取对象数组元素数据
@Value("${users[1].email}")
private String email;

//引用数据读取
@Value("${tempDir}")
private String tempDir;

通过代码可以看出,每读取一个属性时就要创建一个变量,属性值少还好,如果属性值一旦多了起来,那么就得生成很多变量,代码显得很冗余,有没有可以一键读取所有属性的东西呢?

当然,SpringBoot也想到了这个问题,所以出现了一个Environment对象,通过@Autowired自动装配就可以将所有的数据全部封装在其中。通过调用该对象中的getProperty方法,便可以实现与上面代码一样的功能。

代码演示

@Autowired
private Environment environment;

@GetMapping
public String testGet(){
    System.out.println("contry:"+environment.getProperty("contry"));
    System.out.println("username:"+environment.getProperty("user.name"));
    return "Hello!SpringBoot!";
}

此方式确实解决了单个数据对应单个属性的痛处,但是,该方法将所有属性全部塞进了一个对象中,以后找起来也是相当麻烦的,还要记住各种属性的名字才能找到其中的对应值。那么,还有没有可以将属性分类封装,就像利用Spring封装POJO一样,将一些数据性质相同或相关联的属性封装成一个对象,变成一个Bean的方式呢?

答案是肯定的,并且,这种方式在以后是使用最多的一种方式。那么,该如何实现呢?

首先创建一个与属性相对应的数据模型类,定义好其中的变量,通过@ConfigurationProperties和@Component两个注解指定需要将哪一组数据封装在此类中,将其封装好后交给Spring来进行管理。

举个例子吧,就将下面的属性及其属性值封装到一个对应类中

datasource:
  username: root
  password: 123456
  url: jdbc:mysql://localhost/springboot
  driver: com.mysql.jdbc.Driver

不难看出,这不就是jdbc.properties文件中的配置嘛。

定义一个对应的对象类:MyDataSource(防止与某些类发生冲突)

package code;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
 * @创建人 HeXin
 * @所属包 MyDataSource
 * @所属项目 SpringBoot
 * @创建时间 2023/4/5 11:18
 * @描述 数据模型
 */
@ConfigurationProperties("datasource") //其中的值就为需要封装的属性名
@Data //自动生成get、set、toString等一些常用的方法
@Component //配置类
public class MyDataSource {
	private String username;
	private String password;
	private String url;
	private String driver;
}

定义好后,进行测试

@Autowired
private MyDataSource myDataSource;
@GetMapping
public String test(){
    System.out.println("MyDataSource:"+myDataSource);
    return "Hello!SpringBoot!";
}

测试结果
在这里插入图片描述

控制台已经将该属性中的值以键值对的形式进行打印输出。

这里需要注意的是:

  1. 必须要使用@ConfigurationProperties注解绑定配置信息到封装类中
  2. 封装类必须要定义成Spring管理的bean(四大注解都可以:@Component、@Repository、@Service、@Controller,这里举例使用的只是其中的一个,但也习惯性常用@Component来定义),否则无法进行属性注入。

整合第三方技术

SpringBoot集合能力很强,可以兼容很多第三方技术,当然,在日常开发中,一些第三方技术也是相对好用的。所以,下面将通过学习几个实例,学会如何将第三方技术整合到SpringBoot中的。

整合JUnit

其实,SpringBoot在程序创建的时候已经自动将JUnit整合进去了,因为现在的boot工程本质还是一个maven工程,所以它的生命周期中就一定会有测试这一个环节,而测试一般都单元测试,所以boot在创建的时候就自动整合了Junit。

首先,创建一个新的模块,创建至这个页面的时候,什么都不要选,直接创建即可
在这里插入图片描述

等待创建完成。

加载完成之后,查看test包下的java中,会发现有一个跟引导类同名的测试类,类上有一个@SpringBootTest。那么它有什么用处呢?通过一个简单的DAO实例测试一下

代码演示

以保存图书为例创建一个BookDao以及其实现类

package code.DAO;
public interface BookDao {
	void save();
}
package code.DAO;
import org.springframework.stereotype.Repository;

@Repository
public class BookDaoImpl implements BookDao{
	@Override
	public void save () {
		System.out.println("保存图书信息...");
	}
}

然后在测试类中进行测试

package code;

import code.DAO.BookDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class SpringBootDay02ApplicationTests {
    //注入要测试的对象
	@Autowired
	private BookDao bookDao;
    
	@Test
	void contextLoads () {
		bookDao.save();
	}
}

测试的结果
在这里插入图片描述

当然,一切正常。说明该注解帮助我们将测试类进行管理,并完成对应的测试。可将该测试类放到了其对应目录的上层目录,或者将引导类放到其目录对应的下层目录时,再进行测试的时候发生了报错。

首先,编译的时候就发生了报错,报错信息为找不到该类型的bean,其实是测试类找不到引导类。
在这里插入图片描述

如果强制执行,则会抛出异常
在这里插入图片描述

异常让我们在@SpringBootTest注解或者@ContextConfiguration注解中中用一个classes的属性指明引导类的名,这样就可以帮助测试类找到相应的引导类。因为SpringBoot生成的测试方法中自带了@SpringBootTest注解,所以直接在@SpringBootTest注解加上classes属性,加上之后,便没有报错,且成功完成测试。

可是为什么这种情况会报错呢?其实SpringBoot在进行测试的时候,注入的bean对象是从Spring中的容器中拿取,而SpringBoot将Spring的容器交给了引导类管理,所以当引导类和测试类不在同一层目录及其以下,则测试类将无法拿到bean对象(因为测试类在找引导类时,是先查找与测试类相同包下是否存在引导类,如果不存在,再查看@SpringBootTest注解或者@ContextConfiguration注解是否配置了classes属性,是否指明对应的引导类),所以才会有了找不到bean对象的报错,而@SpringBootTest的classes属性可以指明该bean对象所在的引导类,相当于指明了bean对象所在的容器,测试类方法自然找到了bean对象,也就不会报错。

以后为了避免这个问题的发生,测试的时候就在@SpringBootTest注解中使用其classes属性指明引导类,防止报错。

整合MyBatis

整合MyBatis之前,先重新创建一个模块,前面的操作都一样,到选择依赖项的时候,打开SQL的下拉菜单,找到MyBatis Framework和MySQL Driver并勾选,然后创建
在这里插入图片描述

一样的,等待模块构建完成,然后将application.properties改为application.yml。在该配置文件中添加数据库的相关配置如下

#配置相关信息
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC
    username: root
    password: 123456

然后在MySQL中创建出springboot数据库和一张用于测试的t_user的用户表,用户表可参考如下图创建。
在这里插入图片描述

创建完成后,在表中添加几个用户样例,方便后续测试。

接着创建一个pojo,创建一个User实体类

package code.pojo;

import lombok.Data;
import org.springframework.stereotype.Component;

/**
 * @创建人 HeXin
 * @所属包 User
 * @所属项目 SpringBoot
 * @创建时间 2023/4/5 15:57
 * @描述 用户实体类
 */
@Component
@Data
public class User {
	private Integer id;
	private String username;
	private String password;
	private Integer age;
	private String sex;
	private String email;
}

随后创建出UseDao,并在此编写SQL语句

package code.dao;

import code.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserDao {
	@Select("select * from t_user where id = #{id}")
	public User getUserById(Integer id);
}

准备工作已就绪,开始测试

package code;

import code.dao.UserDao;
import code.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest(classes = Application.class)
class ApplicationTests {
	@Autowired
	private UserDao userDao;
	@Test
	void contextLoads () {
		User user = userDao.getUserById(9);
		System.out.println(user);
	}
	
}

测试结果如下图,可以看出,在SpringBoot的加持下,MyBatis的配置与编写也方便了很多
在这里插入图片描述

简单总结一下:

  1. 模块创建时勾选MyBatis技术和MySQL Driver技术,也就是导入MyBatis和MySQL相对应的starter
  2. 数据库连接相关信息转换成配置
  3. 数据库SQL映射需要添加@Mapper被容器识别到

整合MyBatis-Plus

MyBatis-Plus简称MP,是中国人制造的一个技术(可能有这方面的原因,所以MP并没有被Spring官方所收录),其是根据国人的一些开发习惯来做的,用起来比较舒服,所以逐渐在国内开始流行。

所以,在使用IDEA,按照前面的步骤是找不到MP这个技术的。但是,仍然有方法可以解决这个问题。

创建一个新的模块,前面步骤仍然一样,但是到了选择依赖的时候,只选择MySQL Driver,然后直接创建。

趁着正在加载的功夫,去maven网站上(https://mvnrepository.com))查询MP的maven坐标,然后加到模块的pom.xml配置文件中即可。

<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.2</version>
</dependency>

当然,如果是纯小白,可以跟着MP官网的快速开始进行练习:快速开始 | MyBatis-Plus (baomidou.com)

此时,创建好之后。与MyBatis不同的一点是,MP会对表做自动的映射,所以SQL语句不需要写了,结果就是自己创建的表名它并不知道,所以在执行测试的时候会出现以下异常
在这里插入图片描述

解决这个问题的办法就是,在application.yml中设置MP的配置

# 设置MP相关的配置
mybatis-plus:
  global-config:
    db-config:
      table-prefix:t_
# 这里设置的是表名的前缀,会自动将实体类名和前缀进行拼接变成表名

或者,如果嫌麻烦,可以按照官方文档中的教程,在每个对应的POJO实体类上加一个@TableName注解,并设置其value值,该value值就为这个实体类对应数据库中的表名。(推荐使用)
在这里插入图片描述

补充一点,MP中还有一个注解,可以解决数据库和Java编码风格不一致而导致CRUD操作出错,那就是@TableFiled,它有个value属性,其值为数据库字段名,可以有效的解决应为大驼峰(Java编码风格)与下划线(数据库编码风格)引发的冲突问题。
在这里插入图片描述

整合Druid

创建新模块,依赖项勾选MyBatis和SQL Service,查找Druid的maven仓库地址

<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.15</version>
</dependency>

在application.yml中进行配置

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC
      username: root
      password: 123456

总结

通过上面四个整合第三方技术的实例,可以得知,当以后需要整合任意第三方技术时,总共只有两步:

  1. 导入对应的starter
  2. 根据提供的配置格式,配置非默认值对应的配置项
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值