从传统的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文件。
举个例子,同样是配置端口号,properties文件如下:
# 修改端口号为80server.port=80yaml文件如下:
# 修改端口号为80server: port: 80博主更喜欢使用yaml文件作为配置文件。
2.读取自定义配置数据在SpringBoot项目的开发过程中可能会存在自定义的一些数据需要读取到程序中,我们也能够直接在SpringBoot的配置文件中自定义。
使用Idea新建一个SpringBoot项目,在pom文件中添加依赖如下:
<!--lombok偷懒工具--><dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId></dependency><!--使用ConfigurationProperties注解需要该依赖--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional></dependency>然后在主启动类的同级目录下建config包,并在下面创建两个类,供以使用。
Address类:
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;//lombok注解@Data@NoArgsConstructor@AllArgsConstructor//将当前类对象放在IOC容器中@Component//表示与配置文件中前缀为student的数据相对应@ConfigurationProperties(prefix = "student")public class Student { private int id; private String name; private boolean sex; private String[] subjects; /** * 时间(默认时间格式:1999/09/23) * 可通过@DateTimeFormat注解指定 * eg: @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") */ private Date birthday; private Map<String,String> teachers; private Address address;}然后在配置文件(application.yaml)中写入数据如下:
# student对象的自定义数据student: id: 20200729 name: Ara sex: true # 数组 还可以写成如下: # subjects: [C,C++,Java] subjects: - C - C++ - Java # 时间 birthday: 1999/09/23 # Map集合 teachers: math: 汤老师 C: Tom Java: jack # 对象 对象还可以写成如下行内形式(注意:和value之间的空格) # address: {province: 四川,city: 成都,street: 成华大道} address: province: 四川 city: 成都 street: 成华大道# 自定义valuecustom: def: value: 这是一个自定义的值然后在测试类中写入以下代码:
//自动注入我们提供的Student类对象@Autowiredprivate Student student;//通过${xxx.xxx}来获取配置文件中指定key的值@Value("${custom.def.value}")private String value;@Testvoid 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容器中。
我们继续跟进自动配置类DataSourceProperties.class:
然后我们又发现了这个注解@ConfigurationProperties,现在我们就明白了,SpringBoot的配置我们都可以通过这种方式去查看源码和进行自定义配置。
简单示意图如下:
仅仅通过这一点的源码跟进,我们就发现了SpringBoot设计的巧妙之处,当然这只是很浅的“皮毛”,需要更加深入理解的话,还是要花费很深的功夫。
如有不严谨或者错误的描述之处,还望xldbg能够批评指教。