利用@Value注解為bean的屬性賦值方法總結
1.@Value注解
@Value注解的源碼,如下所示
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Value { String value(); }
從@Value注解的源碼中可以看出,@Value注解可以標注在字段、方法、參數以及注解上,而且在程序運行期間生效
2.@Value注解的用法
2.1.不通過配置文件注入屬性的情況
通過@Value注解將外部的值動態(tài)注入到bean的屬性中,一般有如下這幾種情況
- 注入普通字符串
@Value("liqb") private String name; // 注入普通字符串
- 注入操作系統(tǒng)屬性
@Value("#{systemProperties['os.name']}") private String systemPropertiesName; // 注入操作系統(tǒng)屬性
- 注入SpEL表達式結果
@Value("#{ T(java.lang.Math).random() * 100.0 }") private double randomNumber; //注入SpEL表達式結果
- 注入其他bean中屬性的值
@Value("#{person.name}") private String username; // 注入其他bean中屬性的值,即注入person對象的name屬性中的值
- 注入文件資源
@Value("classpath:/config.properties") private Resource resourceFile; // 注入文件資源
- 注入URL資源
@Value("http://www.baidu.com") private Resource url; // 注入URL資源
2.2.通過配置文件注入屬性的情況
在項目的src/main/resources目錄下新建一個屬性文件,例如person.properties,其內容如下:
person.nickName=liqb
新建MainConfigOfPropertyValues配置類,在該類上使用@PropertySource注解讀取外部配置文件中的key/value并保存到運行的環(huán)境變量中
package com.tianxia.springannotation.config; import com.tianxia.springannotation.entity.Person; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; /** * 配置類 * @author liqb * @date 2023-05-04 11:28 **/ @Configuration @PropertySource(value={"classpath:/person.properties"}) public class MainConfigOfPropertyValues { @Bean public Person person() { return new Person(); } }
加載完外部的配置文件以后,就可以使用${key}取出配置文件中key所對應的值,并將其注入到bean的屬性中了
package com.tianxia.springannotation.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.beans.factory.annotation.Value; import java.io.Serializable; /** * Person類 * @author liqb * @date 2023-04-21 16:00 **/ @Data @NoArgsConstructor @AllArgsConstructor public class Person implements Serializable { /** * 姓名 */ private String name; /** * 年齡 */ private Integer age; /** * 昵稱 */ @Value("${person.nickName}") private String nickName; public Person(String name, Integer age) { this.name = name; this.age = age; } }
2.3.@Value中#{···}和${···}的區(qū)別
提供一個測試屬性文件,advance_value_inject.properties,內容如下所示
server.name=server1,server2,server3 author.name=liqb
新建AdvanceValueInject類,并在該類上使用@PropertySource注解讀取外部屬性文件中的key/value并保存到運行的環(huán)境變量中,即加載外部的advance_value_inject.properties屬性文件。
package com.tianxia.springannotation.config; import com.tianxia.springannotation.entity.Person; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; /** * 配置類 * @author liqb * @date 2023-05-04 11:28 **/ @Configuration @PropertySource(value={"classpath:/person.properties"}) public class MainConfigOfPropertyValues { @Bean public Person person() { return new Person(); } }
2.3.1.${···}的用法
{}里面的內容必須符合SpEL表達式,通過@Value(“${spelDefault.value}”)我們可以獲取屬性文件中對應的值,但是如果屬性文件中沒有這個屬性,那么就會報錯。不過,我們可以通過賦予默認值來解決這個問題,如下所示。
@Value("${author.name:liqb}") private String name;
表示向bean的屬性中注入屬性文件中的author.name屬性所對應的值,如果屬性文件中沒有author.name這個屬性,那么便向bean的屬性中注入默認值liqb。
2.3.2.#{···}的用法
{}里面的內容同樣也是必須符合SpEL表達式。例如,
// SpEL:調用字符串Hello World的concat方法 @Value("#{'Hello World'.concat('!')}") private String helloWorld; // SpEL:調用字符串的getBytes方法,然后再調用其length屬性 @Value("#{'Hello World'.bytes.length}") private String helloWorldBytes;
2.3.3.${···}和#{···}的混合使用
${···}和#{···}可以混合使用,例如:
// SpEL:傳入一個字符串,根據","切分后插入列表中, #{}和${}配合使用時,注意不能反過來${}在外面,而#{}在里面 @Value("#{'${server.name}'.split(',')}") private List<String> severs;
上面片段的代碼的執(zhí)行順序:通過**${server.name}從屬性文件中獲取值并進行替換,然后就變成了執(zhí)行SpEL表達式{‘server1,server2,server3’.split(‘,’)}**。
2.3.4.小結
#{···}:用于執(zhí)行SpEl表達式,并將內容賦值給屬性
${···}:主要用于加載外部屬性文件中的值
${···}和#{···}可以混合使用,但是必須#{}在外面
以上就是利用@Value注解為bean的屬性賦值方法總結的詳細內容,更多關于@Value為bean屬性賦值的資料請關注腳本之家其它相關文章!