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 文件中,并且能被虛擬機讀取。
- @Value可以出現(xiàn)在 javadoc 中。
- 該注解中的String value(); 意味著,@Value能指定參數(shù)。
@Value的用法
@Value可以獲取配置文件中的值,設(shè)置給屬性,也可以引用Bean的屬性值。下面通過SpringBoot項目講解@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è)置默認值 @Value("${student.score:100}") private int score; // application.yml有該配置,同時設(shè)置默認值 @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; } }
啟動項目,查看結(jié)果
啟動SpringBoot項目,瀏覽器輸入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)屬性,啟動項目時不會報錯,但是也不會給該靜態(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實例的name屬性值為例;
User類:
import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class User { private String name; private String password; }
配置一個TestConfig類,用于產(chǎn)生一個name為zhangsan,password為66666的名為user的bean實例交由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 類用于測試,其有一個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); } }
啟動項目后通過控制臺日志可以看到,userName的值為zhangsan??刂婆_日志如下
總結(jié)
從以上測試結(jié)果可以看出:
- application.yml和application.properties中配置的值都可以通過@Value注解獲??;
- 若application.yml和application.properties同時配有同一個變量的值,則以application.yml的值為主;
- 配置文件中的字段名和@Value修飾的屬性名可以不一致
- @Value若從配置文件中獲取不到值,則設(shè)置的默認值才生效。
- 若配置文件中有配置,則默認值不生效。
通過對@Value的以上分析,我們還不難看出,SpringBoot加載配置文件的順序為.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ù)使用問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08mybatisplus下劃線駝峰轉(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