spring配置文件<import>标签中使用${}占位符获得配置文件的属性值

一般情况下我们在Spring的配置文件中使用<import>标签是这样的,<import resource="spring-other.xml">,但是最近项目中使用到其他工程的依赖jar包,在自己的spring配置文件中需要这样写

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

<import resource="classpath:spring-fs-db-${env}.xml" />

其中env的值是从eoa_config.properties里面获取。

如果是以上这种写法,在启动时spring报错,无法解析env,原因很简单,在import动作时在属性文件加载之前。

没办法只能翻spring源码,ContextLoader

protected void configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac, ServletContext sc) {

if (ObjectUtils.identityToString(wac).equals(wac.getId())) {

// The application context id is still set to its original default value

// -> assign a more useful id based on available information

String idParam = sc.getInitParameter(CONTEXT_ID_PARAM);

if (idParam != null) {

wac.setId(idParam);

}

else {

// Generate default id...

wac.setId(ConfigurableWebApplicationContext.APPLICATION_CONTEXT_ID_PREFIX +

ObjectUtils.getDisplayString(sc.getContextPath()));

}

}

wac.setServletContext(sc);

String configLocationParam = sc.getInitParameter(CONFIG_LOCATION_PARAM);

if (configLocationParam != null) {

wac.setConfigLocation(configLocationParam);

}

// The wac environment‘s #initPropertySources will be called in any case when the context

// is refreshed; do it eagerly here to ensure servlet property sources are in place for

// use in any post-processing or initialization that occurs below prior to #refresh

ConfigurableEnvironment env = wac.getEnvironment();

if (env instanceof ConfigurableWebEnvironment) {

((ConfigurableWebEnvironment) env).initPropertySources(sc, null);

}

customizeContext(sc, wac);

wac.refresh();

}

initPropertySources这个方法可以自己定义属性文件的加载时机。

@Override

public void initPropertySources(ServletContext servletContext, ServletConfig servletConfig) {

WebApplicationContextUtils.initServletPropertySources(getPropertySources(), servletContext, servletConfig);

}

也就是说我们需要在getPropertySources()方法调用之前,就已经做好属性文件的加载顺序。

spring提供了ApplicationContextInitializer这个接口,实现该接口

public class CustomerApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>{

private static Logger logger = LoggerFactory.getLogger(CustomerApplicationContextInitializer.class);

@Override

public void initialize(ConfigurableApplicationContext applicationContext) {

ResourcePropertySource propertySource = null;

try {

propertySource = new ResourcePropertySource("classpath:eoa/eoa_config.properties");

} catch (IOException e) {

logger.error("eoa_config.properties is not exists");

}

applicationContext.getEnvironment().getPropertySources().addFirst(propertySource);

}

}

此外,还需要在web.xml中配置这个类

<context-param>

<param-name>contextInitializerClasses</param-name>

<param-value>com.lfex.eoa.base.CustomerApplicationContextInitializer</param-value>

</context-param>

因为在customizeContext(sc, wac);会调用所有的contextInitializerClasses中的initialize方法。

至此,问题解决了,总结一下分为以下几步

  1. 提供实现ApplicationContextInitializer接口的实现类
  2. 在web.xml中配置,见上
  3. 在spring的主配置文件中使用<import resource="spring-${env}.xml">
时间: 2024-10-10 01:11:03

spring配置文件<import>标签中使用${}占位符获得配置文件的属性值的相关文章

配置文件或者模板中的占位符替换工具类

有时候.非常多文本存入数据库或者文件里,某些变量或者模板中会存在占位符的情况,然而每次读取,一个个去字符串.replace去替换就非常麻烦,于是写个占位符替换工具类 详细代码: import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 配置文件或模板中的占位符替换工具类 * Date: 15-5-8 * Time: 下午4:12 */

Java C# C语言中的占位符

一般拼接一段字符串在编程中是很常见的事,下面简单做个总结: 什么是占位符?占位符就是先占住一个固定的位置,等着你再往里面添加内容的符号. 1.Java中处理方法: package com.amos; import java.text.MessageFormat; /** * Created by amosli on 14-7-24. */ public class Test { public static void main(String args[]) { //拼接一段string 常用的方法

boost在lambda表达式中调用占位符参数的成员函数的方法

boost中提供了lambda表达式的用法,但是lambda表达式的功能还不是很强大,在其中只能对lambda的占位符参数_1等使用最基本的操作符,如+-*/,可是很多时候如果传入的占位符参数是一个对象指针的话,我们可能想要调用这个类的成员函数. 我在开发中遇到了这个问题,需要在stl的算法中传入一个函数来调用对象的比较函数,因为感觉这样太麻烦,还需要重新定义一个函数,所以想起了lambda表达式,c++11的lambda表达式我倒是没试过,可是受项目开发环境所限,只能选择boost.但是我用的

Android字符串中使用占位符

一是可以通过Java的 String.format(String format, Object... args) 方法来实现 二则是通过Android自带的 getResources().getString(int id, Object... formatArgs) 实现 占位符的语法可以参考Java文档 简单演示下第二种方法 strings.xml 1 <string name="boolean_conversion">Boolean: %1$b\n</string

SpringMVC(七) RequestMapping 路径中带占位符的URL

使用方法:在@RequestMapping("/delete/{id}")中,通过{id}带入pathvariable,然后在方法中,通过@PathVariable("变量名称") Iteger id 的方式引入占位符. 控制器代码: package com.tiekui.springmvc.handlers; import org.springframework.stereotype.Controller; import org.springframework.w

c++11模拟boost中元占位符

准备实现meta programming的fold函数,发现自己缺少占位符实现,这样传入fold的transform op类(元函数)都不得不另外写个外覆类,其实我觉得没啥不好,简单直接,说实话干扰什么的没那么严重,一个功能块里能用fold的地方能有几次?但动了占位符这个念头,就想尝试实现一下. 看一下实际情景: template<typename TList, typename Init, class TransformOp> struct fold_s {}; 我们可能会希望把push_b

SQl语句中使用占位符的优点

1.增加SQL代码可读性2.占位符可以预先编译,提高执行效率3.防止SQL注入4用占位符的目的是绑定变量,这样可以减少数据SQL的硬解析,所以执行效率会提高不少 绑定变量是Oracle解决硬解析的首要利器,能解决OLTP系统中library cache的过度耗用以提高性能 绑定变量是Oracle解决硬解析的首要利器,能解决OLTP系统中library cache的过度耗用以提高性能.然刀子磨的太快,使起来锋利,却容易折断.凡事皆有利弊二性,因地制宜,因时制宜,全在如何权衡而已.本文讲述了绑定变量

1.6 文件依赖中的占位符的用法

结构:~/blog/user/common/1.0.0/common.js (id: 'user/common:1.0.0');~/blog/user/art/1.0.0/art.js (id: 'user/art:1.0.0'); ~/blog/user/art/1.0.0/exports/add.js(id: 'user/art:1.0.0/add'); art.js中依赖common.js的写法 var common = require('$family/common/1.0.0'); 要

hibernate查询语句hql中的占位符?参数与命名参数:name设值方式搞混

先贴出异常 Struts has detected an unhandled exception: Messages: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1 File: org/hibernate/engine/query/spi/ParameterMetadata.java Stacktraces org.h