Spring Boot基础篇
创建工程
SpringBoot是Spring提供的一个子项目,用于快速构建Spring应用程序。
SpringBoot特性
- 起步依赖:本质是一个Maven坐标,整合了完成一个功能需要的所有坐标。
- 自动配置:约定大于配置原则,在boot程序启动后,一些bean对象会自动注入到ioc容器,不需要手动声明,简化开发。
- 其他特性:内嵌的Tomacat、Jetty(无需部署WAR文件);外部化配置;不需要XML配置(而使用properties/yml进行少量配置)等。
自动创建:
- 创建Maven工程
- 导入spring-boot-starter-web起步依赖
- 编写Controller
- 提供启动类
配置好maven并且写好controller后,运行启动类会自动配置好configurations。
IDEA maven 配置:https://blog.csdn.net/qq_42057154/article/details/106114515
maven下setting.xml中配置阿里云镜像,配置默认JDK版本
手动创建:
- 创建Maven工程
- 引入依赖
- 提供启动类
设置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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.1</version>
</parent>
<groupId>com.nusqx</groupId>
<artifactId>springboot-create-manual</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
设置启动类、创建resources目录及目录下的application.properties配置文件。
配置文件(properties 和 yaml 二选一)
properties配置文件
application.properties可以被springboot自动识别。
spring.application.name=springboot-start
# 服务端口
server.port=9090
# 虚拟目录:http://localhost:9090/start/hello
server.servlet.context-path=/start
yaml配置文件(首选,层次更清晰,更关注数据)
application.yml 或 application.yaml
server:
port: 9191
servlet:
context-path: /start2
yml配置信息书写与获取
书写:
值前边必须有空格,作为分隔符;
使用空格作为缩进表示层级关系,相同的层级左侧对齐;
加email前缀防止键名重复。
获取:
@Value("${键名}")
简化@Value注解,使用
@ConfigurationProperties(prefix="前缀")
相同层级的共同前缀;
实体类的成员变量名与配置文件中的键名保持一致;
# yml
# 发件人相关信息
email:
user: nusqx@qq.com
code: pazubwsphisacjha
host: smtp.qq.com
auth: true
# 学生爱好(数组)
hobbies:
- 打篮球
- 看书
- 看电影
pom.xml
<!--java mail 依赖-->
<dependency>
<groupId>org.eclipse.angus</groupId>
<artifactId>jakarta.mail</artifactId>
</dependency>
三方技术配置信息(配置)
自定义配置信息(配置+获取)
SpringBoot整合MyBatis-不需声明Bean对象
整合mybatis
<!--pom.xml-->
<!--mysql驱动依赖-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<!--mybatis起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
配置数据源
# application.yml
# 只需配置,读取交给springboot
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis
username: root
password: sqx123
poji内编写实体类;
mapper内编写数据访问接口;
service内编写接口,声明mapper中方法,编写接口的实现类并重写方法;
controller内调用service层的接口来控制业务流程。
Mapper层和DAO层对比:
Mapper
层和DAO
(Data Access Object)层是在持久层中用于处理数据访问的两个概念。虽然这两者的目的都是用于访问数据库,但它们之间有一些区别。在Java开发中,这两个概念通常与MyBatis(或其他ORM框架)结合使用。Mapper层:
定义:
Mapper
是 MyBatis 中的一个术语,指的是用于描述如何映射数据库中的数据到 Java 对象的接口。每一个Mapper
接口对应一个数据操作接口。职责:
- 定义了数据访问的接口,提供了一组数据库操作的方法。
- 包含了与具体数据访问有关的 SQL 语句和映射规则。
注解:
- 通常使用 MyBatis 的注解或 XML 文件来描述 SQL 映射。
DAO层:
定义:
DAO
是一个更通用的设计模式,用于封装与数据存储交互的逻辑。在Java中,通常指的是数据访问对象。职责:
- 提供了一个抽象接口,定义了数据访问的方法。
- 包含了数据访问的具体实现,可以是直接对数据库进行操作,也可以通过调用其他服务、API等方式进行数据访问。
注解:
- 通常不涉及注解,而是通过实现接口的方式来定义数据访问方法。
对比
技术栈:
Mapper
通常与 MyBatis 等 ORM 框架结合使用。DAO
是一个更通用的概念,可以用于任何形式的数据访问,包括直接 JDBC 操作、使用 ORM 框架、调用 RESTful API 等。灵活性:
Mapper
更侧重于数据映射和 SQL 操作,通常会与具体的 ORM 框架绑定。DAO
层相对更加抽象,可以在不同的数据访问技术之间切换,提供更大的灵活性。命名规范:
Mapper
接口方法通常直接与 SQL 语句对应,方法名和 SQL 语句之间的映射关系更为直观。DAO
接口方法可以根据业务逻辑进行更灵活的命名,而不受 SQL 语句的限制。在实际项目中,
Mapper
层和DAO
层有时会交替使用或者同时存在,具体的选择会根据项目的需求、技术栈和团队的开发习惯而定。在使用 MyBatis 等 ORM 框架时,常常使用Mapper
来定义数据库操作接口。// MyBatis Mapper 接口 public interface UserMapper { @Select("select * from user where id = #{id}") public User findById(Integer id); @Insert("insert into user (name, age) values (#{name}, #{age})") void insertUser(User user); } // DAO 接口 public interface UserDao { public User findById(Integer id); void insertUser(User user); } // DAO 实现 public class UserDaoImpl implements UserDao { // 数据库操作的具体实现 }
Bean管理(第三方的Bean管理)
Bean扫描
Spring中:
xml标签:<context:component-scan base-package=”com.nusqx/“>
配置类注解:@ComponentScan(basePackages=”com.nusqx”)
SpringBoot中:使用@SpringBootApplication
SpringBoot默认扫描启动类所在的包及其子包。
也可以通过手动添加@ComponentScan(basePackages = {"com.nusqx"})
指定扫描的包。
Bean注册
如果要注册的bean对象来自第三方(不是自定义的),是无法用@Component
及衍生注解声明bean的。
因而Spring提供了第三方bean对象管理注解
@Bean
如果要注册第三方bean,建议在配置类中集中注册
@Bean在config包下使用@Bean@Import
导入配置类
导入 ImportSelector 接口实现类
@Import@EnableXxxx注解,封装@Import注解
注册条件
SpringBoot提供了设置注册生效条件的注解@Conditional及衍生注解
自动配置原理
公共组件自定义成starter
面试
遵循约定大于配置原则,在boot程序启动后,起步依赖中的一些bean对象会自动注入到ioc容器。
.imports配置文件是核心,springboot2.7以前使用的是spring.factories
简述:
在主启动类上添加了SpringBootApplication注解,这个注解组合了EnableAutoConfiguration注解(开启了自动配置);
EnableAutoConfiguration注解又组合了Import注解,导入了AutoConfigurationImportSelector类;
AutoConfigurationImportSelector实现了selectImports方法,这个方法经过层层调用,最终会读取META-INF目录下的后缀名为imports的文件,boot2.7以前的版本,读取的是spring.factories文件,2.7-3.0之间两者兼容,3.0之后只支持imports。
读取到全类名了之后,会解析注册条件,也就是@Conditional及其衍生注解,把满足注册条件的Bean对象自动注入到IOC容器中。
自定义starter
在实际开发中,经常会自定义一些公共组件,提供给各个项目团队使用。而在SpringBoot的项目中,一般会将这些公共组件封装为SpringBoot的starter。
- Xxxx-autoconfiguration 自动配置功能
- Xxxx-starter 依赖管理功能,并引入自动配置模块
以自定义mybatis的starter为例,
pom.xml
<dependency>
<groupId>com.nusqx</groupId>
<artifactId>dmybatis-spring-boot-autoconfigure</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
生产环境
IDEA2024.1.4 + maven3.9.5 + JDK17 + SpringBoot3.3.1 + MyBatis起步依赖3.0.3
当使用MyBatis3.0.0时会遇到问题😡
IDEA设置新建项目使用本地的maven而不需要重新下载
测试工具:Apifox或Postman
对比参考文章:https://apifox.com/apiskills/apifox-postman-comparison/
Apifox:https://apifox.com/help/
Postman:https://postman.org.cn/