SpringBoot称为Spring的脚手架(脚手架就是盖房子的框架).
Spring是为了简化Java程序的开发诞生的, 而SpringBoot是为了简化Spring程序开发诞生的.所以称为Spring的框架.
这里有三种创建方式, 专业版idea中自带方式, 和 社区版安装插件后的方式. 第三种方式, 就是在官网下载项目的压缩包.然后解压到自己选择的位置, 再用idea打开即可.(其实三种方式大同小异, 知道一种也可以很快的熟悉另外两种方式)
为了不体现对待专业版特殊化, 我们先讲解社区版插件的方式
先选择New Project 进入到创建新项目的页面, 点击插件的模块
然后 选择自己对应的JDK 和 依赖源, 依赖源一般有默认值,可以不填写, 如果需要用国内稳定源, 可以在Custom中配置
同样先选择New Project 进入到创建页面, 然后选择Spring Initializr框
填写相关内容, 如果需要更改拉取的源地址, 可以在上面更改. 填写好以后就可以点击Next
我们观察后, 不难发现, 两种创建方式创建出来的项目是没有什么差别的, 所以以后我们使用哪种方式都是可以的.
首先访问官网地址: https://start.spring.io/
访问之后填写和更改具体内容, 选择要添加的依赖(内容和idea创建类似)
SpringBoot项目有两个主要的目录
具体细节如图:
启动类代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ShowSpringbootUltimateApplication {
public static void main(String[] args) {
SpringApplication.run(ShowSpringbootUltimateApplication.class, args);
}
}
代码如下:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping("/sayhello")
public String sayHi() {
return "Hello World!";
}
}
注意事项: 约定大于配置!!! 上述编写代码, 运行成功是因为. 我们遵守了 项目要求的目录格式, 如果我们将controller没有建在启动类的包下, 就会出现错误.(SpringBoot 没有将对象注入到容器中). 因为默认情况下, 启动类只会注入自己同级别的包下的内容.所以要记住 约定大于配置.要遵守约定好的目录格式.
整个项目中所有重要的数据都是在配置文件中配置的
可见配置文件还是很重要的.
一般有两种格式 .properties文件 和 .yml文件, 并且这两种格式的配置文件是可以共存的
属于老版本的配置文件, 是创建SpringBoot项目默认的配置文件
基本语法
读取配置文件
代码如下:
# .properties文件
server.port=8031
// .java文件
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
@RestController
@RequestMapping("/user")
public class UserController {
@Value("${server.port}")
private String port;
@RequestMapping("/readport")
public String readPort() {
return "port: " + port;
}
@RequestMapping("/sayhello")
public String sayHi() {
return "Hello World!";
}
}
重启项目, 访问页面观察结果
以配置数据库为例, 可以观察出来很明显的缺点就是会有很多冗余信息
yml格式的配置文件就不会出现这样的冗余信息
基本语法: key: value
示例: key: value :和value中间必须有空格
使用yml连接数据库示例
代码如下:
# 演示yml配置数据库
spring:
datasource:
url: mysql://localhost:3306/fhs?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC&nullCatalogMeansCurrent=true
username: root
password: 123456
yml代码
# 字符串
string.value: Hello
# 布尔值,true或false
boolean.value: true
boolean.value1: false
# 整数
int.value: 10
int.value1: 0b1010_0111_0100_1010_1110 # 二进制
# 浮点数
float.value: 3.14159
float.value1: 314159e-5 # 科学计数法
# Null, ~代表null
null.value: ~
application.yml代码
string:
str1: Hello \n Spring Boot.
str2: 'Hello \n Spring Boot.'
str3: "Hello \n Spring Boot."
UserController.java代码
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
@RestController
@RequestMapping("/user")
public class UserController {
@Value("${string.str1}")
private String str1;
@Value("${string.str2}")
private String str2;
@Value("${string.str3}")
private String str3;
//初始化调用
@PostConstruct
public void postConstruct() {
System.out.println("string.str1:" + str1);
System.out.println("string.str2:" + str2);
System.out.println("string.str3:" + str3);
}
}
补充: 关于@PostConstruct 注解
a. 类初始化时调用的方法
放在这里的原因是因为希望在项目启动时观察到方法输出, 并且这个注解又需要等待 属性注入, 否则无意义
b. 类初始化时调用的顺序
1. 构造方法 Constructor
2. @Autowired
3. @PostConstruct
配置: 首先在配置文件中配置对象, 有两种配置写法 普通写法和行内写法,两种同等效益
application.yml代码
# 配置对象
student:
id: 1
name: Java
age: 18
# 行内写法
student2: { id: 1,name: Java,age: 18 }
获取: 编写对象类, 获取配置信息并观察.
右键show_springboot_ultimate包选择New–>Java Class
在运行类同级目录下创建一个子包和一个对象类
编写对象类并获取配置内容. 这个时候就不能⽤ @Value 来读取配置中的对象了,此时要使⽤另⼀个注解 @ConfigurationProperties来读取
StudentComponent.java代码
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "student")
@Component
public class StudentComponent {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "StudentComponent{" +
"id=" + id +
", name='" + name + ''' +
", age=" + age +
'}';
}
}
编写代码, 并重启项目. 观察Student对象配置信息获取情况. 可以观察到,成功获取信息.
ReadYml.java代码
import com.example.show_springboot_ultimate.model.StudentComponent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class ReadYml {
@Autowired
private StudentComponent studentComponent;
@PostConstruct
public void postConstruct() {
System.out.println(studentComponent);
}
}
配置: 和配置对象类似, 有两种书写方式 普通写法和行内写法
application.yml代码
# 配置集合
dbtypes:
name:
- mysql
- sqlserver
- db2
# 行内写法
dbtypes2: { name: [ mysql,sqlserver,db2 ] }
获取: 同样编写有集合属性的类来观察, 先在model包下New一个类
创建拥有集合属性的类来接收获取的配置文件的信息
编写代码并获取配置信息. 集合的读取和对象⼀样,也是使用 @ConfigurationProperties 注解来读取的
ListConfig.java代码
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {
private List<String> name;
}
编写代码, 并重启项目. 观察集合配置信息获取情况. 可以观察到,成功获取信息.
ReadYmlList.java代码
import com.example.show_springboot_ultimate.model.ListConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class ReadYmlList {
@Autowired
private ListConfig listConfig;
@PostConstruct
public void postConstruct() {
System.out.println(listConfig.getName());
}
}
UserController.java代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
/**
* @author Echo
* @version 1.0
* date 2023/3/24 16:15
* name UserController
* @deprecated exercises:
* 类初始化调用顺序
* (1)构造方法Constructor
* (2)@Autowired
* (3)@PostConstruct
*/
@RestController
@RequestMapping("/user")
public class UserController {
//首先获取日志对象
//不要导错包了.
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
private static Logger logger = LoggerFactory.getLogger(UserController.class);
@Value("${server.port}")
private String port;
@Value("${string.str1}")
private String str1;
@Value("${string.str2}")
private String str2;
@Value("${string.str3}")
private String str3;
//初始化调用
@PostConstruct
public void postConstruct() {
logger.info("这是初始化方法的日志打印");
System.out.println("string.str1:" + str1);
System.out.println("string.str2:" + str2);
System.out.println("string.str3:" + str3);
}
@RequestMapping("/readport")
public String readPort() {
//日志打印
logger.info("这是返回获取配置文件中端口方法的日志打印");
return "port: " + port;
}
@RequestMapping("/sayhello")
public String sayHi() {
//日志打印
logger.info("这是访问方法时的日志打印");
return "Hello World!";
}
}
日志格式: 日志打印时间 + 日志打印级别 + 线程ID + 线程名称 + 执行的类名 + 日志输出信息
日志级别分类
日志级别的顺序
越往上 , 接收到的消息越少(下打印的信息包含上的信息)
application.yml代码
# 配置日志打印等级
logging:
level:
root: trace
UserController.java代码
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
@RestController
@RequestMapping("/user")
public class UserController {
//首先获取日志对象
//不要导错包了.
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
private static Logger logger = LoggerFactory.getLogger(UserController.class);
@Value("${string.str1}")
private String str1;
@Value("${string.str2}")
private String str2;
@Value("${string.str3}")
private String str3;
//初始化调用
@PostConstruct
public void postConstruct() {
//不同等级日志打印
logger.trace("这是初始化方法的日志打印");
logger.debug("这是初始化方法的日志打印");
logger.info("这是初始化方法的日志打印");
logger.warn("这是初始化方法的日志打印");
logger.error("这是初始化方法的日志打印");
// fatal等级日志, 由于程序已经退出, 所以也就不会有打印了
System.out.println("string.str1:" + str1);
System.out.println("string.str2:" + str2);
System.out.println("string.str3:" + str3);
}
}
application.yml代码
# 配置日志打印等级 + # 设置日志文件的目录
logging:
file:
path: D:\home\ruoyi # 日志文件保存位置
level:
root: trace
设置文件保存的名称(名称里就可以包含了文件的目录, 所以目录配置就可以省略)
application.yml代码
# 配置日志打印等级 + # 设置日志文件保存的名称 + # 设置日志文件的目录
logging:
file:
# path: D:\home\ruoyi # 日志文件保存位置
name: D:\home\ruoyi\spring-1204.log # 日志文件保存名称(内涵日志位置)
level:
root: trace
依赖地址: https://mvnrepository.com/artifact/org.projectlombok/lombok/1.18.20
依赖内容:
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.20version>
<scope>providedscope>
dependency>
使用注解代替一行代码, 节省工作量(毕竟程序员很累的)
UserService.java代码
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 使用更简便的得到日志的方法:注解
*/
//@Service 设置为它无法直接访问路由
@Controller//此处没有它就无法访问路由
@ResponseBody
//此处方法没有返回任何信息,没有它就会返回500页面(因为方法无返回内容)
@Slf4j//代替了获取日志对象 (默认名称为log)
public class UserService {
//得到日志对象 注解代替了下面的代码
// private static final Logger log = LoggerFactory.getLogger(UserService.class);
@RequestMapping("/sayhello")
public void sayhello(){
//名称同样为 log
log.trace("我是sayhello trace");
log.debug("我是sayhello debug");
log.info("我是sayhello info");
log.warn("我是sayhello warn");
log.error("我是sayhello error");
}
}
基本注解 | 作⽤ |
---|---|
@Getter | ⾃动添加 getter ⽅法 |
@Setter | ⾃动添加 setter ⽅法 |
@ToString | ⾃动添加 toString ⽅法 |
@EqualsAndHashCode | ⾃动添加 equals 和 hashCode ⽅法 |
@NoArgsConstructor | ⾃动添加⽆参构造⽅法 |
@AllArgsConstructor | ⾃动添加全属性构造⽅法, 顺序按照属性的定义顺序 |
@NonNull | 属性不能为 null |
@RequiredArgsConstructor | ⾃动添加必需属性的构造⽅法, final + @NonNull 的 属性为必需 |
@Data | @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @NoArgsConstructor |
@Slf4j | 添加⼀个名为 log 的⽇志, 使⽤ slf4j |