Spring使用@Value注解與@PropertySource注解加載配置文件操作
1、@Value注解簡(jiǎn)介
Spring框架提供的@Value注解可以將外部的值動(dòng)態(tài)注入到Bean中,@Value注解使用在字段、構(gòu)造器參數(shù)和方法參數(shù)上。
@Value可以指定屬性取值的表達(dá)式,支持通過(guò)#{}使用SpringEL來(lái)取值,也支持使用${}來(lái)將屬性來(lái)源中(Properties文件、本地環(huán)境變量、系統(tǒng)屬性等)的值注入到Bean的屬性中。
此注解值的注入發(fā)生在AutowiredAnnotationBeanPostProcessor類(lèi)中。
@Value注解實(shí)現(xiàn)以下幾種情況:
(1)注入普通字符;
(2)注入操作系統(tǒng)屬性;
(3)注入表達(dá)式運(yùn)算結(jié)果;
(4)注入其他Bean的屬性;
(5)注入文件內(nèi)容;
(6)注入網(wǎng)址內(nèi)容;
(7)注入屬性文件。
2、@PropertySource注解簡(jiǎn)介
@PropertySource注解可以加載指定的屬性文件(*.properties)到 Spring 的 Environment 中。可以配合 @Value 和 @ConfigurationProperties 使用。語(yǔ)法格式如下:
@PropertySource(value = "classpath:com/pjb/el/user.properties",encoding = "UTF-8") public class UserInfo { }
【實(shí)例】使用@Value注解與@PropertySource注解加載配置文件。
(1)創(chuàng)建用戶(hù)信息屬性文件(user.properties)
user.userId=1 user.userName=pan_junbiao的博客 user.blogUrl=https://blog.csdn.net/pan_junbiao user.remark=您好,歡迎訪(fǎng)問(wèn) pan_junbiao的博客
(2)創(chuàng)建用戶(hù)信息實(shí)體類(lèi)(UserInfo.java)
使用@PropertySource注解加載配置文件信息,然后使用@Value注解注入屬性值。
package com.pjb.el; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; /** * 用戶(hù)信息實(shí)體類(lèi) * @author pan_junbiao **/ @Component @PropertySource(value = "classpath:com/pjb/el/user.properties",encoding = "UTF-8") public class UserInfo { //用戶(hù)ID @Value("${user.userId}") private int userId; //用戶(hù)姓名 @Value("${user.userName}") private String userName; //博客地址 @Value("${user.blogUrl}") private String blogUrl; //備注 @Value("${user.remark}") private String remark; //省略getter與setter方法... }
(3)運(yùn)行
public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ElConfig.class); UserInfo userInfo = context.getBean(UserInfo.class); //打印用戶(hù)信息 System.out.println("用戶(hù)編號(hào):" + userInfo.getUserId()); System.out.println("用戶(hù)姓名:" + userInfo.getUserName()); System.out.println("博客地址:" + userInfo.getBlogUrl()); System.out.println("備注信息:" + userInfo.getRemark()); }
執(zhí)行結(jié)果:
3、綜合實(shí)例
【實(shí)例】使用@Value注解實(shí)現(xiàn)多種情況值的注入和@PropertySource注解加載配置文件。
(1)添加相關(guān)的jar包
添加Spring支持及commons-io依賴(lài),pom.xml文件的配置如下:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>5.2.3.RELEASE</spring.version> </properties> <dependencies> <!-- Spring框架 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!-- commons-io依賴(lài) --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> </dependencies>
添加 commons-io.jar 可以簡(jiǎn)化文件相關(guān)操作,本實(shí)例中使用 commons-io 將 file 轉(zhuǎn)換成字符串。
(2)創(chuàng)建資源文件
在resources資源目錄下創(chuàng)建名稱(chēng)為info.txt的文本文件,文件內(nèi)容為:您好,歡迎訪(fǎng)問(wèn) pan_junbiao的博客。
在resources資源目錄下創(chuàng)建數(shù)據(jù)庫(kù)連接配置文件db.properties,該文件配置如下:
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/db_admin jdbc.username=root jdbc.password=123456
(3)需被注入的Bean
創(chuàng)建名為OtherUser.java的用戶(hù)信息類(lèi)。
package com.pjb.el; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; /** * 用戶(hù)信息類(lèi) * @author pan_junbiao **/ @Component public class OtherUser { //用戶(hù)名稱(chēng) @Value("pan_junbiao的博客") private String userName; //博客地址 @Value("https://blog.csdn.net/pan_junbiao") private String blogUrl; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getBlogUrl() { return blogUrl; } public void setBlogUrl(String blogUrl) { this.blogUrl = blogUrl; } }
(4)配置類(lèi)
創(chuàng)建名為ElConfig.java的配置類(lèi)。
package com.pjb.el; import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.core.env.Environment; import org.springframework.core.io.Resource; /** * 配置類(lèi) * @author pan_junbiao **/ @Configuration @ComponentScan("com.pjb.el") @PropertySource("classpath:db.properties") public class ElConfig { /** * 注入普通字符串 */ @Value("您好,歡迎訪(fǎng)問(wèn) pan_junbiao的博客") private String comment; /** * 注入操作系統(tǒng)屬性 */ @Value("#{systemProperties['os.name']}") private String osName; /** * 注入表達(dá)式運(yùn)算結(jié)果 */ @Value("#{ T(java.lang.Math).random() * 100.0 }") private double randomNumber; /** * 注入其他Bean的屬性 */ @Value("#{otherUser.userName}") private String fromUserName; @Value("#{otherUser.blogUrl}") private String fromBlogUrl; /** * 注入文件資源 */ @Value("classpath:info.txt") private Resource testFile; /** * 注入網(wǎng)址資源 */ @Value("https://blog.csdn.net/pan_junbiao") private Resource testUrl; /** * 注入配置文件 */ @Value("${jdbc.driver}") private String jdbc_driver; @Value("${jdbc.url}") private String jdbc_url; @Value("${jdbc.username}") private String jdbc_username; @Value("${jdbc.password}") private String jdbc_password; @Autowired private Environment environment; @Bean public static PropertySourcesPlaceholderConfigurer propertyConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } public void outputResource() { try { System.out.println("注入普通字符串:"); System.out.println(comment); System.out.println("------------------------------------------------"); System.out.println("注入操作系統(tǒng)屬性:"); System.out.println(osName); System.out.println("------------------------------------------------"); System.out.println("注入表達(dá)式運(yùn)算結(jié)果:"); System.out.println(randomNumber); System.out.println("------------------------------------------------"); System.out.println("注入其他Bean的屬性:"); System.out.println("用戶(hù)名稱(chēng):" + fromUserName); System.out.println("博客地址:"+ fromBlogUrl); System.out.println("------------------------------------------------"); System.out.println("注入文件資源:"); System.out.println("文件中的內(nèi)容:" + IOUtils.toString(testFile.getInputStream())); System.out.println("------------------------------------------------"); System.out.println("注入配置文件(方式一):"); System.out.println("數(shù)據(jù)庫(kù)驅(qū)動(dòng):" + jdbc_driver); System.out.println("數(shù)據(jù)庫(kù)連接:" + jdbc_url); System.out.println("數(shù)據(jù)庫(kù)用戶(hù):" + jdbc_username); System.out.println("數(shù)據(jù)庫(kù)密碼:" + jdbc_password); System.out.println("------------------------------------------------"); System.out.println("注入配置文件(方式二):"); System.out.println("數(shù)據(jù)庫(kù)驅(qū)動(dòng):" + environment.getProperty("jdbc.driver")); System.out.println("數(shù)據(jù)庫(kù)連接:" + environment.getProperty("jdbc.url")); System.out.println("數(shù)據(jù)庫(kù)用戶(hù):" + environment.getProperty("jdbc.username")); System.out.println("數(shù)據(jù)庫(kù)密碼:" + environment.getProperty("jdbc.password")); System.out.println("------------------------------------------------"); } catch (Exception ex) { ex.printStackTrace(); } } }
注入配置配件需要使用@PropertySource注解指定文件地址,若使用@Value注解,則要配置一個(gè)PropertySourcesPlaceholderConfigurer的Bean。注意,@Value("${jdbc.driver}")使用的是“${}”而不是“#{}”。
注入Properties還可以從Environment中獲得。
(5)運(yùn)行
package com.pjb.el; import org.springframework.context.annotation.AnnotationConfigApplicationContext; /** * 運(yùn)行類(lèi) * @author pan_junbiao **/ public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ElConfig.class); ElConfig resourceService = context.getBean(ElConfig.class); resourceService.outputResource(); context.close(); } }
執(zhí)行結(jié)果:
spring中@value注解需要注意
首先
@value需要參數(shù),這里參數(shù)可以是兩種形式:
@Value(“#{configProperties[‘t1.msgname']}”)
或者
@Value(“${t1.msgname}”);
其次
下面我們來(lái)看看如何使用這兩形式,在配置上有什么區(qū)別:
1、@Value(“#{configProperties[‘t1.msgname']}”)這種形式的配置中有“configProperties”,其實(shí)它指定的是配置文件的加載對(duì)象:配置如下:
classpath:/config/t1.properties
這樣配置就可完成對(duì)屬性的具體注入了;
2、@Value("${t1.msgname}")這種形式不需要指定具體加載對(duì)象,這時(shí)候需要一個(gè)關(guān)鍵的對(duì)象來(lái)完成PreferencesPlaceholderConfigurer,這個(gè)對(duì)象的配置可以利用上面配置1中的配置,也可以自己直接自定配置文件路徑。
如果使用配置1中的配置,可以寫(xiě)成如下情況:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer"> <property name="properties" ref="configProperties"/> </bean>
如果直接指定配置文件的話(huà),可以寫(xiě)成如下情況:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer"> <property name="location"> <value>config/t1.properties</value> </property> </bean>**重點(diǎn)內(nèi)容**
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Easyexcel實(shí)現(xiàn)不同場(chǎng)景的數(shù)據(jù)導(dǎo)出功能
這篇文章主要為大家詳細(xì)介紹了如何在不同場(chǎng)景下使用Easyexcel實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03Java實(shí)現(xiàn)不同的類(lèi)的屬性之間相互賦值
今天小編就為大家分享一篇關(guān)于Java實(shí)現(xiàn)不同的類(lèi)的屬性之間相互賦值,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03使用IntelliJ IDEA 進(jìn)行代碼對(duì)比的方法(兩種方法)
這篇文章給大家?guī)?lái)了兩種IntelliJ IDEA 進(jìn)行代碼對(duì)比的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-01-01Java多線(xiàn)程中ReentrantLock與Condition詳解
這篇文章主要介紹了Java多線(xiàn)程中ReentrantLock與Condition詳解,需要的朋友可以參考下2017-11-11