欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年07月09日 15:22:41   作者:還是轉(zhuǎn)轉(zhuǎn)  
這篇文章主要介紹了使用@Value值注入及配置文件組件掃描方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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

spring配置文件對(duì)應(yīng)的是父容器,springMVC配置文件產(chǎn)生的是子容器,前者一般配置數(shù)據(jù)源,事務(wù),注解等,當(dāng)然還可以進(jìn)一步將一些配置細(xì)化到其他xml中;后者一般配置控制層相關(guān)的,如靜態(tài)資源,視圖解析器等。

系統(tǒng)啟動(dòng)的時(shí)候,先初始化父容器,然后初始化子容器。這里會(huì)涉及一個(gè)問題,如果配置組件掃描時(shí)都配置全組件掃描,就會(huì)導(dǎo)致service組件會(huì)被掃描兩次,造成事務(wù)無(wú)法處理。

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

在spring的配置文件中配置:

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

在springMVC的配置文件中配置:

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

這樣就能各司其職了。

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

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

如果只在spring的配置文件中配置,那么在controller中是不會(huì)注入成功的。原因是:在項(xiàng)目啟動(dòng)時(shí),先初始化父容器,再初始化子容器。如果兩者在初始化時(shí)掃描了同樣的組件,則子容器會(huì)覆蓋父容器的相關(guān)的bean。子容器因?yàn)闆]有配置環(huán)境變量的文件bean,因此會(huì)用null覆蓋掉原值(子容器能看到父容器的bean,反過(guò)來(lái)則不行)。

測(cè)試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進(jìn)行注入時(shí)有兩種方式,占位符和spel表達(dá)式

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

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

<!--基于占位符方式 配置單個(gè)properties -->
    <!--<context:property-placeholder location="conf/jdbc.properties"/>-->
    <!--基于占位符方式 配置多個(gè)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表達(dá)式 配置多個(gè)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表達(dá)式 配置單個(gè)properties -->
    <!--<util:properties id="configProperties" location="classpath:conf/jdbc.properties"/>-->

Spring @Value獲取不到值

一、問題背景

這兩天做東西的時(shí)候發(fā)現(xiàn)一個(gè)問題,在SpringMVC中使用@Value的時(shí)候,無(wú)法獲取@Value對(duì)應(yīng)的值。在網(wǎng)上查閱了各種資料之后,總結(jié)一下。

二、@Value注解的作用

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

properties內(nèi)容定義形式:名稱=值

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

當(dāng)需要這些常量的時(shí)候,通過(guò)加載properties文件,在需要的位置使用這些常量,當(dāng)需要修改這些常量值的時(shí)候,只要在配置文件中修改就可以了。

在沒有使用spring之前,想使用配置文件當(dāng)中的數(shù)據(jù)必須得自己手工寫代碼加載配置文件。但是在使用spring的時(shí)候,這種操作可以通過(guò)在spring中添加一個(gè)配置來(lái)完成。

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

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

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

三、獲取不到值的情況

1)當(dāng)SpringMVC與Spring整合使用的時(shí)候,在Controller中無(wú)法獲取@Value對(duì)應(yīng)的值。(剛開始我就是這種情況)

產(chǎn)生原因:只在applicationContext中添加了掃描,沒有在SpringMVC對(duì)應(yīng)的配置文件中掃描。

applicationContext加載的是父容器,,父容器在項(xiàng)目啟動(dòng)的時(shí)候就被加載了。SpringMVC對(duì)應(yīng)的配置文件加載的是子容器,子容器可以訪問父容器的對(duì)象,但是不能訪問加載的配置文件。所以,如果想在SpringMVC中使用加載的配置文件,需要在SpringMVC對(duì)應(yīng)的配置文件中添加相應(yīng)的配置即可。

2)在service或者dao層無(wú)法獲取@Value的數(shù)值。

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

