从传统的Java web到SSM框架,都是在对开发过程的简化,后面又出现了SpringBoot,这就使得开发更加的简化了。我们在使用SSM框架的时候,各种配置文件,使得Spring在某一段时间里被称作“配置地狱”,后面为了更加简化,就出现了SpringBoot,SpringBoot帮助我们做了很多的事情,使得开发更加简化了。
下面就聊聊博主对于SpringBoot配置文件的理解(以下理解全部是基于Java语言的Maven构建的SpringBoot工程)。
1.SpringBoot配置文件说明
SpringBoot项目是一个标准的Maven项目,它的配置文件需要放在src/main/resources/
下,其文件名必须为application
,其存在两种文件形式,分别是properties和yaml(或者yml)文件。

|
properties |
yaml |
语法结构 |
key=value |
key: value (:和value之间需要空格) |
文件后缀 |
.properties |
.yaml 或者.yml
|
如果两种类型的配置文件同时存在,properties文件的优先级大于yaml文件。
举个例子,同样是配置端口号,properties文件如下:
# 修改端口号为80
server.port=80
yaml文件如下:
server:
port: 80
博主更喜欢使用yaml文件作为配置文件。
2.读取自定义配置数据
在SpringBoot项目的开发过程中可能会存在自定义的一些数据需要读取到程序中,我们也能够直接在SpringBoot的配置文件中自定义。
使用Idea新建一个SpringBoot项目,在pom文件中添加依赖如下:
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
然后在主启动类的同级目录下建config
包,并在下面创建两个类,供以使用。
Address类:
package com.ara.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Address {
private String province;
private String city;
private String street;
}
Student类:
package com.ara.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Map;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
@ConfigurationProperties(prefix = "student")
public class Student {
private int id;
private String name;
private boolean sex;
private String[] subjects;
private Date birthday;
private Map<String,String> teachers;
private Address address;
}
然后在配置文件(application.yaml
)中写入数据如下:
student:
id: 20200729
name: Ara
sex: true
subjects:
- C
- C++
- Java
birthday: 1999/09/23
teachers:
math: 汤老师
C: Tom
Java: jack
address:
province: 四川
city: 成都
street: 成华大道
custom:
def:
value: 这是一个自定义的值
然后在测试类中写入以下代码:
@Autowired
private Student student;
@Value("${custom.def.value}")
private String value;
@Test
void contextLoads() {
System.out.println(student);
System.out.println(value);
}
然后运行测试项目,发现控制台打印出我们在配置文件中编写的数据:

到此,就成功的读取到了自定义配置的数据。
3.SpringBoot的配置
除了自定义的配置,就是SpringBoot本身就有的配置。
举个例子:
我们设置项目的端口号,在配置文件中写入server.port=xxxx
,这里就是在ServerProperties类中注入了我们配置的值,打开源码可见:

如果我们没有进行设置,将会使用SpringBoot提供的默认配置。
当然这配置还有很多,具体的可以在spring-boot-autoconfiguration-x.x.x.jar/META-INF/spring.factories
中去查看。
再举个例子,连接数据库的配置,我们在spring.factories
中可以看到这个类。

然后我们继续跟进,直接查看该类的源码:

我们发现该类对象出现在IOC容器中是有条件的,这里的@ConditionalOnXxx
就决定了该类对象是否会自动注入到IOC容器中。
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })
我们继续跟进自动配置类DataSourceProperties.class
:

然后我们又发现了这个注解@ConfigurationProperties
,现在我们就明白了,SpringBoot的配置我们都可以通过这种方式去查看源码和进行自定义配置。
简单示意图如下:

仅仅通过这一点的源码跟进,我们就发现了SpringBoot设计的巧妙之处,当然这只是很浅的“皮毛”,需要更加深入理解的话,还是要花费很深的功夫。
如有不严谨或者错误的描述之处,还望大佬们能够批评指教。