功能
加載指定的屬性文件(*.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()); } }
啟動項目即可看到效果。
從截圖中可以看出,需要讀取的屬性配置,都已經成功讀取出來了。