Spring Boot系列 Spring @Value 屬性注入使用總結一
阿新 • • 發佈:2019-02-15
@Value注入
不通過配置檔案的注入屬性的情況
通過@Value將外部的值動態注入到Bean中,使用的情況有:
- 注入普通字串
- 注入作業系統屬性
- 注入表示式結果
- 注入其他Bean屬性:注入beanInject物件的屬性another
- 注入檔案資源
-
注入URL資源
詳細程式碼見:
@Value("normal")
private String normal; // 注入普通字串
@Value("#{systemProperties['os.name']}")
private String systemPropertiesName; // 注入作業系統屬性
@Value ("#{ T(java.lang.Math).random() * 100.0 }")
private double randomNumber; //注入表示式結果
@Value("#{beanInject.another}")
private String fromAnotherBean; // 注入其他Bean屬性:注入beanInject物件的屬性another,類具體定義見下面
@Value("classpath:com/hry/spring/configinject/config.txt")
private Resource resourceFile; // 注入檔案資源
@Value("http://www.baidu.com")
private Resource testUrl; // 注入URL資源
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
注入其他Bean屬性:注入beanInject物件的屬性another
@Component
public class BeanInject {
@Value("其他Bean的屬性")
private String another;
public String getAnother() {
return another;
}
public void setAnother(String another) {
this.another = another;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
注入檔案資源:com/hry/spring/configinject/config.txt
test configuration file
- 1
測試類:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes=Application.class)
public class ConfiginjectApplicationTest {
@Autowired
private BaseValueInject baseValueInject;
@Test
public void baseValueInject(){
System.out.println(baseValueInject.toString());
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
執行測試類
normal=normal
systemPropertiesName=Windows 10
randomNumber=35.10603794922444
fromAnotherBean=其他Bean的屬性
resourceFile=test configuration file
testUrl=<html>...<title>百度一下,你就知道</title>...略</html>
- 1
- 2
- 3
- 4
- 5
- 6
通過配置檔案的注入屬性的情況
通過@Value將外部配置檔案的值動態注入到Bean中。配置檔案主要有兩類:
- application.properties。application.properties在spring boot啟動時預設載入此檔案
- 自定義屬性檔案。自定義屬性檔案通過@PropertySource載入。@PropertySource可以同時載入多個檔案,也可以載入單個檔案。如果相同第一個屬性檔案和第二屬性檔案存在相同key,則最後一個屬性檔案裡的key啟作用。載入檔案的路徑也可以配置變數,如下文的${anotherfile.configinject},此值定義在第一個屬性檔案config.properties
第一個屬性檔案config.properties內容如下:
${anotherfile.configinject}作為第二個屬性檔案載入路徑的變數值
book.name=bookName
anotherfile.configinject=placeholder
- 1
- 2
第二個屬性檔案config_placeholder.properties內容如下:
book.name.placeholder=bookNamePlaceholder
- 1
下面通過@Value(“${app.name}”)語法將屬性檔案的值注入bean屬性值,詳細程式碼見:
@Component
// 引入外部配置檔案組:${app.configinject}的值來自config.properties。
// 如果相同
@PropertySource({"classpath:com/hry/spring/configinject/config.properties",
"classpath:com/hry/spring/configinject/config_${anotherfile.configinject}.properties"})
public class ConfigurationFileInject{
@Value("${app.name}")
private String appName; // 這裡的值來自application.properties,spring boot啟動時預設載入此檔案
@Value("${book.name}")
private String bookName; // 注入第一個配置外部檔案屬性
@Value("${book.name.placeholder}")
private String bookNamePlaceholder; // 注入第二個配置外部檔案屬性
@Autowired
private Environment env; // 注入環境變數物件,儲存注入的屬性值
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append("bookName=").append(bookName).append("\r\n")
.append("bookNamePlaceholder=").append(bookNamePlaceholder).append("\r\n")
.append("appName=").append(appName).append("\r\n")
.append("env=").append(env).append("\r\n")
// 從eniroment中獲取屬性值
.append("env=").append(env.getProperty("book.name.placeholder")).append("\r\n");
return sb.toString();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
測試程式碼:
Application.java同上文
@RunWith(SpringRunner.class)
@SpringBootTest(classes=Application.class)
public class ConfiginjectApplicationTest {
@Autowired
private ConfigurationFileInject configurationFileInject;
@Test
public void configurationFileInject(){
System.out.println(configurationFileInject.toString());
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
測試執行結果:
bookName=bookName
bookNamePlaceholder=bookNamePlaceholder
appName=appName
env=StandardEnvironment {activeProfiles=[], defaultProfiles=[default], propertySources=[Inlined Test Properties,systemProperties,systemEnvironment,random,applicationConfig: [classpath:/application.properties],class path resource [com/hry/spring/configinject/config_placeholder.properties],class path resource [com/hry/spring/configinject/config.properties]]}
env=bookNamePlaceholder
- 1
- 2
- 3
- 4
- 5
- 6