那么,當(dāng)需要加載多個(gè)properties的時(shí)候,如何解決?可以用下面的方法

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

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解析SpringBoot中@Autowire注解的實(shí)現(xiàn)原理

    解析SpringBoot中@Autowire注解的實(shí)現(xiàn)原理

    在開發(fā)Java項(xiàng)目時(shí),依賴注入是一種常見的實(shí)現(xiàn)方式,SpringBoot框架通過(guò)@Autowired注解來(lái)實(shí)現(xiàn)依賴注入的功能,本文將介紹SpringBoot中 Autowired注解實(shí)現(xiàn)的原理
    2023-06-06
  • Spring boot實(shí)現(xiàn)應(yīng)用打包部署的示例

    Spring boot實(shí)現(xiàn)應(yīng)用打包部署的示例

    本篇文章主要介紹了Spring boot實(shí)現(xiàn)應(yīng)用打包部署的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • 基于Restful接口調(diào)用方法總結(jié)(超詳細(xì))

    基于Restful接口調(diào)用方法總結(jié)(超詳細(xì))

    下面小編就為大家?guī)?lái)一篇基于Restful接口調(diào)用方法總結(jié)(超詳細(xì))。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • 源碼解析JDK 1.8 中的 Map.merge()

    源碼解析JDK 1.8 中的 Map.merge()

    這篇文章主要介紹了JDK 1.8 之 Map.merge()的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 一文詳解Java屬性為什么不能是is開頭的boolean

    一文詳解Java屬性為什么不能是is開頭的boolean

    在Java實(shí)體類定義中,boolean類型的屬性命名常引發(fā)爭(zhēng)議,阿里巴巴Java開發(fā)手冊(cè)建議避免使用is作為布爾類型屬性的前綴,原因在于當(dāng)實(shí)體類被序列化或反序列化時(shí),基于JavaBean規(guī)范的框架可能會(huì)移除或忽略is,導(dǎo)致不一致的字段名,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • 詳解Java多線程處理List數(shù)據(jù)

    詳解Java多線程處理List數(shù)據(jù)

    這篇文章主要介紹了Java多線程處理List數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • SpringBoot + minio實(shí)現(xiàn)分片上傳、秒傳、續(xù)傳功能

    SpringBoot + minio實(shí)現(xiàn)分片上傳、秒傳、續(xù)傳功能

    MinIO是一個(gè)基于Go實(shí)現(xiàn)的高性能、兼容S3協(xié)議的對(duì)象存儲(chǔ),使用MinIO構(gòu)建用于機(jī)器學(xué)習(xí),分析和應(yīng)用程序數(shù)據(jù)工作負(fù)載的高性能基礎(chǔ)架構(gòu),這篇文章主要介紹了SpringBoot + minio實(shí)現(xiàn)分片上傳、秒傳、續(xù)傳,需要的朋友可以參考下
    2023-06-06
  • Mybatis通過(guò)攔截器實(shí)現(xiàn)單數(shù)據(jù)源內(nèi)多數(shù)據(jù)庫(kù)切換

    Mybatis通過(guò)攔截器實(shí)現(xiàn)單數(shù)據(jù)源內(nèi)多數(shù)據(jù)庫(kù)切換

    這篇文章主要為大家詳細(xì)介紹了Mybatis如何通過(guò)攔截器實(shí)現(xiàn)單數(shù)據(jù)源內(nèi)多數(shù)據(jù)庫(kù)切換,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • 利用JAVA反射,讀取數(shù)據(jù)庫(kù)表名,自動(dòng)生成對(duì)應(yīng)實(shí)體類的操作

    利用JAVA反射,讀取數(shù)據(jù)庫(kù)表名,自動(dòng)生成對(duì)應(yīng)實(shí)體類的操作

    這篇文章主要介紹了利用JAVA反射,讀取數(shù)據(jù)庫(kù)表名,自動(dòng)生成對(duì)應(yīng)實(shí)體類的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • 實(shí)現(xiàn)java簡(jiǎn)單的線程池

    實(shí)現(xiàn)java簡(jiǎn)單的線程池

    這篇文章主要為大家詳細(xì)介紹了java簡(jiǎn)單實(shí)現(xiàn)多線程,及java爬蟲使用線程池實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評(píng)論