1.原始做法: spring xml配置文件,参数直接混合配置
如下
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="org.postgresql.Driver" /> <property name="url" value="jdbc:postgresql://127.0.0.1/feilong" /> <property name="username" value="feilong_prod" /> <property name="password"><value><![CDATA[feilong]]></value></property> <property name="maxActive" value="700" /> <property name="maxIdle" value="20" /> <property name="maxWait" value="3000" /> </bean>
缺点:参数和bean混在一起,不利于查找编辑发布
2.稍微改进,使用context:property-placeholder
新建 dataSource.properties
######################### dataSource info################################### dataSource.driverClassName=org.postgresql.Driver dataSource.url=jdbc:postgresql://10.8.12.207/db_converse dataSource.username=user_converse dataSource.password=user_converse1234 dataSource.maxActive=80 dataSource.maxIdle=20 dataSource.maxWait=3000
<context:property-placeholder location="classpath*:config/datasource.properties" /> <!--dataSource --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${dataSource.driverClassName}" /> <property name="url" value="${dataSource.url}" /> <property name="username" value="${dataSource.username}" /> <property name="password" value="${dataSource.password}" /> <property name="maxActive" value="${dataSource.maxActive}" /> <property name="maxIdle" value="${dataSource.maxIdle}" /> <property name="maxWait" value="${dataSource.maxWait}" /> </bean>
缺点:这个问题困扰我很久,
就是,如果我有的bean 不需要外部参数配置,就想使用 ${} 这样的符号
比如
<bean id="Sku.findSkuRelationByCategory" class="loxia.dao.support.DynamicQueryHolder"> <constructor-arg> <value> <![CDATA[select r.sku_id as sku_id, r.sku_category_id as sku_category_id from t_ma_sc_sku_relation r where r.sku_id in(#foreach($num in [1..$skuCount]) #if($num == 1) :s${num} #else ,:s${num} #end #end) and r.sku_category_id in(#foreach($num in [1..$categoryCount]) #if($num == 1) :c${num} #else ,:c${num} #end #end) order by sku_category_id]]> </value> </constructor-arg> </bean>
在stackoverflow上面,国外的朋友给我解答,虽然我的英文很烂,但是外国人看懂了,开心http://stackoverflow.com/questions/10257448/contextproperty-placeholder-is-a-good-thing-but-i-do-not-want-some-bean-config
解决方案:
1).context:property-placeholder使用placeholderPrefix和placeholderSuffix属性
以前不知道这个属性,长见识了,这个方案不错,如果你的spring是3.0以下的话,使用这个
2).不使用外部参数,但要用$符号的bean,可以使用SPEL 转义#{'$'}num}
这个方案可以解决问题,但是比较坑爹,我有很多这样的sql,都需要人工转义,太麻烦,抛弃
3.使用SPEL和Util标签配置spring xml参数
SPEL 是spring 3.0新的特性
<util:properties id="p_dataSource" location="classpath:config/dataSource.properties"></util:properties>
<!--dataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="#{p_dataSource['dataSource.driverClassName']}" />
<property name="url" value="#{p_dataSource['dataSource.url']}" />
<property name="username" value="#{p_dataSource['dataSource.username']}" />
<property name="password" value="#{p_dataSource['dataSource.password']}" />
<property name="maxActive" value="#{p_dataSource['dataSource.maxActive']}" />
<property name="maxIdle" value="#{p_dataSource['dataSource.maxIdle']}" />
<property name="maxWait" value="#{p_dataSource['dataSource.maxWait']}" />
</bean>
注意:不能配置成#{p_dataSource.dataSource.maxIdle},读不到这个属性,需要用 [] 方括号括起来