有趣的SpringBoot Config
实验环境
- IntelliJ IDEA 2021.2
- SpringBoot 2.6.3
- Lombok
- spring-boot-configuration-processor
- 项目源码:neo/springbootdemo (gitee.com)
初始化一个SpringBoot项目
我这里是直接从Spring Initializr网站初始化并下载的。然后用IDEA打开,具体过程w不再赘述了。要注意的是,IDEA初次打开一个初始化的SpringBoot项目时,由于某些原因(你懂的),需要花点时间将依赖下载下来。
安装Lombok
Lombok可以简化Java实体类,免去编写 get set方法的困扰,使实体类更加清爽。安装Lombok分为两步。
-
在IDEA中安装Lombok插件(不过我看新出的IDEA自带了该插件)
File->Settings->Plugins
-
在项目中引入Lombok包
dependencies { compileOnly 'org.projectlombok:lombok:1.18.22' annotationProcessor 'org.projectlombok:lombok:1.18.22' testCompileOnly 'org.projectlombok:lombok:1.18.22' testAnnotationProcessor 'org.projectlombok:lombok:1.18.22' }
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> <scope>provided</scope> </dependency> </dependencies>
安装 spring-boot-configuration-processor
dependencies {
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
}
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
编写Properties类
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "my")
public class MyEntityProperties {
private String name;
}
在application.properties中配置
my.name=I am from application.properties
编写Properties测试类
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class TestMyEntityProperties {
@Autowired
private MyEntityProperties myEntityProperties;
@Test
void initEntity() {
System.out.println(myEntityProperties.getName());
}
}
执行结果
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.6.3)
2022-02-17 16:29:13.615 INFO 10452 --- [ Test worker] c.e.d.properties.TestMyEntityProperties : Starting TestMyEntityProperties using Java 1.8.0_301 on DESKTOP-6POMD94 with PID 10452 (started by neo in D:\code\springbootdemo)
2022-02-17 16:29:13.616 INFO 10452 --- [ Test worker] c.e.d.properties.TestMyEntityProperties : No active profile set, falling back to default profiles: default
2022-02-17 16:29:13.997 INFO 10452 --- [ Test worker] c.e.d.properties.TestMyEntityProperties : Started TestMyEntityProperties in 0.573 seconds (JVM running for 1.663)
I am from application.properties # 这里便是执行的结果输出
BUILD SUCCESSFUL in 2s
4 actionable tasks: 2 executed, 2 up-to-date
16:29:14: Task execution finished ':test --tests "com.example.demo.properties.TestMyEntityProperties"'.
中文乱码解决
我们更改一下name的配置
my.name = my.name=我来自application.properties
执行的结果会变成
???application.properties
这是由于IDEA编码的问题这里我们设置一下 , 然后重新启动IDEA。
IDEA冲洗启动后,application.properties会变成下面的样子,这里我们将修正一下
改后的结果如下
最周执行下来的结果是
当然我们也可以将application.properties修改为application.yml
spring:
messages:
encoding: UTF-8
my:
name: 我来自application.yml
同样可以正确执行。
自定义配置文件的名称
有些情况我们并不希望使用系统自带的application.properties或application.yml配置文件,而是指定xxxx.properties或者xxx.yml作为配置文件。
-
我们在resources文件夹下新增my.properties
-
在MyEntityProperties实体类中指定使用这个文件作为配置文件
package com.example.demo.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; @Data @Component @ConfigurationProperties(prefix = "my") @PropertySource(value = "classpath:my.properties") public class MyEntityProperties { private String name; }
执行结果
可以发现配置并没有生效,这是因为application.yml或application.properties的优先级比my.properties高。所以这里我们清除掉application.yml中重复的配置再执行一次
但是my.properties并不能像application.yml或application.properties自动提示。这里需要设置一下
同时按下Ctrl+Alt+Shift+S
-
操作完成后你会发现
此时你会发现my.properties也可以自动提示了。
自定义yaml文件
SpringBoot官方目前仅支持自定义的properties文件,如果想使用自定义的yaml文件需要额外编写解析工具。
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; import org.springframework.core.env.PropertiesPropertySource; import org.springframework.core.env.PropertySource; import org.springframework.core.io.support.EncodedResource; import org.springframework.core.io.support.PropertySourceFactory; import java.util.Objects; import java.util.Properties; public class YamlPropertySourceUtil implements PropertySourceFactory { @Override public PropertySource<?> createPropertySource(String name, EncodedResource resource) { YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); factory.setResources(resource.getResource()); Properties properties = factory.getObject(); assert properties != null; return new PropertiesPropertySource(Objects.requireNonNull(resource.getResource().getFilename()), properties); } }
然后在实体类中引入这个工具
import com.example.demo.utils.YamlPropertySourceUtil; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; @Data @Component @ConfigurationProperties(prefix = "my") @PropertySource(value = "classpath:my.properties", factory = YamlPropertySourceUtil.class) public class MyEntityProperties { private String name; }
最后执行获取
至此SpringBoot配置方面的知识就算带大家入门了。