@Value值注入及配置文件组件扫描方式

2023-10-28

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"/>-->
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@Value值注入及配置文件组件扫描方式 的相关文章

  • 【定位导航算法】粒子滤波基础认识

    粒子滤波基础认识 粒子滤波粒子核心思想 粒子滤波步骤 粒子滤波的优缺点 粒子滤波常用方法 马尔科夫模型 粒子滤波粒子核心思想 基于贝叶斯概率 随机采样 重要采样进行估算 关键 重要性密度函数的选择 粒子滤波步骤 根据初始化状态变量 gt 生

随机推荐

  • 判断主机操作系统的三种方法

    方法1 14分 通过更改URL大小写判断 服务器是linux还是winds 方法2 15分 可以通过TTL判断操作系统是linux还是windows https blog csdn net woshiwumingshi1 article d
  • Reference to '*****' is ambiguous;之类的问题解决

    造成这个问题的原因是 在一个以上的命名空间内被定义 使得有多个 同时满足 系统不知具体使用哪一个 如boost和std中都定义了function函数类型模板 如果在程序开头 同时使用using namespace std 和 using n
  • C++逐行解析Txt文本文件,并将相应的字符串转换为double等类型

    直接上代码 ReadTxt cpp 此文件包含 main 函数 程序执行将在此处开始并结束 include
  • 正则表达式匹配IPv4,IPv6

    简单学习了一下正则表达式 感觉IPv4 IPv6匹配挺实用的 记录一下 IPv4 25 0 5 2 0 4 d 1 d 2 1 9 d 3 25 0 5 2 0 4 d 1 d 2 1 9 d String IPv4Regex 25 0 5
  • 函数调用栈——初探!

    好些日子以前 我接触了Java 当时碰到一个问题 方法调用栈 当时不太明白 直到前段时间学了 数据结构 中的 栈 才略微的明白了一些 先将这个曾经不懂的地方总结一下 首先 必须对 栈 这种结构的特性有所了解 栈的特性 后进先出 在程序中 调
  • 万字超详细解析!Spring之基于注解的声明式事务

    14 1 概述 14 1 1 编程式事务 事务功能的相关操作全部通过自己编写代码来实现 Connection conn try 开启事务 关闭事务的自动提交 conn setAutoCommit false 核心操作 提交事务 conn c
  • iOS 16适配

    IDE环境相关升级 Xcode 14 0 macOS 12 4 Xcode 14 Beta 3 传送门 https developer apple com services account download path Developer T
  • Elasticsearch新手入门教程(已经是最简洁版)

    1 配置JDK环境 建议1 7以上 2 官网下载ES https www elastic co cn 3 解压启动 用dos命令进入压缩包里面 这里可修改端口 补充 插件使用 这里使用的elasticsearch head master 插
  • win10+wsl2+ubuntu+zsh+Powerlevel10k+nerd fonts

    wsl2 是适用于 linux 的 windows 子系统的新版本 是相对于 wsl1 的升级 简单理解就是 wsl2 是可以在 windows 下进行 linux 开发 在我开来 wsl2 和虚拟机没什么区别 wsl2 就是一个交互性优化
  • 信息收集----谷歌语句

    信息收集的方式可以分为两种 主动和被动 主动的信息收集方式 通过直接访问 扫描网站 这种将流量流经网站的行为 被动的信息收集方式 利用第三方的服务对目标进行访问了解 比如 Google搜索 通过搜索引擎 有时会给我们带来意想不到的效果 下面
  • thinkphp5 切换多语言

    请求时候 1 header中增加 Accept Language 语言 2 在请求地址中增加 lang 语言参数
  • python--unittest单元测试框架

    1 简介 unittest单元测试框架是受到 JUnit JAVA 的启发 与其他语言中的主流单元测试框架有着相似的风格 其支持测试自动化 配置共享代码测试 支持将测试样例聚合到测试集中 并将测试与报告框架独立 2 构成 静态类图 2 1
  • ajax发生错误,Ajax犯的错误处理方法

    1 ajax 发送请求时状态判断 if else 语句问题 var xhr new XMLHttpRequest xhr open get strUrl xhr onreadystatechange function if xhr read
  • 时序分析/约束(一):相关概念

    由 zme 于 星期四 02 20 2014 15 03 发表 http xilinx eetrend com blog 6631 时序分析时FPGA设计中永恒的话题 也是FPGA开发人员设计进阶的必由之路 慢慢来 先介绍时序分析中的一些基
  • uniapp 登入功能 vuex使用 通俗易懂

    目录 功能介绍 运行效果 未登入状态 登入页面 进行登入完后 代码演示 功能结构 请求封装 详细文章 部分api ts 关于 用户登入接口 store index ts store user ts main js App vue type
  • 2018-12-12 Pycharm git clone 密码错误

    在新建工程的时候选择了 clone from git 不小心把密码输错了 再次clone 不再提示输入密码 只提示错误 微信截图 20181212003707 png 进入 windows 凭据 点击下三角 删除即可 微信截图 201812
  • nodejs express multer 中文名乱码

    找了半天找不到 科学上网出去秒解决 哎 无力吐槽 不bb那么多 直接上代码 上传时前端正常 但是后端接收文件时乱码 const uploads multer 文件上传的位置 dest path join dirname public upl
  • Java中字符串与byte数组之间的转换方法

    在Java编程中 我们常常需要对字符串和byte数组进行转换 字符串一般是用来表示文本信息 而byte数组则是用来表示二进制数据 如图片 音频等 本文将详细介绍Java中字符串和byte数组之间的转换方法 包括将字符串转换为byte数组和将
  • Failed to find Build Tools revision 27.0.3

    因为电脑系统的问题 导致运行一下Android Studio整个8G的电脑内存都给吃没了 索性又重装了下电脑 重新安装了下Android Studio 错误信息 11 44 Gradle sync failed Failed to find
  • @Value值注入及配置文件组件扫描方式

    spring配置文件对应的是父容器 springMVC配置文件产生的是子容器 前者一般配置数据源 事务 注解等 当然还可以进一步将一些配置细化到其他xml中 后者一般配置控制层相关的 如静态资源 视图解析器等 系统启动的时候 先初始化父容器