SpringBoot自定义配置文件/获取配置文件内容
需要对项目代码中的内容进行更改,又不想每次都去改动逻辑代码,因此需要在逻辑代码中设置一个变量,这个变量接受配置文件中的值,这样就不用改动逻辑代码了, 只需要改动配置文件即可
起步
-
application.yaml
文件中定义一个键值对-
# 自定义的 mucd: username: mucd cd age: 19 # tomcat启动端口 server: port: 80
-
-
创建一个controller类,
MyController
,在这个类中获取配置文件中的内容, 当然,配置文件中的内容不一定费用从controller中获取! -
MyCntroller.java
-
import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @author mucd * @time 2022/2/9 14:37 */ @RestController public class TestController { @Value("${mucd.username}") String username; @RequestMapping("/getUser") public String getUsername() { return username; } }
-
@RestController
注解 就是直接返回一个字符串,可以在浏览器页面上直接显示 -
使用
@Value("${mucd.username}")
获取配置文件中的内容,这样就能获取遇到mucd下面的username的值了! 这里要特别注意, 如果配置文件中没有${}
里面的值那么在spring boot启动的时候会有异常,然后启动失败。所以在写的时候要格外注意 -
为了避免出错我们还可以这样写
@Value("${mucd.username:mucd}")
,意思是如果在配置文件中没有mucd.username
那么则会个有个一个默认的值就是:
后面的值 -
异常:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'mucd.uername' in value "${mucd.uername}"
-
-
-
下一步就可以启动springboot去浏览器 测试一下
-
可以看到这和我们配置文件中的内容一样,这说明已经成功的获取到了。
-
再测试一下获取不到配置文件值的情况 这样就是获取的
:
后面的值 -
那么当我们的配置特别多的时候怎么办呢,总不能和这些框架的配置混在一起吧,我们还需要有自己的配置文件
自己的配置文件
-
对象的方式获取配置文件内内容
-
导入依赖
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <!--依赖不需要传递 子模块需要重新调用--> <optional>true</optional> </dependency>
-
创建配置文件
resource。yaml
文件名可以自定义,并且在配置文件中定义一些属性 -
# 可以把user看作类名 user: # 把user下面的看作是类的属性 name: mcd age: 20
-
创建一个java文件,并且java文件中的属性要和配置文件中的对应
-
package com.demo.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; /** * @author mucd * @author mucd * @time 2022/2/9 15:17 */ @Configuration @ConfigurationProperties(prefix = "user") /** * 如果是properties的文件可以不用写后面的factory属性 */ //@PropertySource(value = "classpath:/resource.properties") /** * 获取到自己配置文件的路径 */ @PropertySource(value = "classpath:/resource.yaml",factory = YamlResourceFactory.class) public class ResourceConfig { private String name; private int age; 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; } }
-
注意这里的
YamlResourceFactory。class
是自己自定义的一个类,这个类写好基本就不用改动了 -
YamlResourceFactory.java
package com.demo.config; import com.sun.istack.internal.NotNull; 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.DefaultPropertySourceFactory; import org.springframework.core.io.support.EncodedResource; import java.io.IOException; import java.util.Properties; /** * 使用自定义的方法读取yaml瘟胶囊 * @author mucd * @time 2022/2/9 15:21 */ public class YamlResourceFactory extends DefaultPropertySourceFactory { @Override public PropertySource<?> createPropertySource(@NotNull String name, @NotNull EncodedResource resource) throws IOException { final YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); factory.setResources(resource.getResource()); factory.afterPropertiesSet(); final Properties object = factory.getObject(); String propertyName = name != null ? name : resource.getResource().getFilename(); assert propertyName != null; assert object != null; return new PropertiesPropertySource(propertyName, object); } }
-
最后在controller获取内容
-
MyConfigTest.java
@RestController public class MyConfigTest { @Autowired private ResourceConfig resourceConfig; @RequestMapping("/getConfig") public String getConfig() { return resourceConfig.getName() + "," + resourceConfig.getAge(); } }
-
这里哟啊吧和yaml对应的类使用
@Autowired
注解自动注入进来,然后在调用对象的get属性即可 -
打开浏览器测试
-
-
测试成功!!!!
简单的从配置文件获取数据的两种方式就搞定啦 !
觉得有帮助的小伙伴不要吝啬手中的赞👍哦,哈哈