Spring注解之@Value詳解
@Value
@Value注解位于spring-beans中,以下是@Value注解的源碼:
package org.springframework.beans.factory.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Value {
String value();
}由上可以看出:
- @Value可以修飾屬性、方法、參數(shù)、注釋類型。
- 編譯器會(huì)將 @Value注解的信息保留在 .class 文件中,并且能被虛擬機(jī)讀取。
- @Value可以出現(xiàn)在 javadoc 中。
- 該注解中的String value(); 意味著,@Value能指定參數(shù)。
@Value的用法
@Value可以獲取配置文件中的值,設(shè)置給屬性,也可以引用Bean的屬性值。下面通過SpringBoot項(xiàng)目講解@Value的用法。
一、@Value引用配置文件中的屬性值
使用@Value引用配置文件中的屬性值的方式為
@Value("${屬性名}")
application.yml的配置
application.yml文件的配置如下:
ymlname: only-yml student: name: yml里的name age: 20 tel : 666
application.properties的配置
application.properties文件的配置如下:

測(cè)試用Controller
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class TestValueController {
// 只在application.yml中配置
@Value("${ymlname}")
private String ymlname;
// 只在application.properties中配置
@Value("${propname}")
private String propname;
// application.yml和application.properties均有該配置
@Value("${student.name}")
private String name;
// 配置文件中的字段名和屬性名不一致
@Value("${student.age}")
private int nianling;
// application.yml和application.properties均沒有該配置,設(shè)置默認(rèn)值
@Value("${student.score:100}")
private int score;
// application.yml有該配置,同時(shí)設(shè)置默認(rèn)值
@Value("${student.tel:888}")
public int tel;
@ResponseBody
@RequestMapping(value = "/test")
public String testValue() {
return "ymlname —— " + ymlname + "<br/>" +
"propname —— " + propname + "<br/>" +
"name —— " + name + "<br/>" +
"nianling —— " + nianling + "<br/>" +
"score —— " + score + "<br/>" +
"tel —— " + tel;
}
}啟動(dòng)項(xiàng)目,查看結(jié)果
啟動(dòng)SpringBoot項(xiàng)目,瀏覽器輸入localhost:8080/test,界面顯示如下。

二、@Value作用于靜態(tài)變量
正常情況下 @Value不可作用于靜態(tài)屬性。
如下例。 啟動(dòng)類上做如下修改:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootTestApplication {
@Value("${student.name}")
public static String name;
public static void main(String[] args) {
SpringApplication.run(SpringbootTestApplication.class, args);
System.out.println("name: " + name);
}
}打印結(jié)果如下:

通過上例可以看出,使用@Value注解修飾靜態(tài)屬性,啟動(dòng)項(xiàng)目時(shí)不會(huì)報(bào)錯(cuò),但是也不會(huì)給該靜態(tài)屬性設(shè)置值。 可以通過set方法給靜態(tài)屬性設(shè)置配置文件中的屬性值。
public static String name;
@Value("${student.name}")
public void setName(String param) {
name = param;
}三、@Value引用Bean的屬性值
使用@Value引用Bean的屬性值的方式和引用配置文件中的屬性值方式類似。使用方式為
@Value("#{bean的名字.屬性值}")
以通過@Value注解引用User實(shí)例的name屬性值為例;
User類:
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class User {
private String name;
private String password;
}配置一個(gè)TestConfig類,用于產(chǎn)生一個(gè)name為zhangsan,password為66666的名為user的bean實(shí)例交由spring容器管理。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TestConfig {
@Bean(name = "user")
public User getUser() {
return new User("zhangsan","66666");
}
}TestBeanPro 類用于測(cè)試,其有一個(gè)userName屬性,通過@Value注解將容器中名為user的bean的name屬性注入給userName。@PostConstruct注解的方法于該類的構(gòu)造方法執(zhí)行完成后執(zhí)行。在本例中,該初始化方法用于打印user的name屬性是否引用成功。
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Slf4j
@Component
public class TestBeanPro {
@Value("#{user.name}")
private String userName;
@PostConstruct
public void init() {
log.info("***************************** userName:{}.", userName);
}
}啟動(dòng)項(xiàng)目后通過控制臺(tái)日志可以看到,userName的值為zhangsan??刂婆_(tái)日志如下

總結(jié)
從以上測(cè)試結(jié)果可以看出:
- application.yml和application.properties中配置的值都可以通過@Value注解獲??;
- 若application.yml和application.properties同時(shí)配有同一個(gè)變量的值,則以application.yml的值為主;
- 配置文件中的字段名和@Value修飾的屬性名可以不一致
- @Value若從配置文件中獲取不到值,則設(shè)置的默認(rèn)值才生效。
- 若配置文件中有配置,則默認(rèn)值不生效。
通過對(duì)@Value的以上分析,我們還不難看出,SpringBoot加載配置文件的順序?yàn)?yml > .properties。即yml類型的優(yōu)先級(jí)高于properties類型的配置文件。
到此這篇關(guān)于Spring注解之@Value詳解的文章就介紹到這了,更多相關(guān)@Value注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成Tomcat服務(wù)架構(gòu)配置
這篇文章主要為大家介紹了SpringBoot集成Tomcat服務(wù)架構(gòu)配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
解析Spring Boot內(nèi)嵌tomcat關(guān)于getServletContext().getRealPath獲取得到臨時(shí)
大家都很糾結(jié)這個(gè)問題在使用getServletContext().getRealPath()得到的是臨時(shí)文件的路徑,每次重啟服務(wù),這個(gè)臨時(shí)文件的路徑還好變更,下面小編通過本文給大家分享Spring Boot內(nèi)嵌tomcat關(guān)于getServletContext().getRealPath獲取得到臨時(shí)路徑的問題,一起看看吧2021-05-05
從入門到實(shí)戰(zhàn)詳解如何使用Apache?POI操作Word文檔
Apache?POI是Java生態(tài)中最流行的Microsoft?Office文檔操作庫之一,它為Word文檔提供了全面的API支持,下面我們來看看如何使用Apache?POI進(jìn)行word文檔的操作吧2025-06-06
配置springboot項(xiàng)目動(dòng)靜分離打包分離lib方式
本文介紹了如何將Spring?Boot工程中的靜態(tài)資源和配置文件分離出來,以減少jar包大小,方便修改配置文件,通過在jar包同級(jí)目錄創(chuàng)建config目錄,并在pom文件中進(jìn)行相應(yīng)配置,可以實(shí)現(xiàn)配置文件的外部化,打包后的jar包和lib文件夾中分別存放了第三方j(luò)ar包和靜態(tài)資源文件2025-02-02
相冊(cè)管理系統(tǒng)(Java表單+xml數(shù)據(jù)庫存儲(chǔ))
這篇文章主要為大家詳細(xì)介紹了相冊(cè)管理系統(tǒng)的實(shí)現(xiàn)步驟,Java表單的文件上傳和下載,xml數(shù)據(jù)庫存儲(chǔ)信息,感興趣的小伙伴們可以參考一下2016-07-07
成功解決IDEA2020 Plugins 連不上、打不開的方法
這篇文章主要介紹了成功解決IDEA2020 Plugins 連不上、打不開的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Java保留兩位小數(shù)的實(shí)現(xiàn)方法
這篇文章主要介紹了 Java保留兩位小數(shù)的實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2017-06-06

