使用@Value值注入及配置文件组件扫描

这篇文章主要介绍了使用@Value值注入及配置文件组件扫描方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

使用@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=10TITLE_COUNT=10MESSAGE_COUNT=10BACK_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文件。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持趣讯吧。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/2108.html

(0)
上一篇 2021-07-10 01:45:19
下一篇 2021-07-10 01:45:21

相关推荐

  • 《国子监来了个女弟子》卓文远最后的结局是什么(,卓文远与桑祁最后在一起了吗)

    《国子监来了个女弟子》卓文远最后的结局是什么卓文远与桑祁最后在一起了吗可是命运捉弄了她,她不仅没有嫁给喜欢的人,也就是宴云之,还被当成筹码嫁给了腹黑的卓文远。她那种刁蛮性格的人

    2021-10-08
    2230
  • 猕猴桃可以连皮一起吃吗 猕猴桃皮有哪些功效

    猕猴桃是一种较为常见的水果食物,其味道可口迷人,吃完之后让人回味无穷,其中含有的营养成分也可以为健康带来不少的好处,但是吃猕猴桃也有许多要注意的地方,那么猕猴桃可以连皮一起吃吗?猕猴桃皮有哪些功效?猕猴桃皮是可以吃的,下面就来详细了解吧。猕猴桃皮可以吃吗猴桃的皮营养价值是最高的,猕猴桃外皮除含有丰富果胶,可降低血中胆固醇,更包含奇异果中百分之八十的营养,因此食用其外皮为最佳地选择。猕猴桃皮的功效1

    2023-03-07
    20
  • vipkid英语收费标准是多少(vipsing一对四课程价格)

    最近在网上看到很多家长在讨论英语培训班的事情,vipkid这家机构是被议论的最多的,特别是关于vipkid费用这一块。我之前给我家孩子找英语培训机构的时候有特意去咨询过,所以关于vipkid的收费问题我也是了解一些的,今天就来与大家一起分享下吧。在帮

    2021-11-04
    3060
  • 外贸soho如何(外贸soho如何注册公司)

    外贸soho如何,外贸soho如何注册公司 内容导航: 外贸自己做SOHO要怎样做压力大么前期的准备资 外贸SOHO怎么做 什么是外贸soho 做一名外贸soho好吗要从什么做起呢…

    2022-08-30
    310
  • 足球的样子怎么描写(怎样描写足球的样子)

    足球的样子怎么描写,怎样描写足球的样子 内容导航: 3本足球文,主角从助理教练开始,一步步登上绿茵教父的殿堂! 足球的样子是什么 踢足球的一连串动作怎么描写 一、3本足球文,主角从…

    2022-12-21
    00
  • 怎样才能瘦腰瘦肚子,怎么能快速瘦腰瘦肚子

    怎样才能瘦腰瘦肚子(怎么能快速瘦腰瘦肚子)你知道吗?减肥是会上瘾的,当你减掉3斤的时候,你就会渐渐提起了兴趣,当你减掉8斤的时候,你就小有成就了,当你减掉12斤的时候,你就天天都想瘦。今天给大家分享一道如何快速瘦肚子和腰的食谱。【材料】:黄瓜、柠檬、【具体步骤】:1、黄瓜洗净切成薄片。如何快速瘦肚子和腰?2、柠檬切成薄片。如何快速瘦肚子和腰?3、把6片黄瓜片和三片柠檬片放入杯子中。如何快速瘦肚子和

    2021-08-18 生活百科
    3400

发表回复

登录后才能评论