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ù)、注釋類型。
- 編譯器會將 @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文件的配置如下:

測試用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;
}
}啟動項(xiàng)目,查看結(jié)果
啟動SpringBoot項(xiàng)目,瀏覽器輸入localhost:8080/test,界面顯示如下。

二、@Value作用于靜態(tài)變量
正常情況下 @Value不可作用于靜態(tài)屬性。
如下例。 啟動類上做如下修改:
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)屬性,啟動項(xiàng)目時(shí)不會報(bào)錯,但是也不會給該靜態(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 類用于測試,其有一個(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);
}
}啟動項(xiàng)目后通過控制臺日志可以看到,userName的值為zhangsan??刂婆_日志如下

總結(jié)
從以上測試結(jié)果可以看出:
- application.yml和application.properties中配置的值都可以通過@Value注解獲?。?/li>
- 若application.yml和application.properties同時(shí)配有同一個(gè)變量的值,則以application.yml的值為主;
- 配置文件中的字段名和@Value修飾的屬性名可以不一致
- @Value若從配置文件中獲取不到值,則設(shè)置的默認(rèn)值才生效。
- 若配置文件中有配置,則默認(rèn)值不生效。
通過對@Value的以上分析,我們還不難看出,SpringBoot加載配置文件的順序?yàn)?yml > .properties。即yml類型的優(yōu)先級高于properties類型的配置文件。
到此這篇關(guān)于Spring注解之@Value詳解的文章就介紹到這了,更多相關(guān)@Value注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決springboot的findOne方法沒有合適的參數(shù)使用問題
這篇文章主要介紹了解決springboot的findOne方法沒有合適的參數(shù)使用問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
mybatisplus下劃線駝峰轉(zhuǎn)換的問題解決
在mybatis-plus中,下劃線-駝峰自動轉(zhuǎn)換可能導(dǎo)致帶下劃線的字段查詢結(jié)果為null,本文就來介紹一下mybatisplus下劃線駝峰轉(zhuǎn)換的問題解決,感興趣的可以了解一下2024-10-10
關(guān)于Java中try finally return語句的執(zhí)行順序淺析
這篇文章主要介紹了關(guān)于Java中try finally return語句的執(zhí)行順序淺析,需要的朋友可以參考下2017-08-08

