1. 程式人生 > >Spring Boot系列 Spring @Value 屬性注入使用總結一

Spring Boot系列 Spring @Value 屬性注入使用總結一

@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

程式碼