Spring PropertyPlaceholderConfigurer with Velocity

http://thinkwrap.wordpress.com/2008/02/25/spring-propertyplaceholderconfigurer-with-velocity/

1   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
2        <property name="username" value="some_user"/>
3        <property name="password" value="secret"/>
4    </bean>


can be written as

01   <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
02        <property name="locations">
03            <list>
04                <value>WEB-INF/mail.properties</value>
05                <value>WEB-INF/jdbc.properties</value>
06            </list>
07        </property>
08    </bean>
09  
10      
11   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
12        <property name="username" value="${jdbc.username}"/>
13        <property name="password" value="${jdbc.password}"/>
14    </bean>
15  
16  


and (in jdbc.properties)

1jdbc.username=some_user
2jdbc.password=secret

If you are using in the same project Velocity and want to utilize the VTL macros inside the configured values, the approach above will not work, because PropertyPlaceholderConfigurer will try to replace ALL macros in form ${something} with a value from property file – and throw exception if not found.The solution is easy: you need to switch the prefix of the PropertyPlaceholderConfigurer to something else than the default ${ and avoid conflict wih Velocity. The modified configuration could look like:

01   
02      
03    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
04        <property name="placeholderPrefix" value="#{"/>
05        <property name="locations">
06            <list>
07                <value>WEB-INF/mail.properties</value>
08                <value>WEB-INF/jdbc.properties</value>
09            </list>
10        </property>
11    </bean>
12     
13    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
14        <property name="username" value="#{jdbc.username}"/>
15        <property name="password" value="#{jdbc.password}"/>
16    </bean>
17  

18

  

 
===============

1.Spring的框架中,org.springframework.beans.factory.config.PropertyPlaceholderConfigurer类可以将.properties(key/value形式)文件中一些动态设定的值(value),在XML中替换为占位该键($key$)的值,.properties文件可以根据客户需求,自定义一些相关的参数,这样的设计可提供程序的灵活性。

2.在Spring中,使用PropertyPlaceholderConfigurer可以在XML配置文件中加入外部属性文件,当然也可以指定外部文件的编码,如: 
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location"> 
      <value>conf/sqlmap/jdbc.properties</value> 
    </property> 
     <property name="fileEncoding"> 
       <value>UTF-8</value> 
     </property> 
</bean> 
当然也可以引入多个属性文件,如: 
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
   <property name="locations"> 
    <list> 
     <value>/WEB-INF/mail.properties</value>    
     <value>classpath: conf/sqlmap/jdbc.properties</value>//注意这两种value值的写法 
    </list> 
   </property> 
</bean> 

基本的使用方法是: 

Xml代码 
<bean id="propertyConfigurerForAnalysis" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location"> 
        <value>classpath:/spring/include/dbQuery.properties</value> 
    </property> 
    <property name="fileEncoding"> 
       <value>UTF-8</value> 
     </property> 

</bean> 

其中classpath是引用src目录下的文件写法。 



当存在多个Properties文件时,配置就需使用locations了: 

Xml代码 
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
       <list> 
          <value>classpath:/spring/include/jdbc-parms.properties</value> 
          <value>classpath:/spring/include/base-config.properties</value> 
          <value>classpath*:config/jdbc.properties</value> 
        </list> 
    </property> 
</bean> 



接下来我们要使用多个PropertyPlaceholderConfigurer来分散配置,达到整合多工程下的多个分散的Properties文件,其配置如下 
Xml代码 

<bean id="propertyConfigurerForProject1" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="order" value="1" /> 
    <property name="ignoreUnresolvablePlaceholders" value="true" /> 
    <property name="location"> 
       <value>classpath:/spring/include/dbQuery.properties</value> 
    </property> 
</bean> 



Xml代码 

<bean id="propertyConfigurerForProject2" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="order" value="2" /> 
    <property name="ignoreUnresolvablePlaceholders" value="true" /> 
    <property name="locations"> 
      <list> 
        <value>classpath:/spring/include/jdbc-parms.properties</value> 
        <value>classpath:/spring/include/base-config.properties</value> 
      </list> 
    </property> 
</bean> 其中order属性代表其加载顺序,而ignoreUnresolvablePlaceholders为是否忽略不可解析的Placeholder,如配置了多个PropertyPlaceholderConfigurer,则需设置为true 



3.譬如,jdbc.properties的内容为: 
jdbc.driverClassName=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://localhost/mysqldb?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=round; 
jdbc.username=root 
jdbc.password=123456 

4.那么在spring配置文件中,我们就可以这样写: 
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
   <property name="locations"> 
    <list> 
     <value>classpath: conf/sqlmap/jdbc.properties </value> 
    </list> 
   </property> 
</bean> 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
   <property name="driverClassName" value="${jdbc.driverClassName}" /> 
   <property name="url" value="${jdbc.url}" /> 
   <property name="username" value="${jdbc.username}" /> 
   <property name="password" value="${jdbc.password}" /> 
</bean> 


5.这样,一个简单的数据源就设置完毕了。可以看出:PropertyPlaceholderConfigurer起的作用就是将占位符指向的数据库配置信息放在bean中定义的工具。 




Java代码   收藏代码
  1. <!-- dataSource -->  
  2. <bean id="dataSource"  
  3.    class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  4.    <property name="driverClassName"  
  5.     value="${jdbc.driverClassName}" />  
  6.    <property name="url" value="${jdbc.url}" />  
  7.    <property name="username" value="${jdbc.username}" />  
  8.    <property name="password" value="${jdbc.password}" />  
  9. </bean>  
  10. <!-- sessionFactory -->  
  11. <bean id="sessionFactory"  
  12.    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  13.    <property name="dataSource" ref="dataSource" />  
  14.    <property name="mappingResources">  
  15.     <list>  
  16.      <value>cn/xg/hibernate/spring/User.hbm.xml</value><!--这里的映射路径问题,这种方法只能一个一个加-->  
  17.      <value>cn/xg/hibernate/spring/Group.hbm.xml</value>  
  18.     </list>  
  19.     <!-- 加载一个路径下的*.hbm.xml文件方法:  
  20.      <property name="mappingDirectoryLocations">  
  21.      <list>  
  22.      <value>classpath:/cn/xg/spring/model</value>  
  23.      </list>  
  24.      </property>  
  25.     -->  
  26.    </property>  
  27.    <property name="hibernateProperties">  
  28.     <props>  
  29.      <prop key="hibernate.dialect">  
  30.       ${hibernate.dialect}  
  31.      </prop>  
  32.      <prop key="hibernate.show_sql">true</prop>  
  33.     </props>  
  34.    </property>  
  35. </bean>  
  36. <!-- DAO实现类extends HibernateDaoSupport,注入sessionFactory -->  
  37. <bean id="userMgrImpl" class="cn.xg.hibernate.spring.UserMgrImpl">  
  38.    <property name="sessionFactory" ref="sessionFactory" />  
  39. </bean>  
  40.   
  41. <bean id="groupMgrImpl"  
  42.    class="cn.xg.hibernate.spring.GroupMgrImpl">  
  43.    <property name="sessionFactory" ref="sessionFactory" />  
  44.    <property name="userImpl" ref="userMgrImpl"/>  
  45.    <property name="transactionTemplate" ref="transactionTemplate"/>  
  46. </bean>  
  47. <!-- 事务管理 -->  
  48. <bean id="transactionManager"  
  49.    class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  50.    <property name="sessionFactory" ref="sessionFactory" />  
  51. </bean>  
  52. <!-- 编程式事务的写法 :向Dao实现类中注入transactionTemplate,调动其execute()方法,接口回调new TransactionCallback()-->  
  53. <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">  
  54.    <property name="transactionManager" ref="transactionManager"/>  
  55. </bean>  
  56.   
  57.   
  58. <!-- 声时式事务第一种写法 -->  
  59. <!--  
  60.    <bean id="groupMgr"  
  61.    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
  62.    <property name="transactionManager" ref="transactionManager" />  
  63.    <property name="target" ref="groupMgrImpl" />  
  64.    <property name="transactionAttributes">  
  65.    <props>  
  66.    <prop key="add*">PROPAGATION_REQUIRED</prop>  
  67.    <prop key="get*">PROPAGATION_REQUIRED</prop>  
  68.    <prop key="*">readOnly</prop>  
  69.    </props>  
  70.    </property>  
  71.    </bean>  
  72. -->   
  73. <!-- 声时式事务第二种写法 -->  
  74. <!-- 事务的传播特性  
  75.   
  76. <tx:advice id="txAdvice">  
  77.    <tx:attributes>  
  78.     <tx:method name="add*" propagation="REQUIRED" />  
  79.     <tx:method name="get*" propagation="REQUIRED" />  
  80.     <tx:method name="*" read-only="true" />  
  81.    </tx:attributes>  
  82. </tx:advice>  
  83. <aop:config>  
  84.    <aop:advisor pointcut="execution(* cn.xg.hibernate.spring.*.*(..))"  
  85.     advice-ref="txAdvice" />  
  86. </aop:config>  
  87. -->  
  88.   
  89. </beans>  
  90.   
  91. jdbc.properties  
  92.   
  93. jdbc.driverClassName=com.mysql.jdbc.Driver  
  94. jdbc.url=jdbc:mysql://localhost:3306/数据库名  
  95. jdbc.username=数据库用户名  
  96. jdbc.password=数据库密码  
  97. hibernate.dialect=org.hibernate.dialect.MySQLDialect(方言.这里是MySql)  



参考文章: 
http://hi.baidu.com/seashell752/blog/item/2764310e2f35f2e137d1225f.html 
http://hi.baidu.com/suny_duan/blog/item/e8e9b2a5f31d5efc9052ee8b.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值