1. 程式人生 > >Spring注入值(Value註解)

Spring注入值(Value註解)

背景

Spring開發過程中經常遇到需要把特殊的值注入到成員變數裡,比如普通值、檔案、網址、配置資訊、系統 變數等等。Spring主要使用註解@Value把對應的值注入到變數中。
常用的注入型別有以下幾種:
1. 注入普通字串。
2. 注入作業系統屬性。
3. 注入表示式運算結果。
4. 注入其他bean的屬性。
5. 注入檔案內容。
6. 注入網址資訊。
7. 注入屬性檔案。

示例

準備

由於例子需要讀取檔案和網頁內容,為了方便讀取,我們引入一個IO包:

<dependency>
   <groupId>commons-io</groupId
>
<artifactId>commons-io</artifactId> <version>2.4</version> </dependency>

在rescoures下面建立一個資料夾,名稱為ch2.value。
在資料夾下面建立一個test.text,內容隨意,我們的內容是”測試檔案”。
在資料夾下面再建立一個test.properties,內容為:

book.author = feige
book.name = spring

測試bean

新建一個用來測試的類,宣告成一個bean。

@Service
public class DemoService { @Value("我是其他屬性") private String anotherValue; public String getAnotherValue() { return anotherValue; } public void setAnotherValue(String anotherValue) { this.anotherValue = anotherValue; } }

配置類

@Configuration
@ComponentScan
("ch2.value") @PropertySource("classpath:ch2/value/test.properties") public class Config { @Value("我是個普通字串") private String nornal; @Value("#{systemEnvironment['os.name']}") private String osName; @Value("#{T(java.lang.Math).random()*1000.0}") private double randomNumber; @Value("#{demoService.anotherValue}") private String anotherValue; @Value("classpath:ch2/value/test.txt") private Resource testFile; @Value("http://www.baidu.com") private Resource testUrl; @Value("${book.name}") private String bookName; @Autowired private Environment environment; public void outSource(){ System.out.println(nornal); System.out.println(osName); System.out.println(randomNumber); System.out.println(anotherValue); try { System.out.println(IOUtils.toString(testFile.getInputStream())); System.out.println(IOUtils.toString(testUrl.getInputStream())); }catch (Exception e){ e.printStackTrace(); } System.out.println(bookName); System.out.println(environment.getProperty("book.author")); } }

執行示例

public class Main {
    public static void main(String []args){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        Config config = context.getBean(Config.class);
        config.outSource();
    }
}

目錄結構

這裡寫圖片描述

執行結果

我是個普通字串
null
47.47599424058235
我是其他屬性
測試檔案
spring
14:11:10.719 [main] DEBUG org.springframework.core.env.PropertySourcesPropertyResolver - Found key 'book.author' in [class path resource [ch2/value/test.properties]] with type [String]
feige

知識點總結

@Configuration

由Configuration的註解宣告的類,就相當於Spring的一個xml配置檔案,通過例項化一個AnnotationConfigApplicationContext物件,引入這個配置類:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);

AnnotationConfigApplicationContext構造方法是否可以傳入多個由Configuration宣告的類呢?答案是肯定的。
本示例使用的AnnotationConfigApplicationContext的構造方法如下:

    public AnnotationConfigApplicationContext(Class... annotatedClasses) {
        this();
        this.register(annotatedClasses);
        this.refresh();
    }

@ComponentScan

ComponentScan註解可以傳入一個包名代表掃碼此包名下的所有類,把有註解宣告的類載入到Spring容器中,示例@ComponentScan(“ch2.value”)會掃描包ch2.value下所有的類,把註解宣告的類都載入到Spring容器中。

@PropertySource

PropertySource註解可以傳入一個檔案或者資料夾,此註解載入檔案或者資料夾下所有的.properties檔案內容到Spring的配置項裡,供Value註解使用。

@Value

普通字串

    @Value("我是個普通字串")
    private String nornal;

作業系統屬性

    @Value("#{systemEnvironment['os.name']}")
    private String osName;

作業系統的屬性是靜態全域性變數systemEnvironment存入,可通過它獲取到作業系統的屬性。

表示式值

@Value("#{T(java.lang.Math).random()*1000.0}")
    private double randomNumber;

表示式的物件必須是通過T()包起來,才能執行。

其他Bean的屬性

    @Value("#{demoService.anotherValue}")
    private String anotherValue;

demoService是一個Bean物件,anotherValue是它的一個屬性,可以通過@Value(“#{demoService.anotherValue}”)將這個bean的屬性注入@Value宣告的屬性裡。

注入檔案資源

    @Value("classpath:ch2/value/test.txt")
    private Resource testFile;

通過Resource接收這個檔案。

注入網頁資源

    @Value("http://www.baidu.com")
    private Resource testUrl;

通過Resource接收這個資源。

注入配置屬性

    @Value("${book.name}")
    private String bookName;

通過${}注入配置屬性,注意不是#號,這個是和其他的不一樣,另外在Spring 4中需要用property-placeholder標籤把當前要注入的配置註冊一下才可以使用,用法