中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用@Value值注入及配置文件組件掃描

發布時間:2021-07-09 18:30:38 來源:億速云 閱讀:294 作者:chen 欄目:開發技術

本篇內容介紹了“如何使用@Value值注入及配置文件組件掃描”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

@Value值注入及配置文件組件掃描

spring配置文件對應的是父容器,springMVC配置文件產生的是子容器,前者一般配置數據源,事務,注解等,當然還可以進一步將一些配置細化到其他xml中;后者一般配置控制層相關的,如靜態資源,視圖解析器等。

系統啟動的時候,先初始化父容器,然后初始化子容器。這里會涉及一個問題,如果配置組件掃描時都配置全組件掃描,就會導致service組件會被掃描兩次,造成事務無法處理。

所以最好在springMVC配置文件中只做controller的掃描,在spring配置文件中掃描其他組件。

在spring的配置文件中配置:

<context:component-scan base-package="com"/>

在springMVC的配置文件中配置:

<context:component-scan base-package="com.**.controller"/>

這樣就能各司其職了。

在使用中,這兩個配置文件作用不同。如果要使用@Value注入一些系統配置文件中的變量時要注意:如果要在controller中使用注入的變量,需要在springMVC的配置文件中配置:

<context:property-placeholder location="classpath:{your variable file}.properties"/>

如果只在spring的配置文件中配置,那么在controller中是不會注入成功的。原因是:在項目啟動時,先初始化父容器,再初始化子容器。如果兩者在初始化時掃描了同樣的組件,則子容器會覆蓋父容器的相關的bean。子容器因為沒有配置環境變量的文件bean,因此會用null覆蓋掉原值(子容器能看到父容器的bean,反過來則不行)。

測試demo如下:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml",
"classpath:servlet-dispatcher.xml"})
public class InjecTest {
    @Value("${ly.key}")
    private String key;
    @Test
    public void test(){
        System.out.println("注入的key為:"+key);
    }

基于@Value進行注入時有兩種方式,占位符和spel表達式

 //占位符方式
    @Value("${jdbc.url}")
    private String url;
 //SpEL表達方式,其中代表xml配置文件中的id值configProperties
    @Value("#{configProperties['jdbc.username']}")
    private String userName;

這兩種方式需要在xml中配置時也是不一樣的

<!--基于占位符方式 配置單個properties -->
    <!--<context:property-placeholder location="conf/jdbc.properties"/>-->
    <!--基于占位符方式 配置多個properties -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:config/resource/dev/application.properties</value>
                <value>classpath:config/resource/dev/lyframework.properties</value>
                <value>classpath:config/resource/dev/common.properties</value>
            </list>
      </property>
    </bean>
 <!--基于SpEL表達式 配置多個properties id值為configProperties 提供java代碼中使用 -->
    <bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="locations">
            <list>
                <value>classpath:/conf/jdbc.properties</value>
            </list>
        </property>
    </bean>
    <!--基于SpEL表達式 配置單個properties -->
    <!--<util:properties id="configProperties" location="classpath:conf/jdbc.properties"/>-->

Spring @Value獲取不到值

一、問題背景

這兩天做東西的時候發現一個問題,在SpringMVC中使用@Value的時候,無法獲取@Value對應的值。在網上查閱了各種資料之后,總結一下。

二、@Value注解的作用

為了減小耦合度,通常,將一些固定的常量放在配置文件***.properties中。

properties內容定義形式:名稱=值

SAY_COUNT=10
TITLE_COUNT=10
MESSAGE_COUNT=10
BACK_COUNT=10

當需要這些常量的時候,通過加載properties文件,在需要的位置使用這些常量,當需要修改這些常量值的時候,只要在配置文件中修改就可以了。

在沒有使用spring之前,想使用配置文件當中的數據必須得自己手工寫代碼加載配置文件。但是在使用spring的時候,這種操作可以通過在spring中添加一個配置來完成。

<context:property-placeholder location="classpath:resource/resource.properties"/>

在需要使用的地方,通過使用@Value注解,就可以自動完成注入。

@Value("${INDEX_TITLE}")
private Integer INDEX_TITLE;

三、獲取不到值的情況

1)當SpringMVC與Spring整合使用的時候,在Controller中無法獲取@Value對應的值。(剛開始我就是這種情況)

產生原因:只在applicationContext中添加了掃描,沒有在SpringMVC對應的配置文件中掃描。

applicationContext加載的是父容器,,父容器在項目啟動的時候就被加載了。SpringMVC對應的配置文件加載的是子容器,子容器可以訪問父容器的對象,但是不能訪問加載的配置文件。所以,如果想在SpringMVC中使用加載的配置文件,需要在SpringMVC對應的配置文件中添加相應的配置即可。

2)在service或者dao層無法獲取@Value的數值。

可能情況:有多個applicationContext.xml文件,里面有多個context:property-placeholder,在web容器啟動的時候同時加載了這些配置文件,這時候只會有一個配置文件中的context:property-placeholder會被加載,其他的不會被加載。

那么,當需要加載多個properties的時候,如何解決?可以用下面的方法

<context:property-placeholder location="classpath:resource/*.properties"/>

這樣,將所有需要加載的properties放在一個目錄之下,通過*.properties就可以加載所有的properties文件。

“如何使用@Value值注入及配置文件組件掃描”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东辽县| 平凉市| 思茅市| 台江县| 苗栗县| 乌兰县| 昌吉市| 巴东县| 招远市| 茌平县| 秦皇岛市| 清水县| 西充县| 丰城市| 丰镇市| 永川市| 长子县| 进贤县| 泸州市| 八宿县| 克什克腾旗| 清远市| 柞水县| 南木林县| 黔东| 大石桥市| 饶阳县| 丰县| 阿城市| 奈曼旗| 民勤县| 普定县| 丹江口市| 马鞍山市| 九江县| 马边| 凌云县| 万年县| 张北县| 琼海市| 霍林郭勒市|