Spring加载多个配置文件的注意事项

在进行 Java Web 项目开发时,不可避免的会使用到数据库,这时就需要配置一系列的数据库连接参数。通常情况下,我们会将数据库连接参数写入 .properties 的配置文件中,以减小这些参数和代码之间的耦合度,在程序运行时将其加载,读取其中的参数。
在 Spring 框架中,我们可以通过多种方式将如下的配置文件导入到项目中。

druid.driverClassName=com.mysql.jdbc.Driver
druid.url=jdbc:mysql://127.0.0.1:3306/test
druid.username=root
druid.password=1234

这里就针对最常用的方式进行介绍:使用 context:property-placeholder 标签实现配置文件加载。
这种通过在 Spring 的 applicationContext.xml 文件中添加标签的方式最为常用:

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

这样 /src/main/resources/jdbc.properties 文件就会被 Spring 加载,然后通过如下方式配置连接池对象:

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="${druid.driverClassName}"/>
    <property name="url" value="${druid.url}"/>
    <property name="username" value="${druid.username}"/>
    <property name="password" value="${druid.password}"/>
</bean>

其中,${} 中的内容和配置文件的键名保持一致,这样就可以将其中的数据读取到连接池对象中,从而创建连接池对象。

这里有一些额外的事项需要注意,Spring容器采用反射扫描的发现机制,在探测到 Spring 容器中有一个 PropertyPlaceholderConfigurer 的 Bean 就会停止对剩余PropertyPlaceholderConfigurer 的扫描。因此当你的项目中有两个配置文件需要加载,或者两个存在配置文件的独立模块合并时,其中一个配置文件就会无法加载,从而导致项目报错。

org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'dataSource' defined in class path resource [applicationContext.xml]: Could not resolve placeholder 'driverClassName' in value "${driverClassName}"; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'driverClassName' in value "${driverClassName}"
...
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'driverClassName' in value "${driverClassName}"
...

下面就列出几种常用的方式解决以上异常:

  1. 使用通配符
<context:property-placeholder location="classpath*:*.properties"/>
  1. 在每个标签内部增加 ignore-unresolvable=“true” 属性
<context:property-placeholder location="classpath:druid.properties" ignore-unresolvable="true"/>
<context:property-placeholder location="classpath:jedis.properties" ignore-unresolvable="true"/>
  1. 使用 , 将多个配置文件分隔开
<context:property-placeholder location="classpath:druid.properties,classpath:jedis.properties" />
  1. 如果使用注解方式导入多个配置文件,可按如下方式
@PropertySource({"classpath:druid.properties","classpath:jedis.properties"})
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值