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標籤把當前要注入的配置註冊一下才可以使用,用法見。