spring placeholderConfig的问题

swoky 2010-07-12 03:00:38
项目中用到spring框架,我用placeholderConfig读取了一个properties文件

<bean id="placeholderConfig"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location"
value="classpath:com/xxxx/yyy/init.properties">
</property>
</bean>


这样我可以在其它配置文件中用${key}来取到init.properties里面的值
现在我想在一个java代码(当然都是同一个web工程)中去取其中的某个key所对应的value,该怎么去取呢,我之前想过再去加载一次init.properties文件,但是即然spring己经加载了,有没有办法取到呢,我试了System.getProperty(key)不行,或者spring有没能其它类似的东西可以做到?
...全文
347 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
horsespring6002 2012-12-03
  • 打赏
  • 举报
回复
新建一个JavaBean类,将init.properties中的所有key作为这个类的属性,在Spring的applicationContext.xml中构造这个JavaBean,在所有的value标签中使用${key}的方式写入。这样,只要得到被Spring管理的这个JavaBean类的对象,就可以通过getXXX()方法取得值。
tangwei328121691 2010-10-30
  • 打赏
  • 举报
回复
你先把propertics里面的值注入到java类里面,也就是用 < property name="taskcode" value="${TJ.TaskCode}"/>
然后到你的指定的java类中将 taskcode 属性get,set方法就可以拿到啦!
swoky 2010-07-14
  • 打赏
  • 举报
回复
试了下closewbq提到的方法可行,但是有个不好的地方就是如果值特别多的话会有点麻烦
后来改了下,现在的解决办法是写一个extends自PropertyPlaceholderConfigurer的类,override其processProperties方法

protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props)
throws BeansException {
//相当于把TJTaskCode放在这里赋值
Set<Entry<Object, Object>> eles = props.entrySet();
for (Entry<Object, Object> entry : eles) {
System.setProperty(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
}
super.processProperties(beanFactoryToProcess, props);
}


这样其它地方也可以用了,并且不用

  < bean id="tjtaskcode" class="TJTaskCode">

  < property name="taskcode" value="${TJ.TaskCode}"/>

  < /bean>

去显示的指定要哪些属性
zhaoyongqiangri 2010-07-14
  • 打赏
  • 举报
回复
LZ是高手啊

要我做也只能用两种方法了
一:重载spring的PropertyPlaceholderConfigurer类读取配置文件的方法
二:用自己的方法去读取配置文件(呵 呵,这还是重新去加载配置文件,不是你想要的)
amos1989 2010-07-13
  • 打赏
  • 举报
回复
一般我们是这样配置的..

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:config/jdbc.properties</value>
<value>classpath*:config/hibernate.properties</value>
<value>classpath*:config/uamsHibernate.properties</value>
<value>classpath*:config/uamsJdbc.properties</value>
</list>
</property>
</bean>

closewbq 2010-07-13
  • 打赏
  • 举报
回复
楼主的意思是。spring已经加载了资源文件。程序里如果直接获取资源文件里面的值。
ouyangxiaokang6 2010-07-13
  • 打赏
  • 举报
回复
不知道你是这个意思不?
<bean id="aaa">
<constructor-arg
value="bbbbb" />
</bean>

1.首先用ConfigurableListableBeanFactory beanFactory拿到定义的bean的名字:

String[] beanNames = beanFactory.getBeanDefinitionNames();


2. 一层一层的去取,最终得到value

for (String beanName : beanNames) {
BeanDefinition bd = beanFactory.getBeanDefinition(beanName);
ConstructorArgumentValues cavs = bd.getConstructorArgumentValues();
List lst = cavs.getGenericArgumentValues();
Iterator it = lst.iterator();
while (it.hasNext()) {
ValueHolder vh = (ValueHolder) it.next();
TypedStringValue tsv = (TypedStringValue) vh.getValue();
System.out.println(tsv.getValue());//输出bbbbb
}
}

closewbq 2010-07-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 swoky 的回复:]
谢谢大家的回复,不过上面两位的答案有点让我怀疑自己的表达能力了,继续期待...
[/Quote]
http://hi.baidu.com/wuyeweiming/blog/item/179381fb8bcf4a1e6c22eb5f.html
从网上看了看,大部分都是通过构建了一个新的类。来对应存放资源文件中的值。
swoky 2010-07-13
  • 打赏
  • 举报
回复
谢谢大家的回复,不过上面两位的答案有点让我怀疑自己的表达能力了,继续期待...
simaa0106 2010-07-12
  • 打赏
  • 举报
回复

<sqlMapConfig>
<properties resource="com/xxxx/yyy/init.properties"/>
<typeAlias alias="order" type="testdomain.Order"/>
<!-- JDBC -->
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property value="${MyDriver}" name="JDBC.Driver"/>
<property value="${MyDriver}" name="JDBC.ConnectionURL"/>
<property value="${MyDriver}" name="JDBC.Username"/>
<property value="${MyDriver}" name="JDBC.Password"/>
<property name="JDBC.DefaultAutoCommit" value="true" />
</dataSource>
</transactionManager>

像这样?
2010-07-12
  • 打赏
  • 举报
回复
路过,帮顶。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