时间:2022-12-14 10:27:57 | 栏目:JAVA代码 | 点击:次
加载指定的属性文件(*.properties)到 Spring 的 Environment 中。可以配合 @Value 和@ConfigurationProperties 使用。
@PropertySource 和 @Value组合使用,可以将自定义属性文件中的属性变量值注入到当前类的使用@Value注解的成员变量中。
@PropertySource 和 @ConfigurationProperties组合使用,可以将属性文件与一个Java类绑定,将属性文件中的变量值注入到该Java类的成员变量中。
package org.springframework.context.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.core.io.support.PropertySourceFactory; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Repeatable(PropertySources.class) public @interface PropertySource { /** * 属性源的名称 */ String name() default ""; /** * 属性文件的存放路径 */ String[] value(); /** * 如果指定的属性源不存在,是否要忽略这个错误 */ boolean ignoreResourceNotFound() default false; /** * 属性源的编码格式 */ String encoding() default ""; /** * 属性源工厂 */ Class<? extends PropertySourceFactory> factory() default PropertySourceFactory.class; }
属性文件:demo.properties
demo.name=huang demo.sex=1 demo.type=demo
示例一:@PropertySource + @Value
package com.huang.pims.demo.props; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; @Component @PropertySource(value = {"demo/props/demo.properties"}) public class ReadByPropertySourceAndValue { @Value("${demo.name}") private String name; @Value("${demo.sex}") private int sex; @Value("${demo.type}") private String type; @Override public String toString() { return "ReadByPropertySourceAndValue{" + "name='" + name + '\'' + ", sex=" + sex + ", type='" + type + '\'' + '}'; } }
示例二:@PropertySource 和 @ConfigurationProperties
package com.huang.pims.demo.props; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; @Component @PropertySource(value = {"demo/props/demo.properties"}) @ConfigurationProperties(prefix = "demo") public class ReadByPropertySourceAndConfProperties { private String name; private int sex; private String type; public void setName(String name) { this.name = name; } public void setSex(int sex) { this.sex = sex; } public void setType(String type) { this.type = type; } public String getName() { return name; } public int getSex() { return sex; } public String getType() { return type; } @Override public String toString() { return "ReadByPropertySourceAndConfProperties{" + "name='" + name + '\'' + ", sex=" + sex + ", type='" + type + '\'' + '}'; } }
package com.huang.pims.demo.runners; import com.huang.pims.demo.props.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Component public class OutputPropsRunner implements CommandLineRunner { private static final Logger LOGGER = LoggerFactory.getLogger(OutputPropsRunner.class); @Autowired private ReadByPropertySourceAndValue readByPropertySourceAndValue; @Autowired private ReadByPropertySourceAndConfProperties readByPropertySourceAndConfProperties; @Override public void run(String... args) throws Exception { LOGGER.info(readByPropertySourceAndValue.toString()); LOGGER.info(readByPropertySourceAndConfProperties.toString()); } }
启动项目即可看到效果。
从截图中可以看出,需要读取的属性配置,都已经成功读取出来了。
@PropertySource是Spring boot为了方便引入properties配置文件提供的一个注解,可以标注在SpringBoot的启动类上,还可以标注在配置类(使用@Configuration标注的类)上。
@PropertySource(value = {"classpath:box.properties"})
将classpath下的box.properties,注入到Spring环境中,使用@Value("${key}")取值。
box.properties文件:
# 工具箱配置 preserveFilePath=/box/webserver/uploadfile/preservefile/
注入:
@SpringBootApplication @PropertySource(value = {"classpath:box.properties"}) public class ToolboxApiApplication { public static void main(String[] args) { SpringApplication.run(ToolboxApiApplication.class, args); } }
取值:
@RestController public class DeleteFileController { @Value("${preserveFilePath}") private String preserveFilePath; @GetMapping("/deleteFile") public void test(){ System.out.println(preserveFilePath); } }