不少小夥伴都在問:冰河,你的Spring專題更新完了嗎?怎麼感受像是寫了一半啊?我:沒有更新完呀,整個專題預計會有70多篇。那怎麼更新了一半就去寫別的了呢?那是由於有不少其餘的小夥伴在後臺留言說:急需學習一些其餘的技術,因此,臨時調整的。放心,Spring專題會持續更新的!這不,今天,咱們就繼續更新Spring專題。不出意外的話,會一直持續更新完!!java
項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotationgit
@PropertySource註解是Spring 3.1開始引入的配置類註解。經過@PropertySource註解將properties配置文件中的值存儲到Spring的 Environment中,Environment接口提供方法去讀取配置文件中的值,參數是properties文件中定義的key值。也能夠使用@Value 註解用${}佔位符注入屬性。github
@PropertySource註解的源代碼以下所示。面試
package org.springframework.context.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.core.io.support.PropertySourceFactory; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Repeatable(PropertySources.class) public @interface PropertySource { String name() default ""; String[] value(); boolean ignoreResourceNotFound() default false; String encoding() default ""; Class<? extends PropertySourceFactory> factory() default PropertySourceFactory.class; }
從@PropertySource的源碼能夠看出,咱們能夠經過@PropertySource註解指定多個properties文件,能夠使用以下形式進行指定。spring
@PropertySource(value={"classpath:xxx.properties", "classpath:yyy.properties"})
細心的讀者能夠看到,在@PropertySource註解類的上面標註了以下的註解信息。設計模式
@Repeatable(PropertySources.class)
看到這裏,小夥伴們是否是有種恍然大悟的感受呢?沒錯,咱們也能夠使用@PropertySources註解來指定properties配置文件。數組
首先,咱們也是看下@PropertySources註解的源碼,以下所示。bash
package org.springframework.context.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.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface PropertySources { PropertySource[] value(); }
@PropertySources註解的源碼比較簡單,只有一個PropertySource[]數組類型的屬性value,那咱們如何使用@PropertySources註解指定配置文件呢?其實也很簡單,就是使用以下所示的方式就能夠了。微信
@PropertySources(value={ @PropertySource(value={"classpath:xxx.properties"}), @PropertySource(value={"classpath:yyy.properties"}), })
是否是很簡單呢?接下來,咱們就以一個小案例來講明@PropertySource註解的用法。併發
首先,咱們在工程的src/main/resources目錄下建立一個配置文件person.properties文件,文件的內容以下所示。
person.nickName=zhangsan
接下來,咱們在Person類中新增一個字段nickName,以下所示。
package io.mykit.spring.plugins.register.bean; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; import org.springframework.beans.factory.annotation.Value; import java.io.Serializable; /** * @author binghe * @version 1.0.0 * @description 測試實體類 */ @Data @ToString @NoArgsConstructor @AllArgsConstructor public class Person implements Serializable { private static final long serialVersionUID = 7387479910468805194L; @Value("binghe") private String name; @Value("#{20-2}") private Integer age; private String nickName; }
目前,咱們並無爲Person類的nickName字段賦值,因此,此時Person類的nickName字段的值爲空。咱們運行下PropertyValueTest類的testPropertyValue01()方法來看下輸出結果,以下所示。
org.springframework.context.annotation.internalConfigurationAnnotationProcessor org.springframework.context.annotation.internalAutowiredAnnotationProcessor org.springframework.context.annotation.internalCommonAnnotationProcessor org.springframework.context.event.internalEventListenerProcessor org.springframework.context.event.internalEventListenerFactory propertyValueConfig person ================================ Person(name=binghe, age=18, nickName=null) Process finished with exit code 0
能夠看出,Person類的nickName字段的值確實輸出了null。
若是咱們須要在xml文件中獲取person.properties文件中的值,則咱們首先須要在Spring的xml文件中引入context名稱空間,而且使用context命名空間導入person.properties文件,以後在bean的屬性字段中使用以下方式將person.properties文件中的值注入到Person類的nickName字段上。
<context:property-placeholder location="classpath:person.properties" /> <bean id = "person" class="io.mykit.spring.plugins.register.bean.Person"> <property name="name" value="binghe"></property> <property name="age" value="18"></property> <property name="nickName" value="${person.nickName}"></property> </bean>
整個bean.xml文件的內容以下所示。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/context/spring-context.xsd "> <context:property-placeholder location="classpath:person.properties"/> <bean id = "person" class="io.mykit.spring.plugins.register.bean.Person"> <property name="name" value="binghe"></property> <property name="age" value="18"></property> <property name="nickName" value="${person.nickName}"></property> </bean> </beans>
這樣就能夠將person.properties文件中的值注入到Person的nickName字段上。接下來,咱們在PropertyValueTest類中建立testPropertyValue02()測試方法,以下所示。
@Test public void testPropertyValue02(){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:beans.xml"); Person person = (Person) context.getBean("person"); System.out.println(person); }
咱們運行PropertyValueTest類中建立的testPropertyValue02()方法,輸出的結果信息以下所示。
Person(name=binghe, age=18, nickName=zhangsan)
若是咱們使用註解的方式該如何作呢?首先,咱們須要在PropertyValueConfig配置類上添加@PropertySource註解,以下所示。
package io.mykit.spring.plugins.register.config; import io.mykit.spring.plugins.register.bean.Person; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; /** * @author binghe * @version 1.0.0 * @description 測試屬性賦值 */ @PropertySource(value = {"classpath:person.properties"}) @Configuration public class PropertyValueConfig { @Bean public Person person(){ return new Person(); } }
這裏使用的@PropertySource(value = {"classpath:person.properties"})
就至關於xml文件中使用的<context:property-placeholder location="classpath:person.properties"/>
。
接下來,咱們就能夠在Person類的nickName字段上使用@Value註解來獲取person.properties文件中的值了,以下所示。
@Value("${person.nickName}") private String nickName;
配置完成後,咱們再次運行PropertyValueTest類的testPropertyValue01()方法來看下輸出結果,以下所示。
org.springframework.context.annotation.internalConfigurationAnnotationProcessor org.springframework.context.annotation.internalAutowiredAnnotationProcessor org.springframework.context.annotation.internalCommonAnnotationProcessor org.springframework.context.event.internalEventListenerProcessor org.springframework.context.event.internalEventListenerFactory propertyValueConfig person ================================ Person(name=binghe, age=18, nickName=zhangsan)
能夠看到,此時Person類的nickName字段已經注入了「zhangsan」這個值。
這裏,咱們在PropertyValueTest類中建立testPropertyValue03()方法,來使用Environment獲取person.properties中的值,以下所示。
@Test public void testPropertyValue03(){ AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(PropertyValueConfig.class); Environment environment = context.getEnvironment(); String nickName = environment.getProperty("person.nickName"); System.out.println(nickName); }
運行PropertyValueTest類中的testPropertyValue03()方法,輸出的結果信息以下所示。
zhangsan
能夠看到,使用Environment確實可以獲取到person.properties中的值。
關注「 冰河技術 」微信公衆號,後臺回覆 「設計模式」 關鍵字領取《深刻淺出Java 23種設計模式》PDF文檔。回覆「Java8」關鍵字領取《Java8新特性教程》PDF文檔。回覆「限流」關鍵字獲取《億級流量下的分佈式限流解決方案》PDF文檔,三本PDF均是由冰河原創並整理的超硬核教程,面試必備!!
好了,今天就聊到這兒吧!別忘了點個贊,給個在看和轉發,讓更多的人看到,一塊兒學習,一塊兒進步!!
若是你以爲冰河寫的還不錯,請微信搜索並關注「 冰河技術 」微信公衆號,跟冰河學習高併發、分佈式、微服務、大數據、互聯網和雲原生技術,「 冰河技術 」微信公衆號更新了大量技術專題,每一篇技術文章乾貨滿滿!很多讀者已經經過閱讀「 冰河技術 」微信公衆號文章,吊打面試官,成功跳槽到大廠;也有很多讀者實現了技術上的飛躍,成爲公司的技術骨幹!若是你也想像他們同樣提高本身的能力,實現技術能力的飛躍,進大廠,升職加薪,那就關注「 冰河技術 」微信公衆號吧,天天更新超硬核技術乾貨,讓你對如何提高技術能力再也不迷茫!