SpringBoot基础
第一个Spring Web项目
Hello World
- 使用IDEA创建工程。工程名,jdk版本
创建工程时可以将Server URL修改为start.aliyun.com,有初始代码更适合初学者
- 选择springboot版本(后面不要有后缀的),导入依赖(依赖后续可以在pom.xml中修改)
基本的web项目只需要Spring Web依赖,其他依赖后续可以在pom.xml添加。
- 定义请求处理类:创建controller目录,在其下面创建一个测试Controller(如果工程连Controller都跑不起来就白写了)
@RestController
public class TestController {
@RequestMapping(value = "/test")
public String test(){
return "Hello, world!";
}
}
- 修改启动类(XXXApplication.java)的注解,使springboot工程不需要连接数据库也可以运行
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
- 启动工程,并用浏览器打开http://localhost:8080/test(一般来说springboot默认端口都是8080,可以在控制台查看)
localhost:8080/test,意思是向本地计算机中的8080端口程序,获取资源位置 是/test的数据
打开浏览器显示"Hello world"表示第一个应用开发成功。
如果你使用浏览器访问了其他路由,例如http://localhost:8080或其他随便一个如http://localhost:8080/fl,会出现以下页面:
控制台显示Failed to load resource: the server responded with a status of 404 ()。这是因为你没有在声明处理该请求的controller,你可以仿照前面的方式自己添加controller自己处理请求,后面会进一步讲解。
- 彩蛋-设置springboot启动时图标
- 在resource文件下创建banner.txt
- 在ASCII艺术字(图)集网址中生成后复制到banner.txt
___________ ____
______/ \__// \__/____\
_/ \_/ : //____\\
/| : : .. / \
| | :: :: \ /
| | :| || \ \______/
| | || || |\ / |
\| || || | / | \
| || || | / /_\ \
| ___ || ___ || | / / \
\_-_/ \_-_/ | ____ |/__/ \
_\_--_/ \ /
/____ /
/ \ /
\______\_________/
- 启动工程,就会发现控制台中springboot的图标变化了
Hello World探究
项目基本结构
初始项目如下:
完整结构如下:
boot3-01-helloworld/
|-- src/
| |-- main/
| |-- java/ # 项目的源代码
| |-- com/
| |-- fl/
| |-- boot/ # 包名,例如com.fl.boot
| |-- MyApplication.java # 应用的入口类,包含 main 方法,用于启动 Spring Boot 应用
| |-- controller/ # 包含所有的控制器类(Controller),它们处理用户的输入并返回响应
| |-- MyController.java
| |-- service/ # 包含服务类(Service),它们包含业务逻辑。
| |-- MyService.java
| |-- repository/ # 用于Spring Data项目,适用于JPA、MongoDB、Neo4j等多种数据源
| |-- MyRepository.java
| |-- mapper/ # 用于MyBatis项目,用于关系型数据库,也可以通过扩展支持其他数据源
| |-- MyMapper.java
| |-- entity/ # 包含实体类(Entity),它们映射到数据库表。
| |-- MyEntity.java
| |-- config/ # 包含配置类,用于配置应用的行为
| |-- MyConfig.java
| |-- exception
| |-- GlobalExceptionHandler.java # 捕获全局异常并处理
| |-- resources/ # 包含了应用的所有资源文件
| |-- application.properties # 配置文件
| |-- application.yml # 配置文件,实际开发比上面的更常用
| |-- static/ # 用于存放静态资源,如CSS、JavaScript和图片文件
| |-- templates/ # 用于存放Web应用的模板文件,这通常是在使用模板引擎(如Thymeleaf)时需要的
| |-- schema.sql # 用于存放创建数据库结构的SQL脚本
| |-- data.sql # 用于初始化数据库中的数据的SQL脚本
| |-- test/ # 可以按照与src/main/java相似的包结构组织测试类
|-- pom.xml # Maven构建文件,用于定义项目的依赖、插件和其他构建配置
|-- build.gradle # Gradle构建文件,用于定义项目的依赖、插件和其他构建配置
|-- .gitignore # 定义 Git 版本控制系统应该忽略的文件和目录
|-- README.md # 这是项目的 README 文件,通常包含项目的基本信息和如何运行应用的指南
重要文件
下面对Springboot3的项目中的几个重要文件做基本的介绍:
入口点MyApplication.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
- Spring Boot 应用的入口点是包含 @SpringBootApplication注解的类,以及在该类中定义的 main 方法。这个入口类负责启动 Spring Boot 应用。
- @SpringBootApplication:这是一个组合注解,它包含了三个主要的注解:
- @SpringBootConfiguration:标记这个类作为应用的配置类。
- @EnableAutoConfiguration:让 Spring Boot 根据类路径中的 jar 包、类,为当前项目进行自动配置。
- @ComponentScan:告诉 Spring 扫描这个类所在的包及其子包中的注解组件(如 @Component, @Service, @Repository, @Controller 等)。
- main 方法:这是 Java 应用的标准入口点。当运行 Spring Boot 应用时,JVM 调用这个 main 方法启动应用。
- SpringApplication.run(MyApplication.class, args);:这行代码负责启动 Spring 应用上下文。SpringApplication 提供了一个方便的方式来启动 Spring 应用。run 方法的参数 MyApplication.class 是入口类的类对象,它用于告诉 SpringApplication 起始的配置类是哪一个。args 是从命令行传入的参数。
- 当运行这个 main 方法时,会发生以下步骤:
- 创建一个合适的 ApplicationContext 实例(取决于类路径和其它因素)。
- 注册一个 CommandLinePropertySource 以将命令行参数添加到 Spring 的 Environment 中。
- 刷新 ApplicationContext,加载所有单例 beans。
- 执行任何 CommandLineRunner beans。
pom.xml
pom.xml 是 Maven 项目中的一个核心文件,用于定义项目的构建、报告和依赖关系等信息。在 Spring Boot 3 中,pom.xml 文件同样扮演着重要的角色。
一个基本的 pom.xml 文件通常包含以下几个部分:
- 项目的基本信息:包括 <groupId>、<artifactId>、<version> 等,它们分别代表项目的组ID、项目ID 和版本号。
- 父项目:如果你的项目依赖于其他项目,那么你需要声明你的项目是哪个项目的子项目,这可以通过 <parent> 元素来实现。
- 依赖关系:在你的项目中,可能需要用到其他的库或者框架,这时就需要在 <dependencies> 元素下声明对这些库或框架的依赖。
- 插件:<plugins> 元素用于声明项目需要的插件,例如编译插件、打包插件等。
- 构建配置:<build> 元素用于设置项目的构建参数,例如源代码目录、目标目录、测试目录等。
application.yml
application.yml 是一个用于配置 Spring Boot 应用程序的文件。它允许开发者为应用程序的不同方面(如数据库连接、安全设置、消息服务等)提供特定的配置。
日志★
介绍
- 日志是指应用程序运行时产生的信息,这些信息可以帮助开发者了解应用程序的运行状态、调试问题以及监控应用程序的行为。日志可以包括信息性的消息、警告、错误以及调试信息等。
- 开发规范:不要使用System.out.println(),使用专业日志框架记录信息。这是因为使用专业的日志框架可以提高应用程序的可维护性、性能和可扩展性。它允许您以更灵活和高效的方式处理日志记录,而System.out.println()则是一种简陋且不灵活的日志解决方案。
- Spring Boot默认使用Apache Commons Logging作为内部的日志框架,但允许您通过配置使用其他日志框架,如Logback、Log4J2等。Spring Boot为Logback和Log4J2提供了默认的配置,使得您可以快速开始记录日志。
日志门面是一个抽象层,它定义了日志记录的接口,但不提供具体的日志记录实现。它的目的是提供一种统一的方式来访问日志记录功能,而不关心底层的日志记录系统是什么。这样,无论底层使用的是哪种日志实现,开发者都可以使用相同的方法和API来记录日志。
日志实现是具体实现日志记录功能的库或框架。它实现了日志门面定义的接口,并提供实际的日志记录能力。例如,Logback和Log4J都是日志实现的例子。
基本使用
- 要自己生成日志我们可以使用Lombok 库提供的一个注解,@Slf4j。
- @Slf4j 注解可以为当前的类自动生成一个 SLF4J的日志对象,通常这个对象被命名为 log。
- 在 SLF4J 中,Logger 接口定义了几个常用的日志记录方法,包括 info(), debug(), warn(), 和 error()。这些方法用于记录不同级别的日志信息,以便于开发者根据日志级别来过滤和查看应用程序的运行情况。
- info(): 用于记录一般信息,通常是应用程序运行中的正常事件或者流程信息。这些信息通常对监控应用程序的日常运行是有帮助的。
- debug(): 用于记录调试信息,这些信息通常只在开发阶段需要,用于帮助开发者诊断问题。在生产环境中,通常不会启用 debug 级别的日志。
- warn(): 用于记录警告信息,表明应用程序可能遇到一些不正常或不期望的情况,但这些情况并不影响应用程序的继续运行。
- error(): 用于记录错误信息,通常是指应用程序遇到了严重的错误,这些错误可能会导致应用程序的部分功能失败或者整个应用程序崩溃。
要使用@Slf4j注解,首先要保证在pom.xml中引入了Lombok 库的依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
示例:
import lombok.extern.slf4j.Slf4j;
@RestController
@Slf4j
public class TestController {
// 无参测试
@RequestMapping(value = "/test")
public String test() {
log.info("Hello, world!");
log.warn("Hello, world!");
log.error("Hello, world!");
return "Hello, world!";
}
}
使用浏览器访问http://localhost:8080/test,控制台出现下面日志:
在实际使用中,你可以在日志消息中包含变量或者使用占位符来提高日志的可读性。
String userName = "张三";
log.info("用户 {} 尝试登录系统。", userName);
error() 方法通常用于记录异常信息,你可以将异常对象作为参数传递给 error() 方法
try {
// ... 可能会抛出异常的代码 ...
} catch (Exception e) {
log.error("发生了一个异常:", e);
}
小技巧
lombok★
介绍
实体类代码臃肿(getter、setter、toString...),太繁琐
Lombok是一个实用的java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、tostring等方法,并可以自动化生成日志变量,简化java开发、提高效率。
注解 | 作用 |
@Getter/@Setter | 为所有的属性提供get/set方法 |
@ToString | 会给类自动生成易阅读的toString方法 |
@EqualsAndHashCode | 根据类所拥有的非静态字段自动重写equals方法和hashCode方法 |
@Data | 提供了更综合的生成代码功能(@Getter+@Setter+@ToString+@EqualsAndHashCode) |
@NoArgsConstructor | 为实体类生成无参的构造器方法 |
@AllArgsConstructor | 为实体类生成除了static修饰的字段之外带有各参数的构造器方法。 |
使用
- 在pom.xml引入依赖(如果在创建时引入了可以跳过)
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<!--不需要指定版本,在父工程已指定-->
</dependency>
- 在实体类中使用Lombok注解
@Data
@NoArgsConstructor
@AllArgsConstructor
- lombok在编译时,会自动生成对应java代码。使用代码时,还需要安装一个lombok插件(idea自带,除非较老版本)
实例
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer id;
private String name;
private Short age;
private Short gender;
private String phone;
//使用lombok省略了以下代码
// public User() {
// }
//
// public User(Integer id, String name, Short age, Short gender, String phone) {
// this.id = id;
// this.name = name;
// this.age = age;
// this.gender = gender;
// this.phone = phone;
// }
// public Integer getId() {
// return id;
// }
// ...
// @Override
// public String toString() {
// return "User{" +
// "id=" + id +
// ", name='" + name + '\'' +
// ", age=" + age +
// ", gender=" + gender +
// ", phone='" + phone + '\'' +
// '}';
// }
}